EC2インスタンスのDockerコンテナにあるRedmineとGitHubを連携してみた記録

GitHubと連携するプラグインRedmineに追加します。

github.com

プラグインを配置します。

# 1. DockerホストにログインしてDockerを動かせるユーザーに切り替えます。
$ sudo su - {Docker用ユーザー}
[sudo] ponsuke のパスワード:
最終ログイン: 2019/09/04 () 18:53:50 JST日時 pts/0

# 2. Redmineコンテナが起動していることを確認します。
$ cd docker/host/
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
e943461bd3ad        redmine:4.0.4       "/docker-entrypoint.…"   7 months ago        Up 6 days           0.0.0.0:80->3000/tcp   redmine_no_container

# 3. DockerホストからRedmineコンテナのプラグイン用ディレクトリににプラグインをクローンします。
$ docker exec redmine_no_container git clone https://github.com/koppen/redmine_github_hook.git /path/to/redmine/plugins/redmine_github_hook
Cloning into '/path/to/redmine/plugins/redmine_github_hook'...

# 4. Redmineコンテナにログインします。
$ docker exec -it redmine_no_container bash

# 5. プラグイン用ディレクトリに移動してクローン出来たことを確認します。
$ cd /path/to/redmine/plugins/redmine_github_hook/
$ ls -la | grep github
-rw-r--r-- 1 root    root     876 Feb 28 08:57 redmine_github_hook.gemspec

# 6. Redmineコンテナからログアウトします。
$ exit

# 7. Redmineコンテナを再起動します。
$ docker restart redmine_no_container
redmine_no_container

Redmineプラグインが追加されたことを確認します。

  1. Redmineにログインします。
  2. [管理] > [プラグイン]で画面を表示してプラグインが追加されたことを確認します。
    • f:id:ponsuke_tarou:20200306080734p:plain

GitHubリポジトリにDeploy keysを登録してパスワードなしでクローンできるようにします。

codelab.website

コンテナで秘密鍵と公開鍵を作成します。

鍵を作成する際にパスフレーズを設定するとリポジトリをクローンだけでなくフェッチするときにも毎回パスフレーズの入力が必要になってしまうため、今回パスフレーズは設定しません。
※. パスフレーズの設定および解除は自己責任で実施してください。

# 1. DockerホストにログインしてDockerを動かせるユーザーに切り替えます。
$ sudo su - {Docker用ユーザー}
[sudo] ponsuke のパスワード:
最終ログイン: 2020/02/28 () 17:22:13 JST日時 pts/0

# 2. Redmineコンテナにログインします。
$ cd docker/host/
$ docker exec -it redmine_no_container bash

# 3. RSA鍵のペアを作成します。
# ssh-keygenコマンドはデフォルトで「ユーザー名@ホスト名」をコメントにします。なのでGitHubのユーザのメールアドレスをコメントとして-Cオプションで指定します。
$ ssh-keygen -t rsa -C ponsuke@mail.com
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <<<< Enter
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): <<<< Enter
Enter same passphrase again: <<<< Enter
...省略...

# 4. 公開鍵を表示してコピーします。
$ cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAA...
#

GitHubリポジトリのDeploy keysに公開鍵を登録します。

  1. GitHubにログインします。
  2. クローンするリポジトリ > [Settings]タブ > [Deploy key] > [Add deploy key]ボタン
    • f:id:ponsuke_tarou:20200306083615p:plain
  3. タイトルをつけてコピーした公開鍵を登録します。
    • [Allow write access]はOFFで登録します。

GitHub上のソースをクローンします。

# 1. リポジトリのクローン先用にディレクトリを作成します。
$ mkdir git
$ ls -la | grep git
drwxrwxr-x  2 redmine redmine   38 Jun 10  2019 .github
-rw-rw-r--  1 redmine redmine  761 Jun 10  2019 .gitignore
drwxr-xr-x  2 root    root       6 Mar  5 23:55 git

# 2. 作成したディレクトリに移動します。
$ cd git/

