GitBucketのインストール
社内のGitリポジトリの管理ツールが欲しかったので探していたのですが、GitBucketを使うと驚くほど簡単に運用することが出来ました。
release pageからgitbucket.warをダウンロードして、
java -jar gitbucket.war
で起動し、 http://www.example.com:8080
等にアクセスするだけです。初期ID,PWは共にrootです。
homeディレクトリの .gitbucket
ディレクトリに設定やリポジトリのデータが入ります。
GitBucketの自動起動
行儀が悪い気もするのですが /gitbucket
ディレクトリを作成してそこに gitbucket.war をコピーし、 /etc/rc.d/rc.local
に
java -jar /gitbucket/gitbucket.war --gitbucket.home=/gitbucket&
と追記しました。これで起動時に自動起動して、すべてのファイルを /gitbucket
ディレクトリ内で完結できます。
もう少しちゃんと自動起動する
Upstartがインストールされていれば、 /etc/init/gitbucket.conf
を作成して以下を記述します。
description "Gitbucket"
author "Yamada Nanigashi"
start on runlevel [2345]
stop on runlevel [016]
env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
exec java -jar /gitbucket/gitbucket.war --gitbucket.home=/gitbucket
これで再起動時に自動起動します。
自動的にWebサーバへファイルをデプロイする
GitHubやGitBucketは「WebHook」という仕組みを使うと、プッシュ時に特定のURLのプログラムを実行できるらしいので、そこにFTPを仕掛けてWebサーバにデプロイしてみます。
検索すればお目当てのものは見つかると思うのですが、今回は勉強がてら自作で。
<?php
$payload = json_decode($_REQUEST['payload']);
$url = $payload->repository->url;
$bare_path = parse_url($url, PHP_URL_PATH);
// ノンベアリポジトリが存在しないときはクローンする。
// 存在するときはプルする。
$b = preg_replace('|/git|', '/gitbucket/repositories', $bare_path);
$nb = preg_replace('|/git|', '/gitbucket/nonbare', $bare_path);
$nb = preg_replace('/\.git$/', '', $nb);
if (!file_exists($nb)) {
`git clone $b $nb 2>&1`;
} else {
`cd $nb && git pull 2>&1`;
}
// lftpで送信
$host = 'hostname';
$user = 'username';
$pass = 'password';
$rdir = 'remotedirectory';
`lftp -u $user,$pass -e "mirror -Rv -X .git/ $nb/ $rdir; bye" $host 2>&1`;
POST変数payloadにリポジトリ情報が入ってくるので加工してlftpでミラーリングします。あんまり良く分かっていないので無駄が多いと思います。
こいつのURLをGitBucketのSettingsのService Hooksに仕掛けてやればOKです。
mirrorコマンドの -Rv
を -Rev
にすれば完全に同期が取れますが、危険なので十分にテストしてからのほうが良いでしょう。適当に作ってWebサーバのデータをすべてふっ飛ばしてしましました…