CentOS
Redmine
GitLab
nfs

RedmineとGitLabをNFSで連携させる

More than 3 years have passed since last update.

Redmineにはバージョン管理システムとの連携機能がありますが、Redmineはリモートのリポジトリにアクセスすることができないため、Redmineのサーバーの外にリポジトリがある場合、連携機能が使えません。

某所でリポジトリ管理をGitLabで行っているのですが、GitLabとRedmineがそれぞれ別のサーバーにあるため、上記の通りRedmineの連携機能が使えませんでした。

このままではいろいろと不便なので、NFSを使ってGitLabサーバー上のリポジトリをネットワーク越しにローカルファイルシステムにマウントするようにして、Redmineのバージョン管理システム連携を使えるようにしてみました。


GitLabサーバー側の準備


NFSの設定

NFSサーバーに必要なパッケージをインストールします。


パッケージのインストール

# yum install -y nfs-utils


/etc/exports の設定

/etc/exports にNFSで共有するディレクトリを設定します。

共有先は 192.168.0.205 (RedmineサーバーのプライベートIP)に限定します。

読み込みのみ許可(ro)、UID/GID を 501 に固定 (all_squash,anonuid=501,anongid=501) に設定します。

なお、UID は GitLab の実行ユーザ git の UID に合わせています。

/home/git/repositories は、GitLabが管理しているGitリポジトリが保存されているディレクトリです。

これを外部からマウントすれば、GitLabが持つGitリポジトリに直接アクセスすることが可能になります。


/etc/exports

/home/git/repositories 192.168.0.205/32(ro,sync,all_squash,anonuid=501,anongid=501)



/etc/sysconfig/nfs の設定

NFSは動的にリッスンポートを変えるため、ファイアウォールとの相性がよろしくない場合があります。

/etc/sysconfig/nfs を以下のように変更して、ポートを固定にします。


/etc/sysconfig/nfs

# TCP port rpc.lockd should listen on.

LOCKD_TCPPORT=32803

# UDP port rpc.lockd should listen on.
LOCKD_UDPPORT=32769

# Port rpc.mountd should listen on.
MOUNTD_PORT=892

# Port rpc.statd should listen on.
STATD_PORT=662



ファイアウォールの設定

NFSは複数のポートをリッスンするので、iptables の設定で以下のようにポートを開放しておく必要があります。

念のため、共有先のIPを制限しています。

# NFS (Redmineサーバに対してのみ共有)

# rpcbind/sunrpc
iptables -A INPUT -p tcp -s 192.168.0.205 --dport 111 -j ACCEPT
iptables -A INPUT -p udp -s 192.168.0.205 --dport 111 -j ACCEPT
# nfslock
iptables -A INPUT -p tcp -s 192.168.0.205 --dport 32803 -j ACCEPT
iptables -A INPUT -p udp -s 192.168.0.205 --dport 32769 -j ACCEPT
# mountd
iptables -A INPUT -p tcp -s 192.168.0.205 --dport 892 -j ACCEPT
iptables -A INPUT -p udp -s 192.168.0.205 --dport 892 -j ACCEPT
# statd
iptables -A INPUT -p tcp -s 192.168.0.205 --dport 662 -j ACCEPT
iptables -A INPUT -p udp -s 192.168.0.205 --dport 662 -j ACCEPT


Redmineサーバー側の準備


/etc/fstab の設定

マウントできるように、/etc/fstab に以下を追記します。


/etc/fstab

192.168.0.208:/home/git/repositories /gitlab-repos nfs   ro,nosuid,noexec,auto,nouser  0 0


192.168.0.208 はGitLabのプライベートIPです。

これを /gitlab-repos にマウントするようにしています。


ユーザーの設定

/gitlab-repos をマウントすると、すべてのファイル・ディレクトリがUID:501になっています。これはGitLabサーバーのユーザー git のUIDです。

RedmineサーバーでもUID:501でユーザー git を作成しておきます。GIDも同様です。

GID:501 にグループ git を割り当てたら、ユーザー redmine の補助グループにグループ git を追加します。

これでGitLabサーバーのリポジトリを、Redmineから読み込めるようになります。


Redmine での設定

Redmineでバージョン管理連携を有効にするには、プロジェクトの設定画面のリポジトリのパスに /gitlab-repos/<GitLab上のリポジトリのパス> を設定します。

あとは git commit -m "fixes #9999 @1.0h" などすれば、チケットのクローズや作業時間の記録がgitのコミット操作から可能になります。便利!


リポジトリの自動更新

何もしないとRedmineはメニューの「リポジトリ」のリンクを開くまで、リポジトリの情報を更新しません。

したがって、チケットのクローズや作業時間の記録をコミットログから行っても、リポジトリのリンクを開くまでは反映されません。

これはめんどくさいので、crontab に以下のコマンドを仕掛けて、15分おきに全リポジトリの更新情報を取得するようにしました。

*/15 * * * * curl -L 'http://redmine.example.com/sys/fetch_changesets?key=<RedmineのAPIキー>' > /dev/null

key パラメータはRedmineの管理設定→リポジトリから取得可能です。


まとめ


  • GitLabサーバーにNFSサーバーを設定しました

  • RedmineサーバーからGitLabのリポジトリをネットワーク経由でマウントできるようにしました

  • マウントしたNFSボリュームにRedmineがアクセスできるように設定し、バージョン管理連携機能が使えるようにしました

  • ついでにリポジトリの自動更新も設定しました


おわりに

NFSとかの設定は面倒なのでRedmineとGitLabは同じサーバーに入れとくのがベストプラクティスだと思いました。