git の共有リポジトリを作ってステージング環境と連携させる

多数の開発者の方に使ってもらう git の共有リポジトリを Amazon Linux 上に作成して、そのリポジトリの内容をステージング環境 (Apache+PHP) に自動で反映するようにした時のメモ。

この記事のやりたい構成と前提事項はこんな感じです。
セキュリティ的に少々緩めな点が有るので気を付けてください。

shared_git_20160906

  • 開発者はリポジトリを作る Amazon Linux にて他の作業も行う為、OS ユーザーとしてアカウントを追加していきます。シェルも bash 利用を許可しています。
    (未確認ですが、たぶんシェルを git-shell にすればサーバーにログインはできないけど、リモートから git の利用をできるユーザーは作成できるはず…)
  • ステージング環境は /var/www/html に既に出来上がってて、git による管理対象のソースも既に置いてある状態です。
  • ステージング環境の権限の関係で、sudo による git コマンド実行許可を追加しています。同じ事するならそこは要 root です。

ステージング環境への反映は、共有リポジトリの hook スクリプトを用いて実現します。

公式サイトのドキュメント がしっかりしててステキでした。このドキュメントしっかり読めばこちらの記事の内容はほぼ網羅できます。

グループの追加

共有リポジトリにアクセスするユーザーが所属する、dev グループを OS に追加します。

groupadd -g 1000 dev

ユーザーの追加、またはグループへの追加

上記で追加したグループに所属するユーザーを追加します。

usermod -G 1000 hoge

リポジトリ作成

共有のリポジトリを /var/repos/yskw.git として作成します。
dev グループのユーザーで共有できるように chown もしておきます。

cd /var
mkdir -p repos/yskw.git
cd /var/repos/yskw.git

git init --bare --shared

chgrp -R dev /var/repos/yskw.git

ステージング環境のリポジトリ化

ステージング環境 ( /var/www/html ) をローカルリポジトリとして初期化し、ファイル登録を行います。

cd /var/www/html
git init --shared
git add .
git commit -m "Initial commit"

こちらも dev グループのユーザーが書き込みできるように権限を調整します。

chgrp -R dev /var/www/html
chmod -R g+w /var/www/html

共用リポジトリを origin の名前で登録しておきます。

cd /var/www/html
git remote add origin /var/repos/yskw.git

共用リポジトリに push

ステージング環境のファイルを共有リポジトリに登録します。

git push -u origin master

共有リポジトリからデータ取得してみる

任意のディレクトリに共有リポジトリから clone してみます。
ステージング環境と同じ環境ができる事を確認しておきます。

cd ~
git clone /var/repos/yskw.git

共有リポジトリとステージング環境の同期設定

記事冒頭に書いた通り、共有リポジトリの hook スクリプトで実現します。

具体的には、リポジトリに push された後に実行される post-receive スクリプトを設置します。

cd /var/repos/yskw.git/hooks
vi post-receive  # 新規作成

post-receive の内容はこんな感じ。

#!/bin/sh
cd /var/www/html/business
sudo /usr/bin/git --git-dir=.git pull origin master

作成したスクリプトの権限を調整。

chmod +x post-receive
chmod g+w post-receive

sudo の設定

フック時の git pull を root 権限で実行させる必要が有った為、sudo の設定を行います。

visudo -f /etc/sudoers.d/git-command  # 新規作成

dev グループのユーザーが root 権限で git pull をできるように設定を記述します。

## Git commands
Cmnd_Alias GIT_PULL = /usr/bin/git --git-dir=.git pull origin master

%dev ALL=(root) NOPASSWD: GIT_PULL

まとめ

hook スクリプトとそれにまつわる sudo の設定ができれば、後は公式ドキュメント通りなので結構簡単でした。

公式ドキュメントはそんなに量も無いし、何よりしっかり日本語なので、一通り目を通すことをオススメしておきます。