GithubとJenkinsを連携させるにあたり、Github webhookの設定でつまずいたのでまとめておく

## はじめに
GithubとJenkinsを連携させるにあたり、Github webhookの設定でつまずいたのでまとめました。
今回はgit pushをトリガーとするべく、github webhookの設定から行っていましたが、ジョブが実行されないときがあったので、jenkinsでポーリングして行う方法のほうがいいかもしれません。

そこで本記事では、Githubのwebhookを使う場合の設定とjenkinsでポーリングして行う場合の設定の2つをご紹介します。

なお、jenkins自体のインストール、slackのプラグインはメモ程度に最後に書いておきます。

### 全体の構成
![Screenshot from 2019-11-03 11-07-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341653/e9abbf21-8bb4-bd73-2870-01b1838a0c4a.png)




## 環境/バージョン情報
- AWS (EC2, VPC, EIP, etc)
  - Ubuntu 18.04.3 LTS
- Jenkins ver. 2.190.2


## どちらでも必要な設定
### Github pluginのインストール
  - トップ画面から**Manage Jenkins**　>> **Manage Plugins** >> **Available**の順にクリック
  　(URL: http://\${JENKINS_IP}:8080)
  - filterの検索窓に **github** と打ち込んで検索し、**Github plugin**をインストールして再起動
  - jenkinsの管理画面が戻らない場合は、**http://\${JENKINS_IP}:8080/restart** とタブに打ち込む
  - 管理画面にログインできたら、**Available**の右隣の**Installed**をクリックした後、**github**と検索するとインストールされていることが確認できる
![Screenshot from 2019-11-02 17-47-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341653/76e7aa25-60af-a577-94bf-63c328acbb37.png)
  


### 鍵とssh-agentの設定 
- 秘密鍵のファイル名は~/.ssh/id_rsa、パスフレーズは無しとした

```
ubuntu@ip:~$ sudo su - jenkins
jenkins@ip:~$pwd
/var/lib/jenkins
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
> Enter a file in which to save the key (/home/you/.ssh/id_rsa): [Press enter]
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]
```

- 秘密鍵と公開鍵はコピーし、任意のテキストに貼り付けておく
- 
```
jenkins@ip:~$ sudo cat /.ssh/id_rsa
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
jenkins@ip:~$ sudo cat /.ssh/id_rsa.pub
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

```

- 鍵を生成した後、ssh-agentに鍵を追加

```
jenkins@ip:~$ eval "$(ssh-agent -s)"
> Agent pid 59566
jenkins@ip:~$ ssh-add ~/.ssh/id_rsa
```

- ~/.ssh/configを作成

```
jenkins@ip:~$ cat ~/.ssh/config 
Host github github.com
  HostName github.com
  User git
  Port 22
  IdentityFile /var/lib/jenkins/.ssh/id_rsa
```

- githubにsshで接続
- このように出力されれば成功です。
but以下は、shellでの接続はgithubでは提供されていないということなので、今回は無視で大丈夫です。

```
$ ssh -T git@github.com
Hi jenkins-hogehogehoge! You've successfully authenticated, but GitHub does not provide shell access.
```
- githubからjenkinsサーバーへgit pullするアカウント用にgithubアカウントを開設し、先ほどコピーした公開鍵を登録しておく



### ジョブの設定
- トップ画面画面から**New Item** をクリック
- **Enter an item name** にお好きなジョブ名を記載
- **Freestyle project** をクリックした後、OKをクリック。
- **GitHub project**の**Project url**に✔を入れる
![job_key0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341653/a0e82e89-8a7e-68a0-3050-05b53cd01bb7.png)
- githubのリポジトリをHTTPSでクローンするときのURLをコピーし、ペースト
- **Source Code Management**までスクロールし、**Git**に✔を入れる
- **Repositories**付近の**Repository URL**にはSSHでクローンするときのURLをペースト
![Screenshot from 2019-11-02 17-56-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341653/cf60440c-7d23-2cf4-e713-1f44e8e5e2dd.png)
- **Credintials**の右となりの**Add**をクリックし、出てきたポップアップの項目にはそれぞれ以下を選択、あるいは入力

|項目       |値                            |
|----------|------------------------------|
|Kind      |SSH Username with private key |
|Usernmae  |jenkins                       |
|Key       |先ほどコピーした~秘密鍵　　　　　　|

※秘密鍵を入力するには、Private Keyの隣のEnter directlyをクリックすることが必要です。

- ポップアップ画面左下の**Add**をクリック

![job_key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341653/201d9a59-8748-7e82-de38-438b6266722c.png)

- Credintialsのところにjenkinsと入っていればOKです。
- **Branches to build**の右隣の**Branch Specifier (blank for 'any')**にはジョブを実行したいブランチ名、あるいはその一部を記載
![job_key1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341653/bf041c1f-120e-973d-c3f2-60f9f2c17a21.png)
- **Build Triggers**まで下にスクロールし、**GitHub hook trigger for GITScm polling**をクリック
- **Build**の箇所まで下にスクロールし、**Add build step** >> **Execute shell**の順番にクリックし、実行したいコマンドを入力
- 僕が今回使ったリポジトリをそのまま使う場合はこんなかんじです。
[flask-docker](https://github.com/gkzz/flask-docker)

```
git checkout master
git fetch
git merge origin/master
ls
pwd
bash /var/lib/jenkins/workspace/githubWebhook/sh/setup.sh
bash /var/lib/jenkins/workspace/githubWebhook/sh/curlHttp.sh
```

![jenkins2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341653/f2f3dc6a-dda1-61c3-a681-b7335ccd9912.png)

※ファイル名はフルパス、　シェルスクリプトを使う際にはbash /path/filenameのようにする


## githubのwebhookを使う場合の設定
- トップページから**setting** >> **Webhooks** をクリックするか、下記URLを直接叩いた後、**Add webhook** をクリック
https://github.com/${USER}/${REPO}/settings/hooks/
- それぞれ以下を選択、あるいは入力

|項目          |値                                                      |
|-------------|--------------------------------------------------------|
|Payload URL  | http://\${JENKINS_IP}:8080/github-webhook/             |
|Content type |application/x-www-form-urlencoded (デフォルトのまま)       |
|Secret       |設定せず                                                 |
|Which events would you like to trigger this webhook?| お好きなものを選択 |
|Active       |✔をつけたまま                                             |



#### Payload URLの書式
Jenkinsの公式ドキュメントに記載されている、**$JENKINS_BASE_URL/github-webhook/**を使うようにしてください。

>In this mode, you'll be responsible for registering the hook URLs to GitHub. Click the (question) icon (under Manage Jenkins > Configure System > GitHub) to see the URL in Jenkins that receives the post-commit POSTs — but in general the URL is of the form $JENKINS_BASE_URL/github-webhook/ — for example: https://ci.example.com/jenkins/github-webhook/.

出所: [GitHub Plugin - Jenkins - Jenkins Wiki](https://wiki.jenkins.io/display/JENKINS/GitHub+Plugin)

冒頭でお話しましたが、**webhookが機能せず、ジョブが実行されない**ことがありました。
そこでjenkinsのジョブの設定でポーリングするように設定するように変更したので、変更箇所を書いていきます。

jenkinsのジョブの設定でポーリングすることでgithubと連携させる場合、**githubのwebhookよりジョブの実行が遅くなることがデメリット**です。。。



## jenkinsでポーリングして行う場合の設定
- **Build Triggers**の**GitHub hook trigger for GITScm polling**から✔を外し、代わりに**Poll SCM**に✔をつける
- githubのwebhookの設定を解除
- Scheduleの右隣りの枠にCronで設定するように記載。

これだけです。

![Screenshot from 2019-11-02 20-32-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341653/f8c41f2c-6fab-941f-a349-271724db07e0.png)



## 結果の確認方法
- 管理画面から確認したいジョブ名をクリック

![Screenshot from 2019-11-02 21-01-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341653/a033704d-43d6-4299-fa5a-d61ed8d57d05.png)

- 確認したいジョブの番号(直近の場合は一番大きい数字)をクリック

![Screenshot from 2019-11-02 21-01-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341653/fabcc71c-f47a-ac62-cd2c-92b675679bda.png)


- **Console Output**をクリック
![Screenshot from 2019-11-02 21-02-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341653/ee31c28a-9670-33c8-56b1-b414ac15f43b.png)
- 末尾に**Finished: SUCCESS**と出力されていればジョブは成功しています。

![Screenshot from 2019-11-02 21-08-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341653/efc87b5a-9556-4d14-b2d8-ddf9ce20a2a1.png)

![Screenshot from 2019-11-02 21-08-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341653/228344bc-1fca-1288-eed3-6f43c0f38833.png)


## Jenkinsのインストール方法(Ubuntu, 18.04 LTS, EC2)
- 以下に記載するコマンドを実行
- 
```
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt update -y
$ sudo apt-get install openjdk-8-jdk
$ whereis java
/usr/bin/java
$ tail ~/.bashrc
#追加で記載
export JAVA_HOME=/usr/bin/java
export PATH=$JAVA_HOME/bin:$PATH
$ sudo apt update -y
$ sudo apt upgrade -y
$ sudo apt install jenkins -y
$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword
aaaaaaaaaaaaaaaaaaaaaaaa  #管理画面からログインするための初期パスワード
```
- http://\${JENKINS_IP}:8080を開いて上のパスワードを入力
- インストールプランは **Install suggested plugins**を選択


## Slackプラグインのインストール方法
Github pluginと同じく、**Available**から**slack**と検索し、インストールした後、リスタートするだけです。


## 最後に

最後に今回Jenkinsで扱ったリポジトリはこちらです。
[flask-docker](https://github.com/gkzz/flask-docker)
Dockerコンテナ上にflaskとnginxとuwsgiを使ってwebアプリを立ち上げるというものです。

[こちら](https://github.com/gkzz/jenkins-docker)のリポジトリでは、
jenkinsをDockerでMasterとSlaveの2つを立ち上げるまでをハンズオン形式でご紹介しているので、どうぞ。



※sudoをパスワード無しでするようにしています。(sudo脆弱性、、。)

```
ubuntu@ip:~$ sudo visudo
# 追加
jenkins ALL=NOPASSWD: ALL
```

参考
- ssh key
  [Generating a new SSH key and adding it to the ssh-agent](https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)
- jenkinsの初期設定が終わってから、あるいはプラグインをインストールした後、管理画面が真っ白になったままの場合
  [Jenkins - Setup wizard blank?](https://stackoverflow.com/questions/51300475/jenkins-setup-wizard-blank)
- Github webhook Payload URLの書式
[GitHub Plugin - Jenkins - Jenkins Wiki](https://wiki.jenkins.io/display/JENKINS/GitHub+Plugin)