GitとRedmineで連携する際に、Git側がGitLabだった場合に、どういった設定が必要になるのか調べてやってみました。

GitLabとRedmine連携の概要

GitLabとRedmineを連携することによって、機能の開発や不具合修正を実施する際にRedmine側でチケットを作成しておき、対応するソースコードの編集・変更等を終えた後、GitLabへ成果物を登録するタイミングでRedmineのチケットと関連付けを行います。そうすることにより、特定の対応を行った情報として、どのファイルへ変更を行ったのか、誰がいつどのような変更を行ったのか、等の一連の情報が紐づいた状態で管理できます。(GitLabのイシュー機能でも近い機能を活用することも可能です。)
  
Redmineと連携することにより、レビュー時に変更内容を確認しやすくなる事や、手戻りが発生した際の履歴の追跡等にも役立てられます。特にRedmineを使用する利点としては、チケットを親チケット・子チケットでの管理、チケットの各フィールドをカスタムして任意の項目を作成できるため、記録しておきたい情報の自由度が高い点が挙げられます。

では、実際に連携の設定をどのように実施するのか解説していきます。

設定の概要

GitLabの既存のリポジトリが作成されている状態で、GitLabとRedmineの連携を行う設定方法について解説していきます。以下、行った設定の概要となります。

  • 構築環境
    • 構築した環境の情報
  • Redmineの設定手順
    • GitLab上のリポジトリをRedmineのローカルにあるベアリポジトリへ同期
    • Redmineのプロジェクトでリポジトリの設定
    • RedmineでWebhookのプラグインを使えるよう設定
    • Redmineチケットが作成できるよう設定
  • GitLab側の設定手順
    • GitLabでWebhookの設定
    • GitLabでIssueTrackerとしてRedmineを使う設定
    • GitLabのコミット情報にRedmineのチケット番号が関連付けされる設定

構築環境

構築環境は以下の通りです。

  • Dockerを使用して、GitLabとRedmineを独立したコンテナとして1つのマシンで構築
    • GitLabポート番号:8082
    • Redmineポート番号:8081
    • GitLab バージョン:14.1.1
    • Redmineバージョン:4.2.3
    • Redmine Github Hook pluginバージョン:3.0.1

Redmineの設定手順

  1. Redmine側のローカルにGitLabのリポジトリのベアリポジトリをcloneする
  • 「/usr/src/redmine/lib」配下に、ベアリポジトリ用のフォルダを作成します。
> mkdir -p repo 
> cd repo
  • 作成したフォルダ配下にベアリポジトリをcloneします。
> git clone -- bare 参照したいGitLabのリポジトリ

(例)
> git clone --bare http://XXX.XXX.XX.X:8082/root/sample.git

  1. Redmineのプロジェクトでリポジトリの設定を行う
  • Redmineでプロジェクトを作成する。
  • プロジェクトのリポジトリから新しいタブで以下の設定を行います。
    • バージョン管理システム:Git を選択
    • メインリポジトリのチェック:有効
    • 識別子:GitLabのwebhookのエンドポイントで使うものを入力 (例)sample
    • リポジトリのパス:1.でcloneを実施したパス (例)/usr/src/redmine/lib/repo/sample.git
      • この設定が正確にできていないと、リポジトリの画面で「404エントリ/リビジョンが存在しません。」と表示されることがあります。  
  1. RedmineでWebhookのプラグインを使えるよう設定を行う
  • GitLab側の更新をRedmineへ反映させるための設定として「Github hook plugin」をインストールします。  
> cd /usr/src/redmine
> cd plugins
> git clone git://github.com/koppen/redmine_github_hook.git
> docker restart redmine

Redmine側の管理画面で「Github hook plugin」のプラグインが表示されるようになります。

  1. Redmineチケットを作成できるように設定
  • プロジェクトを開き、設定 > チケットトラッキングタブを開き、トラッカーを作成して有効化します。

GitLab側の設定手順

  1. GitLabでWebhookの設定
  • GitLab側でリポジトリのイベント(push等)発生時にRedmineのリポジトリがリアルタイムで更新されるようにするための設定を行います。
    • 対象プロジェクトを選択 > 設定 > WebhooksからURLとトリガーとなるイベントを設定します。 
    • URL:例のようにRedmineのURLを設定します。
      • (例)http://XXX.XXX.XX.X:8081/github_hook?project_id=sample
      • 上記の「project_id=」のパラメータはRedmineでのリポジトリの識別子を指定します。
    • トリガー:プッシュイベントを有効化します。    
  • 以下のようなエラーが発生した場合
    • エラーメッセージ:Urlis blocked: Requests to the local network are not allowed
    • 解決策:管理メニュー > 設定 > ネットワーク> アウトバウンドリクエスト から以下の設定を有効化します。
      • web フックおよびサービスからのローカルネットワークへのリクエストを許可する。
  1. GitLabでIssueTrackerとしてRedmineを使う設定
  • GitLabのインテグレーションの設定にてRedmineの必要な情報を指定します。
    • 対象プロジェクトを選択 > インテグレーション > Redmine を選択して以下の設定を行います。(GitLab側でコミットのコメントにチケット番号「#n」を記載して、Redmineのチケットへリンクさせる設定)
    • プロジェクトのURL(RedmineのURL):
      • http://XXX.XXX.XX.X:8081/projects/sample
        • このプロジェクト名が識別子と異なるとエラーで開けません。
    • Issue URL(RedmineのURL):
      • http://XXX.XXX.XX.X:8081/issues/:id
    • New issue URL(RedmineのURL):
      • http://XXX.XXX.XX.X:8081/projects/sample/issues/new
        • New Issue URLはいずれなくなる機能のようで、書かない場合でも問題ないです。
  1. GitLabのコミット情報にRedmineのチケット番号が関連付けされるようにするための設定
  • GitLabのメニューからイシューの表示を無効にします
    • プロジェクトを開く > 設定 > 一般 > 可視性、プロジェクトの機能、権限 を開き、イシューをオフにします。

まとめ

連携の設定を行うと、以下のようにRedmineのリポジトリに、GitLabにコミットした情報等が反映されます。実際に細かな動作については次回解説していきます。