
ごきげんよう、じんぐうじです。
弊社内の、とあるGitLab.comを使うプロジェクトで、Redmineと連携させたいという要望がありました。
やりたいこととしては
「コミットログにRedmineのチケット番号を入れるとGitLabのWeb上でリンクしてほしい」
です。なるほどね。Issues使えばいいのに
ということで今回はGitLabとRedmineの統合をがんばっていきます。
画像多めです。
前提
- GitLabとRedmineにプロジェクトが存在している
- 今回内容を確認した環境はGitLab.com、及びLightSail上のRedmineです
リポジトリの同期
GitLab.com上のリポジトリを、Redmineインスタンスのローカルにあるbareリポジトリへ同期させます。
Deploy Key作成(Redmine側)
この辺はローカルでやるときと同じですね。
但し、注意点としてGitLabからfetchするユーザはRedmine(正確には今回の場合Passenger)のプロセスを実行するユーザとなります。
今回手順の確認に利用したLightSailのRedmineイメージではdaemon
ユーザがPassengerを動かしていたため、下記手順はdaemon
ユーザにて実施しています。
-
キーペア作成
# 意識高くed25519を使う ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_gitlab -N ""
-
~/.ssh/configにいい感じに書く
Host gitlab.com User git HostName gitlab.com IdentityFile ~/.ssh/id_ed25519_gitlab PasswordAuthentication no
Deploy KeyをGitLabのプロジェクトへ登録(GitLab側)
今回は単一プロジェクトのみ参照できればよかったので、デプロイキーで対応します。
GitLab and SSH keysに書いてある通りですね。
こんな雰囲気で諸々入力して、
こんな感じに表示されるはずです。
疎通確認(Redmine側)
GitLab側で登録が済んだら疎通確認をします。
こちらもRedmineの実行ユーザにて実施となります。
普通にsshで
ssh gitlab.com
とすると、初めてsshするのでAre you sure you want to continue connecting (yes/no)?
と聞かれるのでyes
と応答し、
Welcome to GitLab, @*********!
と表示されればログインできていることが確認できました。
The authenticity of host 'gitlab.com (35.231.145.151)' can't be established.
ECDSA key fingerprint is SHA256:*******************************************.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitlab.com,35.231.145.151' (ECDSA) to the list of known hosts.
PTY allocation request failed on channel 0
Welcome to GitLab, @*********!
Connection to gitlab.com closed.
gitlabからクローンしてローカルリポジトリを作成(Redmine側)
リポジトリを触れるようになったのでRedmine側のローカルにbareリポジトリを作成します。
ユーザ、グループ、パーミッション、pathは今回の環境に合わせたものとなっていますのでご注意ください。
sudo install -o bitnami -g daemon -m 0775 -d /var/repos
cd /var/repos
ローカルのGitリポジトリの操作もRedmineの実行ユーザにて実施しました。
作業は普通にbareリポジトリとしてcloneするだけです。
git clone --bare git@gitlab.com:*********/redmine-test.git
Cloning into bare repository 'redmine-test.git'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
プロジェクトでリポジトリの設定(Redmine側)
Redmine側でプロジェクトにリポジトリの設定をします。
ここはRedmineガイドのとおりですね。
プロジェクトのリポジトリ設定で新しいリポジトリ
をクリックし、
このような雰囲気で各項目を埋めていき、作成
をクリックします。識別子はWebhookのエンドポイントでも使用する文字列になります。
redmine_github_hook(Redmine側)
上記までだとGitLab側の更新がリアルタイムにRedmine側へ反映されません。
GitLab側のイベント(pushなど)発生時にWebhookを受け取り、そのタイミングでGitLabからfetchするようにpluginを導入します。
redmine_github_hookという名前ですがGitLabでも利用可能です。
# plugin用のGemfileを作って
mkdir -p /opt/bitnami/apps/redmine/htdocs/plugins/redmine_github_hook/
echo 'gem "redmine_github_hook"' >> /opt/bitnami/apps/redmine/htdocs/plugins/redmine_github_hook/Gemfile
cd /opt/bitnami/apps/redmine/htdocs/
# インストール
bundle config --local frozen "0"
bundle install
bundle config --local frozen "1"
# 再起動
touch /opt/bitnami/apps/redmine/htdocs/tmp/restart.txt
Redmineの管理画面内、プラグインのページに表示されれば完了です。
Webhookの設定(GitLab側)
GitLab側でリポジトリのイベント(push等)発生時にWebhookを行う設定をします。
プロジェクトのSettings
からIntegrations
を表示し、URLとトリガーとなるイベントを設定します。
URLはGitHub Hook Plugin
により提供されるRedmine側のエンドポイントとなります。project_id
パラメータはRedmineでのリポジトリの識別子です。
今回の例では、
- リポジトリへpushされた際に
http://redmine.example.com/github_hook?project_id=redmine-test
へWebhookする
となります。
Add Webhook
をクリックして反映させると、同画面中頃に下記のように追加した設定が表示されます。
Test
ボタンをクリックすることで実際にWebhookのリクエストを行い、稼働確認を行います。
成功するとこのように表示され、正常に動作していることが確認できました。
また、Edit
ボタンをクリックし、Recent Deliveries
セクションからリクエストとレスポンスの詳細が見れるので、うまくいかなかった場合の原因調査も行うことができます。
Redmine側で見てみると、無事fetchできていることが確認できます。
IssueTrackerとしてRedmineを使う
この後はGitLab側で#nn
みたいな文字列に対してRedmineのチケットへリンクさせる設定です。
Settings
のIntegrations
からRedmine
をクリックし、
このような雰囲気で各項目を埋めていきます。
Project url
はそのままRedmineのプロジェクトのURLIssues url
はhttp://example.com/issues/:id
New issue url
はこちらを見るとThis is currently not being used and will be removed in a future release.
ということなので特に入力する必要は無いようです。
Test settings and save changes
をクリックし、
このように表示されれば完了です。
メニューにRedmineへのリンクが追加されます。
使わない予定のIssues
は消してしまいましょう。
Settings
のGeneral
を開き、Permissions
のセクションでトグルをオフにします。
すると消えます。よかったですね。
ということでRedmineでチケットを作り、
コミットする際にRedmineのチケット番号をCommit messageに入れてコミットすると、
GitLab上でRedmineへリンクされます。
ハマったやつ
GitLab側でWebhookがHook execution failed: Net::ReadTimeout
となる場合があり、正常に動作していないように見えるケースがありました。
単純にGitLab.com側のタイムアウトが短い(恐らくデフォルトの3秒)ため起こっていると思われますが、GitHub_Hook_Plugin
としてはちゃんとfetchしているため問題なしと判断しました。
自前のGitLabだとwebhook_timeout
で変更できますね。
おしまい
GitLabとRedmineをiikanjiに統合できました。
これでGitLabとRedmine両方使いたい!という欲張りさんの欲望を満たすことができますね。