はじめに
本記事では、表題の通りGithubのプライベートリポジトリと、EC2上のJenkinsとを連携させ、特定のブランチでの変更をJenkinsに検知させる方法について記す
Jenkinsが特定のブランチでの変更を検知する方法は、以下の二通りがある
- Jenkinsが、特定ブランチでの変更があったかどうかをポーリングをする方法
- 特定ブランチで変更があった際に、GithubがJenkinsに都度通知する方法
本記事では、 後者の「特定ブランチで変更があった際に、GithubがJenkinsに都度通知する方法」について解説する
Jenkinsのインストール
こちらの記事を参考にした。自分はUbuntu20.04を使用しているが、この記事にある方法で問題なくインストールできた
Ubuntu18.04にJenkinsをインストールする
公式のドキュメントはこちら
※Jenkinsをインストールする前に、Javaをインストールする必要があるので注意
JenkinsにGit Pluignを入れる
自分はJenkinsにおすすめされたプラグインを入れたのだが、その際に今回の設定に必要なプラグインがインストールされていた
おそらく今回の設定に必要なプラグインはGit Pluginで、もしインストールされていなければインストールする必要がある(もし他に必要なプラグインがあれば、誰か教えて頂けると嬉しいです)
インストール手順は以下の通り
公開鍵・秘密鍵の作成
Githubで公開鍵の登録、およびJenkinsで秘密鍵の登録をする必要があるため、秘密鍵と公開鍵を作成する
まずは、EC2にルートユーザでログインし、ログイン後Jenkinsユーザに切り替える
sudo su jenkins
鍵を生成する方法が書かれた記事は山ほどあるので、あえてここでは書かず、オススメのリンクだけ貼っておく
結果的に、Jenkinsユーザの~/.sshに公開鍵と秘密鍵がある状態になればok
鍵を生成する方法は、以下のサイトが分かりやすいかも
Linuxコマンド【 ssh-keygen 】認証用の鍵を生成 - Linux入門 - Webkaru
公開鍵暗号の方式については、以下の記事が分かりやすいかも
2017年版 SSH公開鍵認証で使用する秘密鍵ペアの作り方
Jenkinsの設定
JenkinsではJobを作成し、同時に秘密鍵を登録する
まず、前準備として、認証トークンを作成する(今回はadminユーザを使用)
Jenkinsの管理からユーザーの管理をクリック

APIトークンという項目で、Add new Tokenをクリックし、トークン名を入力したのち、Generateをクリック

この11ac5c....b3128の文字列はこのタイミングしか表示されないので注意
確実にコピーしておく
適当なJobの名前を入力し、「フリースタイル・プロジェクトのビルド」を選択

GitHub projectにチェックを入れ、Project urlを入力

ビルドのパラメータ化にチェックを入れ、パラメータの追加をクリックし、文字列を選択し、名前の欄にpayloadと入力

リポジトリURLは、以下の図の真ん中らへんにある、git@から始まるやつ

種類にはSSHユーザ名と秘密鍵を選択し、ユーザ名をJenkinsにし、先ほど作成した秘密鍵を直接入力する

ブランチ指定子には、例えばmasterブランチをビルドする場合は、上の画像のように*/masterと入力すれば良い
続いて、ビルド・トリガの項目で、「リモートからビルドを選択」
認証トークンの欄には、先ほど作成した認証トークンの名前を入力する
後は、GitHub hook trigger for GITScm pollingにチェックを入れる

Jenkinsのジョブ作成は以上です、お疲れさまでした
Githubの設定
Githubに先ほど作成した公開鍵を登録し、その後Webhookの設定をする
Githubで公開鍵を登録
先ほど作成した公開鍵を、リポジトリの作成者の設定画面に行き、SSH and GPG keysからNew SSH keyをクリック

Titleに適当な名前を入力し、Keyのところには先ほど作成した公開鍵を入力する

Webhookの設定
リポジトリの画面から、Setting->Webhookを選択し、Add webhookをクリック

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を設定してみる - ぴよ丸水産
JenkinsとGitHubのWebhook連携の整理 │ Aiming 開発者ブログ
もしうまくいかない場合
以下の記事に書かれているように、EC2のセキュリティグループの設定を変更する必要があるかもしれない
Jenkins で GitHub のイベントを受けてゴニョゴニョする準備 - Qiita
https://api.github.com/meta の"hooks"に記載されたIPを許可すればうまくいくかも
ポート番号については、以下のページを参考にすると良い
ネットワークポート - GitHub Doc










