Redmine
GitLab
docker

(改訂版) Docker でオフィシャルな GitLab イメージと Redmine イメージのコンテナを連携させる

More than 1 year has passed since last update.

はじめに

これは以前書いた Docker でオフィシャルな GitLab イメージと Redmine イメージのコンテナを連携させる の改訂版です。以前の記事では GitLab と Redmine のイメージをハックしていましたが、イメージに手を加えずに 連携する方法を見つけたので改めて記事にしました。

対象となる読者

この記事を読んだ後できるようになること

  • GitLab の Issues タブが Redmine のプロジェクトにリンクされます。
  • GitLab のコミットメッセージ内の issue 番号が Redmine チケットにリンクされます。
  • Redmine のチケット連携機能がそのまま使えます。

この記事を書いたときのバージョン

  • GitLab イメージ: gitlab/gitlab-ce: 8.15.4-ce.1
  • Redmine イメージ: redmine:3.3.2
  • PostgreSQL イメージ: postgres:9.6.1 ※Redmine 用

ソースコード (docker-compose.yml、Dockerfile など)

今回作った GitLab & Redmine 環境構築のためのファイル一式は GitHub に置いてあります。

https://github.com/nkenbou/gitlab-redmine

GitLab と Redmine を連携させてできるようになること

当記事で取り扱っているのは私自身が実際に試した機能だけです。ここに書いたこと以外にも便利な機能があるかもしれません。

  • GitLab の Issues タブが Redmine のプロジェクトにリンクされます。
  • GitLab の New issue メニューが Redmine の新規チケット作成ページにリンクされます。
  • Git のコミットメッセージに refs #123 など (チケット番号だと判定させるためのキーワード (refs など) は変更できます。後述。) と書くと、GitLab のコミットログから Redmine の #123 チケットへのリンクが作成されるようになります。
  • Git のコミットメッセージから、Redmine チケットの各種ステータス (作業時間など) を操作することができるようになります。

当記事では GitLab、Redmine とも test をプロジェクト名として説明します。

基本的な設定

ここでは、連携に直接関係はないけど、知らないとこの記事の内容を試すときにつまずきそうな基本的な設定について説明します。

Redmine ユーザーの設定

Redmine の ログインID と各ユーザーの開発マシンの git 設定 user.name は合わせておくとよいです。

開発マシンの user.name を設定する方法です。

$ git config --global user.name "nkenbou"

もし、別々にしたい場合は次のページで、ログから検出された git ユーザーと Redmine ユーザーを関連付けることができます。

redmine-repository-user.png

Redmine で最低限必要な設定項目

  • チケットのステータス
  • トラッカー
  • ワークフロー
  • 列挙項目
    • チケットの優先度
    • 作業分類 (時間管理)

連携のための設定

ここでは、GitLab、Redmine それぞれに test プロジェクトが作成されていることを前提として説明していきます。

GitLab に連携用アカウントを作成する

GitLab にあるリポジトリを redmine コンテナでクローンするために、GitLab にクローン用アカウントを作成します。

ここでは次の内容でアカウントを作成しています。

  • Username: redmine
  • Password: redmineredmine

作成したアカウントは対象のプロジェクト (例. test) のメンバーに Reporter 権限で追加しておきます。

Redmine 側の設定

リポジトリ (管理) の設定

redmine-admin-repository.png