# 3. ベアリポジトリをクローンします。
$ git clone --bare git@github.com:ponta/hoge.git
Cloning into bare repository 'hoge.git'...
Warning: Permanently added the RSA host key for IP address '12.345.67.89' to the list of known hosts.
Enter passphrase for key '/root/.ssh/id_rsa':
remote: Enumerating objects: 311, done.
remote: Counting objects: 100% (311/311), done.
remote: Compressing objects: 100% (191/191), done.
remote: Total 19981 (delta 110), reused 232 (delta 42), pack-reused 19670
Receiving objects: 100% (19981/19981), 11.54 MiB | 7.12 MiB/s, done.
Resolving deltas: 100% (12399/12399), done.
$

Redmineを設定します。

  1. Redmineにログインします。
  2. 連携するプロジェクトを選択します。

リポジトリを設定します。

https://codelab.website/wp-content/uploads/2018/05/32e0dd9eb81c1b9af2fe6fc5fdcd1138.png
[Redmine]GitHubと連携する | CodeLab

  1. [設定] > [リポジトリ]タブ > [新しいリポジトリ]
  2. 新しいリポジトリ画面で以下を設定して[作成]ボタンで作成します。

チケットとリビジョンを関連付けられるように設定します。

http://redmine.jp/images/tech_note/link-issue-to-rev.png
バージョン管理システムとの連携 — Redmine.JP

http://redmine.jp/images/faq/relations_without_keywords.png
参照用キーワード(refsなど)無しでリビジョンとチケットを関連づける — Redmine.JP

  1. [管理] > [設定] > [リポジトリ]タブ
  2. [参照用キーワード]に「*」を追記して[保存]ボタンで保存します。

Redmine上にクローンしたベアリポジトリを更新します。

www.axlight.com

# 1. DockerホストにログインしてDockerを動かせるユーザーに切り替えます。
$ sudo su - {Docker用ユーザー}
[sudo] ponsuke のパスワード:
最終ログイン: 2019/09/04 () 18:53:50 JST日時 pts/0

# 2. Redmineコンテナにログインします。
$ docker exec -it redmine_no_container bash

# 3. リポジトリのクローン先に移動します。
$ cd git/hoge.git

# 4. ベアリポジトリを更新します。
$ git fetch origin 'refs/heads/*:refs/heads/*'
チケットに関連付くコミットがあるとチケットに表示されます。

f:id:ponsuke_tarou:20200311143718p:plain

リポジトリを自動更新する

方法1つめ : GitHubにWebhookの設定を行います

https://codelab.website/wp-content/uploads/2018/05/c421aa39afa9bc8b49550ae6afd8ecde.png
[Redmine]GitHubと連携する | CodeLab

  1. GitHubにログインします。
  2. クローンするリポジトリ > [Settings]タブ > [Webhooks] > [Add webhook]ボタンで入力画面を表示します。
  3. 以下を入力して[Add webhook]ボタンで追加します。
    • Payload URL : https://{RedmineのURL}/githook?project_id={RedmineのプロジェクトID}
    • Content type : application/x-www-form-urlencoded
    • Enable SSL verification : ON
    • Just the push event : ON
    • Active : ON

失敗したこと

認証用の鍵にパスフレーズを設定して毎回入力が必要になってしまった。

GitHubの認証用の鍵を作成した際にパスフレーズを設定しました。
その結果、フェッチのたびにパスフレーズの入力が必要となってしまいました。
そうすると自動でフェッチさせるのに困ります。なのでパスフレーズを解除します。
※. パスフレーズを解除するのは自己責任で実施してください。

対応 : (失敗)パスフレーズを解除できなかった。

コンテナにsudoコマンドがなくてうまくできませんでした。

$ cd /root/.ssh/

# バックアップします
$ cp id_rsa id_rsa.org
$ ls -la | grep id_rsa
-rw------- 1 root root 1876 Mar  5 23:28 id_rsa
-rw------- 1 root root 1876 Mar 15 23:39 id_rsa.org
-rw-r--r-- 1 root root  408 Mar  5 23:28 id_rsa.pub

