Githubのプライベートリポジトリと、EC2上のJenkinsとを連携させ、特定のブランチでの変更をJenkinsに検知させる方法

# はじめに
本記事では、表題の通りGithubのプライベートリポジトリと、EC2上のJenkinsとを連携させ、特定のブランチでの変更をJenkinsに検知させる方法について記す
Jenkinsが特定のブランチでの変更を検知する方法は、以下の二通りがある

- Jenkinsが、特定ブランチでの変更があったかどうかをポーリングをする方法
- 特定ブランチで変更があった際に、GithubがJenkinsに都度通知する方法

本記事では、 後者の「特定ブランチで変更があった際に、GithubがJenkinsに都度通知する方法」について解説する

# Jenkinsのインストール
こちらの記事を参考にした。自分はUbuntu20.04を使用しているが、この記事にある方法で問題なくインストールできた
[Ubuntu18.04にJenkinsをインストールする](https://qiita.com/tsumtsumyuma/items/6a8de502f489689dc3c6)
公式のドキュメントは[こちら](https://www.jenkins.io/doc/book/installing/linux/#debianubuntu)
※Jenkinsをインストールする前に、Javaをインストールする必要があるので注意

## JenkinsにGit Pluignを入れる
自分はJenkinsにおすすめされたプラグインを入れたのだが、その際に今回の設定に必要なプラグインがインストールされていた
おそらく今回の設定に必要なプラグインは[Git Plugin](https://plugins.jenkins.io/git/)で、もしインストールされていなければインストールする必要がある（もし他に必要なプラグインがあれば、誰か教えて頂けると嬉しいです）
インストール手順は以下の通り

Jenkinsの管理から、プラグインの管理をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/7c4c7d86-b901-7d7d-c5d4-3fa4f2463753.png)

検索して、もし見つかればチェックしてインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/f3503c31-d30c-301b-49ef-783a56642cc2.png)

インストール済みであれば、こちらに表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/b41d033b-bc10-4f30-2d7e-be9a73c3d772.png)

# 公開鍵・秘密鍵の作成
Githubで公開鍵の登録、およびJenkinsで秘密鍵の登録をする必要があるため、秘密鍵と公開鍵を作成する
まずは、EC2にルートユーザでログインし、ログイン後Jenkinsユーザに切り替える

```
sudo su jenkins
```

鍵を生成する方法が書かれた記事は山ほどあるので、あえてここでは書かず、オススメのリンクだけ貼っておく
結果的に、Jenkinsユーザの`~/.ssh`に公開鍵と秘密鍵がある状態になればok
鍵を生成する方法は、以下のサイトが分かりやすいかも
[Linuxコマンド【 ssh-keygen 】認証用の鍵を生成 - Linux入門 - Webkaru](https://webkaru.net/linux/ssh-keygen-command/)
公開鍵暗号の方式については、以下の記事が分かりやすいかも
[2017年版 SSH公開鍵認証で使用する秘密鍵ペアの作り方](https://qiita.com/wnoguchi/items/a72a042bb8159c35d056)

# Jenkinsの設定
JenkinsではJobを作成し、同時に秘密鍵を登録する


まず、前準備として、認証トークンを作成する（今回はadminユーザを使用）
Jenkinsの管理からユーザーの管理をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/08b0843e-0c8b-af45-bb5b-a6c0e2bac1cb.png)

adminをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/d63c9632-f187-42af-7821-0be5f44a5cc3.png)

設定をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/742473a1-38cc-50c5-e519-56ec68254402.png)

APIトークンという項目で、Add new Tokenをクリックし、トークン名を入力したのち、Generateをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/6a105ad7-9aea-c826-210b-25c51ec30ffc.png)

生成するとこんな感じの画面になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/c74a63cc-3450-760f-1dd8-83af43f261be.png)

この`11ac5c....b3128`の文字列はこのタイミングしか表示されないので注意
確実にコピーしておく

続いて、新規ジョブを作成する
新規ジョブ作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/98f8911c-b01d-9113-ef4a-4a4364878e2e.png)

