Mirror Bitbucket Server to gitolite
This is about how to mirror git repositories from Bitbucket Server to gitolite (read only).
What’s the matter?
This setup can be tremendously helpful if your Bitbucket Server is not reachable from a node where you want to deploy code via git. Or you need some sort of redundancy.
In this case gitolite has several advantages over another Bitbucket Server instance:
- super light weight
- therefor, a minimal footprint in terms of hardware resources
- easy to set up (if you know how)
- easy to maintain, very stable
- you don’t need a Bitbucket Data Center license
What’ required for this setup:
- a node with gitolite3 installed and setup. For this guide we assume the hostname is ‘gitolite’
- a node with Bitbucket Server installed and setup. We assume the hostname is ‘bitbucket’
- the Bitbucket Server plugin “External Hooks” (it is free), install as usual
- Bitbucket must be able to “talk to” gitolite via ssh (check your firewall)
I won’t cover the installation and the basic setup of Bitbucket, just the steps needed to establish the mirror link between Bitbucket and gitolite.
Prepare the sending side: Bitbucket Server
Bitbucket hosts the active git repository. Every change made here will be sent to gitolite.
Because we are going to connect via ssh to gitolite, it is necessary to setup an ssh key pair for Bitbucket.
# login as root # create the home directory for atlbitbucket: mkdir -p /home/atlbitbucket/.ssh chown -R atlbitbucket.atlbitbucket /home/atlbitbucket # become atlbitbucket su - atlbitbucket -s /bin/bash ssh-keygen -t rsa -C "server-bitbucket `date +%Y-%m`" -b 4096 -f ~/.ssh/server-bitbucket chmod 600 ~/.ssh/server-bitbucket
Next, tell Bitbucket how to connect to gitolite:
host gitolite user gitolite3 hostname gitolite.example.com port 22 identityfile /home/atlbitbucket/.ssh/server-bitbucket
Test the connection from Bitbucket to gitolite:
ssh gitolite info hello server-bitbucket, this is gitolite3@gitolite running gitolite3 3.6.4-1~bpo70+1 (Debian) on git 2.1.4
Create the mirror2gitolite script and place it into the proper directory (var/atlassian/application-data/bitbucket/external-hooks
)
#!/bin/bash /usr/bin/git push --mirror gitolite:${STASH_REPO_NAME}
In Bitbucket, activate the external hook for the repo(s) you want to mirror:
Prepare the receiving side: gitolite
Gitolite shall be the read-only mirror. It will receive every change made to the Bitbucket Server git repository.
It is necessary to enable the mirror functionality in gitolite. Login to your gitolite server node and edit /var/lib/gitolite3/gitolite.rc
.
[...] # List of commands and features to enable ENABLE => [ # COMMANDS # These are the commands enabled by default 'help', 'desc', 'info', 'perms', 'writable', # Uncomment or add new commands here. # 'create', # 'fork', 'mirror', # 'readme', # 'sskm', # 'D', [...] # system admin stuff # enable mirroring (don't forget to set the HOSTNAME too!) 'Mirroring', [...]
All the following steps will happen in your gitolite-admin repository on your workstation:
Copy the server-bitbucket.pub
ssh public key into you keydir
directory.
Now, edit gitolite.conf
(in your gitolite-admin repository) to create and configure the git repository in gitolite
[...] # mirrored from Bitbucket repo example-repo R = deploy option mirror.master = bitbucket option mirror.slaves = gitolite [...]
Commit and push your gitolite-admin repo.
Bring Bitbucket and gitolite together
Recap: what had to be done before:
- install the “External Hook” plugin for Bitbucket
- create the hook “mirror2gitolite” and activate it in your Bitbucket repository settings
- create a ssh key pair for Bitbucket: server-bitbucket
- enable mirroring in gitolite
- configure gitolite to accept connections from Bitbucket (ssh key pair server-bitbucket.pub) to our git repository
The next step is to do the initial sync.
If you want to initiate the first mirroring by hand, you can do like so:
- check where your git repository is located in the filesystem:
- make sure, the “External Hook” is activated for this repository in Bitbucket
- change into that directory and trigger the sync manually
# become the atlassian user on bitbucket server # su - atlbitbucket -s /bin/bash # cd into the correct repo (check via repository details) cd /var/atlassian/application-data/bitbucket/shared/data/repositories/4711 /usr/bin/git push --mirror gitolite:example-repo
If you don’t, the initial mirroring will occur with the first push to your Bitbucket Server repository.
- clone your repository from gitolite and check if everything is in sync