ファイル更新があった場合だけJenkinsでジョブを走らせるFile System SCMプラグインの紹介

GRIPHONE Advent Calendar 2018 24日目の記事を担当しますエンジニアの西村(大)です。

特定のディレクトリ以下で更新があった場合だけJenkinsのジョブを走らせるプラグインを紹介したいと思います。

※この記事はGRIPHONE Advent Calendar 2018 24日目の記事です。
https://qiita.com/advent-calendar/2018/griphone
https://adventar.org/calendars/3147

読むの面倒な人向けまとめ

Pullしまくるジョブで疑似Webhookをして、File System SCMプラグインを使って特定のディレクトリ以下で更新があった場合だけジョブを走らせる

やり方

Gitなどのバージョン管理のシステムを使う場合でWebhookを使える場合は良いのですが、

社内インフラからしか接続できないPCでGitと連動したいけど、Webhookが使えず不便だと感じる事が多いですよね。

※ GitでWebhookを使う場合は下記リンクが参考になります。

JenkinsとGitHubのWebhook連携の整理

こういう場合はGitからPullしまくるジョブを作れば良いのですが、その中で特定ディレクトリ以下で更新のあった場合だけジョブを動かしたい、そんな事ありませんか?

「ビルド」の「シェルの実行」でごにょれば良いのですがわざわざごにょるの面倒ですよね?

そんな時は

https://wiki.jenkins.io/display/JENKINS/File+System+SCM

このプラグインを使えば、対象のディレクトリ以下でファイルの更新があった場合ジョブが動く、というものが簡単に出来ます。

設定は上画像のように簡単にできます。

ソースコード管理で「File System」を選択して、「Path」で更新があった場合ジョブを走らせたいパスを指定します。

ビルド・トリガで「SCMをポーリング」を指定して実行間隔を指定します。

設定はこれだけで特定のディレクトリ以下で更新があった場合に動くジョブ作れます。

これを組み合わせたジョブ

「GitでPullしまくるジョブ」 → 「特定のディレクトリ以下で更新があった場合だけ動かしたいジョブ」

という風にすれば疑似WebHookとファイル更新があった場合だけ動くジョブが簡単に作れます。

弊社ではこれを使って特定のディレクトリに更新があった場合だけAssetBundleのビルドをしております。

画像・音声・BGM・SEなどでビルドを分けており、ビルドの時間の短縮に役立っております。

このプラグインを使った動かし方で欠点を挙げるとすれば、このプラグラインを使ったジョブの最初にファイルの更新をチェックする処理が走るようなのですが、PCのスペック次第だと思いますがファイル数が増えてくるとチェックに時間(約4万ファイルで2-3分)が掛かります。

最後に

CircleCIなどを使えばもっとスマートに出来るかもしれませんが、Jenkinsでも工夫をすれば上記のような事が出来ます。

もし社内にJenkinsを置いている状況で上記のような事があれば、上記のやり方を検討してみては如何でしょうか。