GitHub
Jenkins
Webhook

WebhookとSCMポーリングの違い 〜JenkinsとGithubを連携させる〜

Jenkinsとは

Javaで書かれたオープンソースCIツール。

CIとは

Continuous Integration(継続的統合)。アプリ開発時の品質改善や納期短縮のための習慣。

わかりにくいので、もっと狭義に

ビルドやテストを頻繁に継続して行うことで、バグを早期に発見し、開発の効率・納期の短縮を実現させるための手法。
(ビルド:コンパイル〜ライブラリの依存解決〜パッケージ化のようなソースコードからリリース/デプロイ可能なモジュールを作成するまでのプロセス。)

イメージしにくいので、もっと具体的に

時間(何時間に一回とか)もしくはトリガー(Github上でプルリクエストが作られたらとか)を契機に、ビルドを実行するようにJenkins(CIツール)に設定しておいて、手動ではなく自動でビルドを継続的に行うこと。

何かしらのトリガーによりビルドを実行する場合、JenkinsとGithubを連携させる必要があるが、方法としては
1. GithubにWebhookを掛けておく。
2. Githubに対してSCMポーリングを行う。
3. の2パターンがある。

WebhookとSCMポーリングの違い(本題)

Webhook

Webサービス(今回はGithub)に投げ先のURL(JenkinsのURL)を指定して、POSTリクエストを投げてもらう仕組み。
Github上でプルリクエストが作成されたとか、リモートからプッシュされたとかをトリガーにしてGithubからJenkinsにPOSTリクエストを投げてもらう。

SCMポーリング

SCM

Software Configuration Management(ソフトウェア構成管理)。
GitとはSVNとかはこれを実現させるためのツール。

ポーリング

複数のコンピュータが接続されているネットワークでアクセスの競合を避けたり、準備ができているか、死活監視の意味も込めて、送信要求がないか定期的に問い合わせを行う通信方式。(本来の意味)

これらを踏まえてSCMポーリングとは

JenkinsからGithubに対して定期的に問い合わせを行う方式。なので、やりすぎるとGithubに負荷がかかる。

まとめ

JenkinsとGithubを繋ぐための方法として、WebhookとSCMポーリングの二つがありますが、
1. WebhookはGithub発信でビルドの契機となるPOSTリクエストをJenkinsに送ってくれる仕組み。
2. SCMポーリングはJenkins発信でビルドの契機となるGithubへの問い合わせを実施する仕組み。
なので、実際にビルドが実施されるところがJenkinsだと考えると、WebhookはPush型の通知みたいなもの、SCMポーリングはPULL型の通知みたいなものだと理解すると良いのではないかなと思います。