オレオレGitlabを構築して、外部のbareリポジトリと連携してみたのでその時のメモ。 (メール機能については除外)
状況
- 外部サーバーにGitのbareリポジトリがある
- 外部サーバーにGitlab立てたいけど色々あって却下された
- じゃあ社内ネットワークにGitlab立ててHookさせれば良いんじゃね?
- VagrantでVM立ててそこにGitlab立てよう
完成イメージ
環境
- ホストマシン:Mac OSX 10.9.3
- VM:Ubuntu12.04(64bit)
- Vagrant1.6.2
- Gitlab 6.8.2
UbuntuのVMを起動する
Gitlabが簡単にインストール出来るOmnibusが利用出来るUbuntu12.04(64bit)のVMを立てます。
まずはVagrantfileを用意。大切な箇所だけ抜粋。
# ubuntu12.04 64bitのBOXを予めインストール config.vm.box = "precise64" # 80ポートへのフォワード設定 config.vm.network "forwarded_port", guest: 80, host: 1234
起動させます。
$vagrant up
GitLabのインストール
まずはsshアクセスします。
$vagrant ssh
GitlabをVMにインストールします。 取得するGitLabのOmnibusの最新版は こちらで確認し、各自変更してください。
$wget https://downloads-packages.s3.amazonaws.com/ubuntu-12.04/gitlab_6.8.2-omnibus-1_amd64.deb $sudo dpkg -i gitlab_6.8.2-omnibus-1_amd64.deb $sudo gitlab-ctl reconfigure
インストールが終わったか、確認します。
$wget http://localhost:8080/
外部からのアクセスする際のURLを設定します。
$sudo vi /etc/gitlab/gitlab.rb external_url "http://localhost" $sudo chmod 600 /etc/gitlab/gitlab.rb
再度設定をします。
$sudo gitlab-ctl reconfigure
本例の場合、ブラウザからhttp://localhost:1234/でアクセスします。 実際に会社などで利用する場合には自身のマシンに設定されているIPアドレスでも接続出来るはずです。なお、その場合、gitlab.rbのexternal_urlもマシンに降られているIPアドレスを記述する必要があります。
最初のログインはID「root」、パスワード「5iveL!fe」と入力します。
bareリポジトリをGitLabにも追加する
本例では確認他の為にGithubを利用します。 まず、Githubに適当なプロジェクトを作成します。
その後、該当のプロジェクトのgit cloneする時のURLをメモします。
GitlabのNew ProjectでImport existing repository?を選択し、先ほどコピーしたURLにユーザー名とパスワードを設定して指定します。(https://username:password@gitlab.com/company/project.git. など)
上記によってGitLabにbareリポジトリを作成されます。
bareリポジトリは/var/opt/gitlab/git-data/repositories/{namespace}/配下に配置されています。
git configコマンドで確認すると以下のようになっており、originはGithubとなっている事が確認出来ます。
$cd /var/opt/gitlab/git-data/repositories/root/helloworld.git $git config -l core.repositoryformatversion=0 core.filemode=true core.bare=true remote.origin.url=https://username:password@github.com/toshihirock/Hello-World.git
Gitabへのpush時に取得元のリポジトリにもpushするようにする
Gitlabへのpushタイミングで取得元にもpushする為にHookスクリプトを利用します。
こちらは以下のサイトを参考にさせてもらいました。
まず、直接取得元へpushするユーザーが居る事もあると思うので、push時に取得元とGitLabとの間で同期を取るようにします。 この方法を実現する為に、pushの取り込み前に実行されるpre-receiveスクリプトを利用します。
$su git $cd hooks $touch pre-receive $chmod +x pre-receive $vi pre-receive
編集します。
#!/bin/bash echo "start pre-receive" git fetch origin 'refs/heads/*:refs/heads/*' echo "end pre-receive"
これで取得元の差分があれば取り込む事が出来ます。
また、post-updateスクリプトを利用してGitlabへのpushが完了したタイミングで、取得元にもpushするようにします。 post-receiveスクリプトといのもあるのですが、こちらは複数のブランチへのpushの際にも一度しか呼ばれないので、今回の用途ではブランチ毎に呼び出されるpost-updateスクリプトを利用します。
$touch post-update $chmod +x post-update $vi post-update
編集します。
#!/bin/bash echo "start post-update" BRANCH=$(git rev-parse --symbolic --abbrev-ref $1) git push origin ${BRANCH} echo "end post-update"
上記のようにすると変数BRANCHにpushしたブランチ名が入るので、対象のブランチを取得元にpushすることができます。 先ほどgit configで見たようにGitlabに作成されたbareリポジトリのoriginは取得元(本例だとGithub)となっているので上記のようにすることで取得元へのpushが出来ます。
Gitlabからのクローンを確認
Gitlabからクローン出来るか確認してみます。 ユーザー名、パスワードは置き換えて下さい。
$git clone http://username:password@localhost:1234/root/helloworld.git
Githubからのクローンとpush先の変更
Githubから対象のリポジトリをcloneします。
$git clone http://username:password@github.com/hogefuga.git
git remoteコマンドを利用してoriginの向き先をGitlabに変更します。
$git clone Github url $git remote set-url origin http://username:password@localhost:1234/root/helloworld.git
originの向き先がGitlabとなっている事を確認します。
$git config remote.origin.url
pushしてみる
ではcloneしてきたリポジトリを編集してGitlabにpushし、その後、Githubに反映されているか確認します。
$vi README $git add . $git commit -m "Github" $git push origin master Hello-World [master] git push origin master Counting objects: 5, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 262 bytes | 0 bytes/s, done. Total 3 (delta 1), reused 0 (delta 0) remote: start pre-receive remote: end pre-receive remote: start post-update remote: To https://username:password8@github.com/toshihirock/Hello-World.git remote: e9c6f5f..35d1433 master -> master remote: end post-update To http://username:password@localhost:1234/root/helloworld.git e9c6f5f..35d1433 master -> master
上記のようにHookスクリプトで標準出力される内容ははpush時に確認出来ます。(ユーザー名、パスワードは変更しています)
上記実施後、Githubでもpushしたコメントが反映されている事を確認できました。
また、上記の場合には取得元のパスワードがバレバレになるのでその場合にはpost-updateを以下に変更すれば出力がされないようになります。
git push origin ${BRANCH} >/dev/null 2>&1
本例ではhttpプロトコルで確認しましたが、sshプロトコルでも可能です。