はじめに
本記事では、表題の通り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