はじめに
RedmineとGitLabのDockerイメージを連携させる方法としては、以下の記事のようにRedmine側にベアリポジトリを作ってWebHookでGitLabと同期するのが一般的だと思います。
ただ、この方法だとリポジトリ毎に個別に設定が必要で、特に初回のベアリポジトリのクローンはWeb UI上からの操作もできません。
そのためリポジトリ数が多かったり、サーバ管理者とGitLab/Redmineの管理者が分かれている場合に運用が面倒です。
そこで何とかGitLabのリポジトリデータを直接Redmineが参照できないか試してみました。
何が問題か
基本的にはGitLabのリポジトリが格納されたディレクトリをRedmineのDockerでボリュームマウントして参照すればいいはずです。
しかしGitLabのリポジトリはOwnerしかアクセスできず、その上GitLabとRedmineではDockerイメージの実行uidが異なるため、そのままでは権限がなく参照できません。
以下の記事では、Redmine/GitLabのDockerfileをそれぞれ改変し、共通のgidでリポジトリデータにアクセスするようにしていますが、筆者の方も書いているとおりDockerイメージを改変することになるのでいまいちです。
Docker でオフィシャルな GitLab イメージと Redmine イメージのコンテナを連携させる
というわけで、これと同じようなことをDockerイメージの改変なしにできればいい、ということになります。
bindfs
そこでbindfsを使います。bindfsはmount --bind
と同じようにディレクトリを別のディレクトリにマウントするコマンドですが、その際uid/gidやパーミッションを変更することができます。
つまりGitLabの実行uid(998)が所有しているリポジトリデータをRedmineのuid(1000)がOwnerであるかのようにマウントできるということです。
(uidの値は使用するDockerイメージによって違うかもしれません。適当に読み替えて下さい)
実行方法は以下のような感じです。
$ ls -l -d gitlab/data/git-data
drwx------. 4 998 root 73 8月 17 2016 gitlab/data/git-data
$ sudo bindfs -u 1000 gitlab/data/git-data redmine/data/git-data
$ ls -l -d redmine/data/git-data
drwx------. 4 1000 root 73 8月 17 2016 redmine/data/git-data
uid=998がOwnerだったgit-dataディレクトリがマウント先のredmine/data/git-dataではuid=1000がOwnerになっています。
bindfsの-u
オプションは下位ディレクトリ含めて全てのuidを指定された値に書き換えます。そのためgit-data以下のあるリポジトリは全てRedmineからアクセス可能になります。
正しくマウントできることが確認できたら/etc/fstab
に書いておきます。
Redmine側は読むだけなのでro
でマウントするのがいいでしょう。
/path-to-gitlab/data/git-data /path-to-redmine/data/git-data fuse.bindfs ro,force-user=1000 0 0
docker-compose.ymlなど
最後にdocker-composeのボリュームマウント設定などをまとめておきます。
ここでは以下のようなディレクトリ構成を想定します。
- gitlab/
- docker-compose.yml
- data/
- git-data/
- redmine/
- docker-compose.yml
- data/
- git-data/ (gitlab/data/git-dataをbindfsでマウント)
このときdocker-compose.ymlのボリュームマウント(関係するところだけ抜粋)は以下のようになります。
volumes:
- ./data:/var/opt/gitlab
volumes:
- ./data/git-data/repositories:/git:ro
これでRedmineのイメージからは/git
以下にベアリポジトリがあるように見えるので、RedmineのWeb UIから/git/test.git
などと指定するだけでOKです。