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


はじめに

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

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

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

全体の構成

環境/バージョン情報

  • 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と検索するとインストールされていることが確認できる

鍵とssh-agentの設定

  • 秘密鍵のファイル名は~/.ssh/id_rsa、パスフレーズは無しとした
ubuntu@ip:~$ sudo su - jenkins
jenkins@ip:~$pwd
/var/lib/jenkins
$ ssh-keygen -t rsa -b 4096 -C "[email protected]"
> 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 [email protected]
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 projectProject urlに✔を入れる
  • githubのリポジトリをHTTPSでクローンするときのURLをコピーし、ペースト
  • Source Code Managementまでスクロールし、Gitに✔を入れる
  • Repositories付近のRepository URLにはSSHでクローンするときのURLをペースト
  • Credintialsの右となりのAddをクリックし、出てきたポップアップの項目にはそれぞれ以下を選択、あるいは入力
項目
Kind SSH Username with private key
Usernmae jenkins
Key 先ほどコピーした~秘密鍵      

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

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

  • Credintialsのところにjenkinsと入っていればOKです。
  • Branches to buildの右隣のBranch Specifier (blank for 'any')にはジョブを実行したいブランチ名、あるいはその一部を記載
  • Build Triggersまで下にスクロールし、GitHub hook trigger for GITScm pollingをクリック
  • Buildの箇所まで下にスクロールし、Add build step >> Execute shellの順番にクリックし、実行したいコマンドを入力
  • 僕が今回使ったリポジトリをそのまま使う場合はこんなかんじです。 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

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

githubのwebhookを使う場合の設定

項目
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

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

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

jenkinsでポーリングして行う場合の設定

  • Build TriggersGitHub hook trigger for GITScm pollingから✔を外し、代わりにPoll SCMに✔をつける
  • githubのwebhookの設定を解除
  • Scheduleの右隣りの枠にCronで設定するように記載。

これだけです。

結果の確認方法

  • 管理画面から確認したいジョブ名をクリック

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

  • Console Outputをクリック
  • 末尾にFinished: SUCCESSと出力されていればジョブは成功しています。

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
Dockerコンテナ上にflaskとnginxとuwsgiを使ってwebアプリを立ち上げるというものです。

こちらのリポジトリでは、
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
- jenkinsの初期設定が終わってから、あるいはプラグインをインストールした後、管理画面が真っ白になったままの場合
Jenkins - Setup wizard blank?
- Github webhook Payload URLの書式
GitHub Plugin - Jenkins - Jenkins Wiki