設定のポイント:

  • コミットを自動取得する: on
  • 参照用キーワード: チケット番号だと判定させるためのキーワードの設定です。* を追加するとキーワードが不要になります (例. #123)。
  • 異なるプロジェクトのチケットの参照/修正を許可: on
  • コミット時に作業時間を記録する: on
  • 作業時間の作業分類: 適宜

Git リポジトリのクローン

Docker ホストの ./git_repositories (redmine コンテナでマウントしているディレクトリ) に GitLab で作成したプロジェクトのリポジトリ (例. test) を ベアリポジトリ としてクローンします。

$ cd /path/to/git_repositories
$ git clone --bare http://redmine:redmineredmine@localhost:10080/nkenbou/test.git

その後、remote.origin.url のホスト名を localhost:10080 => gitlab に変更します。これは、redmine コンテナ内から gitlab コンテナへはホスト名 (サービス名) でアクセスする必要があるためです。

さらに、クローンしたリポジトリのオーナーをコンテナ内の redmine ユーザーにします。redmine ユーザーの UID、GID はそれぞれ 999 です。

$ cd test.git
$ git config --local remote.origin.url http://redmine:redmineredmine@gitlab/nkenbou/test.git
$ sudo chown -R 999:999 .

ここでは HTTP/HTTPS プロトコルを使って ID + Password 付きの URL でクローンする例を載せていますが、クローン用アカウント の SSH キーを作成してあらかじめ GitLab に登録しておけば SSH プロトコルでもクローンできます。その場合、SSH キーは Redmine コンテナにボリュームをマウントするなどして設定してください。

リポジトリ (プロジェクト) の設定

redmine-project-repository.png

設定のポイント:

  • バージョン管理システム: Git
  • リポジトリのパス: /var/redmine/git_repositories/XXX.git
    • クローン先のパスを指定します。
  • その他の設定は適宜

GitLab 側の設定

Redmine サービス (テンプレート) の設定

Admin 権限でログインし、Service Templates > Redmine と選択していき Redmine サービスのテンプレートを設定するページを開きます。

gitlab-service-template-redmine.png

設定のポイント:

捕捉:
* localhost:10081 の部分は Redmine のホスト名です。実際の環境にあわせて置き換えてください。
* :project_id の部分は (自動的に置き換えられそうですが) 個々のプロジェクトで Redmine サービスの設定をする際に手動で置き換えることになります。
* :id はチケットの ID になります。連携時に自動的に置き換わります。

Redmine サービス (プロジェクト) を設定

Redmine と連携したいプロジェクトで Services > Redmine と選択していき Redmine サービスを設定するページを開きます。

gitlab-service-redmine.png

設定のポイント:

  • Project urlNew issue url:project_id 部分を Redmine 側のプロジェクト名 (例. test) に置き換えます。

Webhooks の設定

Redmine と連携したいプロジェクトの Webhooks メニューから Webhooks の設定ページを開きます。

gitlab-webhooks.png

設定のポイント:

  • URL: http://redmine:3000/github_hook?project_id=XXX
    • ホスト名: Docker 内でコンテナ同士を接続するために自動的に設定されるホスト名 (例. redmine) を指定してください。docker-compose.yml を使用している場合はサービス名になります。
    • ポート: Redmine のコンテナ側のポート (例. 3000) を指定してください。
    • project_id=XXX: XXX の部分には Redmine 側のプロジェクト名 (例. test) を指定してください。

捕捉説明

GitLab へプッシュしたら Redmine の Git リポジトリでフェッチしないとリポジトリが更新されないのでチケットにも各種情報は反映されません。
GitLab へのプッシュ時に自動的にフェッチを行うために、redmine_github_hook という Redmine のプラグインを使用しています。GitLab の Webhooks で設定した URL のパスが /github_hook になっていますが、これがそのプラグインの提供するサービスの API になります。

動作確認

これで、設定は完了です。

Redmine のチケット連携機能だけ動作確認を載せておきます。

コミット (作業時間の記録)

例. #1 チケットに作業時間 2h30m で登録するようにコミット。

$ cd /path/to/test
$ echo "#GitLab & Redmine" > README.md
$ git add README.md
$ git commit -m "#1 @2h30m add title"
$ git push

redmine-set-worktime.png

コミットメッセージによる作業時間の記録については次のサイトが詳しいです。

http://blog.redmine.jp/articles/new-feature-1_1/automatic-spent-time-logging/

まとめ

以前書いた 記事 では Docker イメージをハックしていましたが、それがなくなったのでシンプルに環境が構築できるようになりました。これで後顧の憂いなく安心して運用していけそうです。

参考文献