Jenkins と Github を連携させる
Jenkins と Github を連携させるための手段として、Webhook と SCMポーリングの二つあると思いますが、違いをまとめてみました。理解を深めるためにまずは予備知識を下に並べます。
Jenkinsとは
Javaで書かれたオープンソースCIツール。
CIとは
Continuous Integration (継続的統合)。アプリ開発時の品質改善や納期短縮のための習慣。
習慣とかわかりにくいのでもっと狭義に言うと
ビルドやテストを頻繁に継続して行うことで、バグを早期に発見し、開発の効率・納期の短縮を実現させるための手法。
(ビルド:コンパイル〜ライブラリの依存解決〜パッケージ化のようなソースコードからリリース/デプロイ可能なモジュールを作成するまでのプロセス。)
手法とかイメージしにくいのでもっと具体的に言うと
時間 (何時間に一回とか) もしくはトリガー (Github上でプルリクエストが作成されたらとか、コミットされたらとか) を契機に、ビルド環境に対象のリポジトリのブランチのソースを clone し、ビルドを実行するようにJenkins(CIツール)に設定しておいて、手動ではなく自動でビルドを継続的に行うこと。
何かしらのトリガーによりビルドを実行する場合、Jenkins と Github を連携させておく必要がありますが、手段としては
- Github に Webhook を掛けておく。
- Github に対して SCMポーリングを行う。
の2パターンがあります。
(ここから本題) WebhookとSCMポーリングはどう違うのか?
Webhook とは?
Webサービス(今回はGithub)に投げ先のURL(JenkinsのURL)を指定して、POSTリクエストを投げてもらう仕組み。
Github上でプルリクエストが作成されたとか、リモートからプッシュされたとかをトリガーにしてGithubからJenkinsにPOSTリクエストを投げてもらう。
Github のここで設定するやつですね。
SCMポーリングとは?
そもそも SCM とは
Software Configuration Management(ソフトウェア構成管理)。
GitとはSVNとかはこれを実現させるためのツール。
そもそもポーリングとは
複数のコンピュータが接続されているネットワークでアクセスの競合を避けたり、準備ができているか、死活監視の意味も込めて、送信要求がないか定期的に問い合わせを行う通信方式。(本来の意味)
踏まえてSCMポーリングとは
JenkinsからGithubに対して定期的に問い合わせを行う方式。(なので、やりすぎるとGithubに負荷がかかる)
(+α) JenkinsでのSCMポーリング設定方法
プロジェクト > 設定 > ビルドトリガ から設定できます。
このようなプラグインを使えば、ポーリングの即時実行もできるようです。
https://wiki.jenkins.io/display/JENKINS/PollSCM+Plugin
まとめ
JenkinsとGithubを繋ぐための手法として、WebhookとSCMポーリングの二つがありますが、
- Webhook は Github発信でビルドの契機となる POSTリクエストを Jenkins に送ってくれる仕組み。
- SCMポーリングは Jenkins発信でビルドの契機となる Github への問い合わせを実施する仕組み。
という、(Jenkins から見て) 能動/受動の違いがあります。
実際にビルドが実施される環境が Jenkins なので、Jenkins の立場的には、Webhook は Push型の通知みたいなもの、SCMポーリングは PULL型の通知みたいなものだと理解すると良いのではないかなと思いました。