# パスフレーズを解除しますが、パスフレーズを入力するはずが・・・エラーに・・・
$ openssl rsa -in id_rsa -out id_rsa
unable to load Private Key
14068536:error:0909006C:PEM routines:get_name:no start line:../crypto/pem/pem_lib.c:745:Expecting: ANY PRIVATE KEY

# パスフレーズをコマンドと合わせて入力してもエラーに・・・
$ openssl rsa -in id_rsa -passin pass:othelve2020 -out id_rsa
unable to load Private Key
14068576:error:0909006C:PEM routines:get_name:no start line:../crypto/pem/pem_lib.c:745:Expecting: ANY PRIVATE KEY

# コンテナには必要最低限のコマンドしかないためsudoすらなかった・・・(そもそもログインユーザーがrootなので意味ないかも)
$ sudo openssl rsa -in id_rsa -out id_rsa
bash: sudo: command not found
対応 : 認証鍵を作り直します。
  1. 認証鍵をパスフレーズなしで再作成します。
  2. GitHubリポジトリのDeploy keysに公開鍵を再登録します。
# 認証鍵をパスフレーズなしで再作成します。
$ ssh-keygen -t rsa -C ponsuke@mail.com
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <<<< Enter
Enter passphrase (empty for no passphrase): <<<< Enter
Enter same passphrase again: <<<< Enter
...省略...

# 公開鍵を表示してコピーして再登録します。
$ cat id_rsa.pub
ssh-rsa AAAAAAA...省略...

(未解決)We couldn’t deliver this payload: Failure when receiving data from the peer

f:id:ponsuke_tarou:20200310181632p:plain

  • 事象 : GitHubに設定したWebhookでエラーになっている
    1. GitHubにログイン > クローンするリポジトリ > [Settings]タブ > [Webhooks]
    2. 設定したWebhookに赤い三角マークが表示されているのでリンクをクリック
    3. [Recent Deliveries]のエラーをクリックするとエラーメッセージと共にPayloadが表示されている
  • 原因 : たぶんWebhookでEC2にアクセスできないから
  • 対応 : あきらめてリポジトリの更新はcronを使う

GitHubと連携するプラグインRedmineから削除する方法

# 1. DockerホストにログインしてDockerを動かせるユーザーに切り替えます。
[ponsuke@host ~]$ sudo su - {Docker用ユーザー}

# 2. Redmineコンテナにログインします。
[{Docker用ユーザー}@host ~]$ docker exec -it redmine_no_container /bin/bash
root@redmine_no_container:redmine# ls -l plugins/
#...省略...
drwxr-xr-x  8 root    root     229 Feb 28  2020 redmine_github_hook    # << 削除するプラグイン
#...省略...

# 3. プラグインをアンインストールします。
root@redmine_no_container:redmine# bundle exec rake redmine:plugins:migrate NAME=redmine_github_hook VERSION=0 RAILS_ENV=production
W, [2022-03-21T23:54:03.645901 #6913]  WARN -- : Creating scope :system. Overwriting existing method Enumeration.system.

# 4. プラグインのディレクトリを削除します。
root@redmine_no_container:redmine# rm -rf plugins/redmine_github_hook

# 5. クーロンを削除します。
root@redmine_no_container:redmine# cat /etc/cron.d/git-cron
*/5 * * * * root redmine/git/git-fetch.sh >> /var/log/cron.log 2>&1


root@redmine_no_container:redmine# rm /etc/cron.d/git-cron

# 6. クーロンに登録されていたシェルを削除します。
root@redmine_no_container:redmine# rm git/git-fetch.sh

# 7. Redmineに連携していたリポジトリをクローンしたディレクトリを削除します。
root@redmine_no_container:redmine# rm -rf git/ncd-tavi-src-01.git/

# 8. Redmineコンテナからログアウトします。
root@redmine_no_container:redmine# exit
exit

# 9. コンテナを再起動します。
[{Docker用ユーザー}@host ~]$ docker restart redmine_no_container
redmine_no_container