こちらは Redmine Advent Calendar 2018 24日目の記事になります。
この記事ではRedmineとGitを連携させる基本的な方法を紹介します。
Linuxの基本操作になります。
##シナリオ
ネットワーク上に構築されたRedmineがありその「/var/git」以下等へGitリポジトリが配置されている。
Redmineのメンバーに対して自分の所属しているプロジェクトのGitリポジトリ以外は変更できないようにする。
ただし所属していないプロジェクトのリポジトリの取得は可能。
また外部のGitエクスプローラーを利用するときはRedmine側のGitリポジトリからhook処理で同期を行う。
###記事で利用した検証環境
- CentOS7
- Redmine 3.4系
- Gitはyumコマンドでインスール
- Redmineは Redmine 3.4をCentOS 7.3にインストールする手順 | Redmine.JP Blog を参考にインストール
##Redmineの設定
###外部リポジトリブラウザとの連携設定
ここではリポジトリブラウザにGitHubを利用する場合を想定します。
- 「 /home/git 」を作成する
- 「 /home/git/.ssh 」へSSHペア鍵を作成する
- 作成した公開鍵をGitHubアカウントへ登録する
- 「 /gitdir/repo/hooks/post-update 」を作成する
###post-updateの内容
リポジトリがpushを受け取ると連携先のGitHubリポジトリが更新される
#!/bin/sh
#################################################
######## change variables
#################################################
GITHUB_REPO_NAME=my-some-repo
GIT_REPO_DIR=path/to/my/repo
WORKING_DIR=${GITHUB_REPO_NAME}-github
#################################################
#################################################
# ワーキングディレクトリを初期化する
rm -rf $HOME/${WORKING_DIR}
# リポジトリを取得する
git clone --mirror /var/git/${GIT_REPO_DIR} $HOME/${WORKING_DIR}
# Githubへ更新されたリポジトリをpushする
sh -c "cd $HOME/${WORKING_DIR}; git remote set-url origin git@github.com:gituser/${GITHUB_REPO_NAME}.git"
sh -c "cd $HOME/${WORKING_DIR}; git push --mirror"
# ワーキングディレクトリを初期化する
rm -rf $HOME/${WORKING_DIR}
###GitHubのPull Requestについて
CircleCI、Travis CI等のCIツールとGitHubが連携している場合、PR(pull request)でCIを回すのは難しくなります。と言うのもRedmineとGitHub両方でPRを書く必要が出てくるためです。
なのでRedmine側でPR処理を行う必要があります。具体的にはチケットのステータスを適宜変更する事で対応出来ると思います。
GitHubと紐づいているCIツールに関してはgit pushで毎回CIが回る状態になっているのが望ましいです。
###プロジェクトに紐づいたリポジトリの設定
- 各プロジェクトごとにgroupを作成する
- プロジェクトに紐ついているGitリポジトリの所有者を「git:repogroup」へ変更する
##ユーザーの設定
- Redmineが稼働しているシステムでRedmineへ登録されているユーザー名等でLinuxユーザーを作成する
- Redmineが稼働しているシステムでプロジェクトに紐づいたgroupにユーザーを登録する
- Redmineが稼働しているシステムで各ユーザーのシェルを git-shell へ変更する
- Redmineが稼働しているシステムで各ユーザーの 「 /home/user/.ssh/authorized_keys 」へユーザーの端末の公開鍵を登録する
###git-shellの設定
git-shellはシステムにGitをインストールした時点で同時にインストールされます。ユーザーのシェルにgit-shellを指定するとgitコマンド以外は実行できないユーザーになります。
詳しくは Git - サーバーのセットアップ を参考にしてみてください。
##まとめ
各ユーザーへGitの操作権限を細かな設定を行う事でRedmineをよりセキュアに利用する事が出来ます。
例えばメンバーに初心者が含まれる場合は「/gitrepo/hooks」以下へ設定を書き込む事でより権限の弱い設定を適応する事が出来ます。開発初心者はmasterブランチへはpush出来ないようにする、などです。
また熟練した開発者にはより強い権限を与える事が可能です。担当しているプロジェクトのGitリポジトリを削除、作成等含め完全に操作できる等、です。
Gitだけで設定が完了する訳ではないため若干複雑になりがちですが自作のヘルパースクリプト等を用意しておくと比較的簡単に設定が可能になります。
GitHub、Gitlab等を利用すればこれらの設定はツールのGUIから可能になります。ですが 外部リポジトリブラウザの利用が制限されている環境 も少なくないと思われます。
そう言った環境下でRedmineとGitをセキュアに利用するひとつのアイディアと思っていただければと。