ENGINEER BLOG

ENGINEER BLOG

GitLabとRedmineを使う

ごきげんよう、じんぐうじです。

弊社内の、とある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のチケットへリンクさせる設定です。

SettingsIntegrationsからRedmineをクリックし、

このような雰囲気で各項目を埋めていきます。

  • Project urlはそのままRedmineのプロジェクトのURL
  • Issues urlhttp://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は消してしまいましょう。

SettingsGeneralを開き、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両方使いたい!という欲張りさんの欲望を満たすことができますね。