適当なJobの名前を入力し、「フリースタイル・プロジェクトのビルド」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/d638b68c-d058-9d54-c9b6-09d5bb2e3d45.png)
GitHub projectにチェックを入れ、Project urlを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/2c9b40db-2108-ceed-b134-e605955ff384.png)

ビルドのパラメータ化にチェックを入れ、パラメータの追加をクリックし、文字列を選択し、名前の欄に`payload`と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/14841e7f-f3c6-4bf1-3005-62398f30650a.png)

ソースコード管理でgitを選択し、リポジトリURLを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/45533ed6-d814-955a-a5f5-aab2550fba17.png)

リポジトリURLは、以下の図の真ん中らへんにある、git@から始まるやつ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/c888e5d8-dd02-2db8-e672-43e91a1ba4e5.png)

認証情報の追加を選択し、Jenkinsをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/b8c1c757-1b3f-4a01-ef9d-874a4270984b.png)

種類にはSSHユーザ名と秘密鍵を選択し、ユーザ名を`Jenkins`にし、先ほど作成した秘密鍵を直接入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/ee5a5fb7-542f-0ec7-c5c2-92a213d3803e.png)

ブランチ指定子には、例えばmasterブランチをビルドする場合は、上の画像のように`*/master`と入力すれば良い
続いて、ビルド・トリガの項目で、「リモートからビルドを選択」
認証トークンの欄には、先ほど作成した認証トークンの名前を入力する
後は、GitHub hook trigger for GITScm pollingにチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/58115615-f4fe-1d6b-8873-a7054916a4ec.png)

ビルドのところは、いずれ追記します
今回は保存をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/73b589c5-5bea-4cb4-fc44-2693c68fff70.png)

Jenkinsのジョブ作成は以上です、お疲れさまでした

# Githubの設定
Githubに先ほど作成した公開鍵を登録し、その後Webhookの設定をする
## Githubで公開鍵を登録
先ほど作成した公開鍵を、リポジトリの作成者の設定画面に行き、SSH and GPG keysからNew SSH keyをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/75832a2c-ea87-4159-5565-414550dded40.png)
Titleに適当な名前を入力し、Keyのところには先ほど作成した公開鍵を入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/5f0a6b50-9838-d84d-254e-4cfc5bbafce4.png)

## Webhookの設定
リポジトリの画面から、Setting->Webhookを選択し、Add webhookをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/b682b25b-f8e0-c1a2-59f0-62b9b20f48da.png)

そうるすと、以下の画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628781/b38f6eac-ca82-ad3f-6467-e8a708502efc.png)

Payload URLの欄には
`http://<ユーザ名>:<トークン>@<JenkinsのIPアドレスとポート>/job/<ジョブの名前>/buildWithParameters?token=<トークン名>`
を入力する
今回、例えばジョブの名前がtest-jobだとすると、
`http://admin:11ac5c....b3128@x.x.x.x:XXXX/job/test-job/buildWithParameters?token=aa`
のようになる
Content typeは`applicatoin/x-www-form-urlencoded`を選択
そして、Add webhookをクリック

以下のサイトをめちゃくちゃ参考にしましたm(_ _)m
[【Jenkins】Webhookを設定してみる - ぴよ丸水産](https://blue-38.hatenablog.com/entry/2019/09/16/215006)
[JenkinsとGitHubのWebhook連携の整理 │ Aiming 開発者ブログ](https://developer.aiming-inc.com/infra/jenkins-github-webhook-collaboration/)

# もしうまくいかない場合
以下の記事に書かれているように、EC2のセキュリティグループの設定を変更する必要があるかもしれない
[Jenkins で GitHub のイベントを受けてゴニョゴニョする準備 - Qiita](https://qiita.com/exabugs/items/cc2c6f59da98cd81a06f)
https://api.github.com/meta の"hooks"に記載されたIPを許可すればうまくいくかも
ポート番号については、以下のページを参考にすると良い
[ネットワークポート - GitHub Doc](https://docs.github.com/ja/enterprise-server@2.20/admin/configuration/network-ports)