[GruntJS] gruntからJenkinsのジョブを実行する
こんにちは、@yoheiMuneです。
今日はライトなネタですが、gruntからJenkinsのジョブを開始する方法をブログに書きたいと思います。
例えば、以下のURLのようなジョブがある場合、
今回は、この仕組みを使って、gruntからJenkinsのジョブを実行しようと思います。
ということで、ファイル保存からJenkinsビルドまでスムーズに行うためには、「?delay=0sec」というパラメーターを付与することが重要です。
最後までご覧頂きましてありがとうございました。
今日はライトなネタですが、gruntからJenkinsのジョブを開始する方法をブログに書きたいと思います。
JenkinsのジョブをJenkinsの画面以外から起動するには
Jenkinsのジョブを開始するには、Jenkinsの画面でビルドボタンをポチッと押す以外にも、HTTP通信を使ってジョブを開始することができます。例えば、以下のURLのようなジョブがある場合、
#「build_frontend_module」という名前のジョブ http://localhost:8080/job/build_frontend_module/以下のURLにHTTP通信でアクセスすることで、ジョブを起動することができます(※1)。
http://localhost:8080/job/build_frontend_module/buildまた、何らかのパラメーターを付与してビルドしたい場合には(例えばgitのブランチ名をパラメーターで指定したい場合には)、
http://localhost:8080/job/build_frontend_module/buildWithParameters?PARAM=VALUEといった感じで、パラメータ付きビルドを行うこともできます。
今回は、この仕組みを使って、gruntからJenkinsのジョブを実行しようと思います。
※1 詳細は、JENKINS/Remote+access+APIを参照ください。
準備:npmインストール
gruntで上記のURLアクセスをするために、grunt-execというnpmモジュールを使います。インストールは以下のように行います。$ npm install grunt-exec --save-devまた、watchを使ってファイル保存のたびにJenkinsビルドを行いたいので、grunt-contrib-watchも導入しておきます。
$ npm install grunt-contrib-watch --save-devこれで準備は完了です。
Gruntfile.jsの作成と実行
それではGruntfile.jsを作成します。以下のように記載します。
module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-exec');
grunt.loadNpmTasks('grunt-contrib-watch');
// プロジェクト全体で利用するconfigを設定
grunt.initConfig({
// watch
watch: {
html: {
files: ['./html/**/*.html'],
tasks: ['exec:jenkins_html']
}
},
// exec
exec: {
jenkins_html: {
command: 'curl http://localhost:8080/job/copy_html_to_jetty/build'
}
},
});
grunt.registerTask('default', ['watch']);
};
上記では、execでcurlを使って(※2)、Jenkinsに対してHTTPリクエストを送信しています。
そしてHTMLファイルをwatchして、HTMLファイルの変更の度に、Jenkinsのビルドを自動で行うという仕組みを構築しています。
以下のように利用します。# とりあえずGruntからJenkinsジョブを起動してみたい場合 $ grunt exec # watchを使って、htmlの変更の度に、Jenkinsジョブを起動したい場合 $ grunt watchこれで、GruntからJenkinsのジョブを起動することができました。
※2 Windowsではcurlを使うことができません。cURLなどを別途インストールしてください。
+1:即座に実行する
さて、上記の実装でJenkinsのジョブを起動してみると、1つ分かる事があります。 それは、GruntからJenkinsのジョブをキックした際に、実際にジョブが開始されるまでにタイムラグがある、ということです。 これは、JenkinsがHTTPリクエスト経由のジョブ開始に対して、5秒間の保留時間をデフォルトで設定しているためです。 以下のように、delayパラメータを付与することで、即座にジョブを実行することができます。
http://localhost:8080/job/copy_html_to_jetty/build?delay=0sec
ちなみに何で5秒なんだろうと気になって、Jenkinsのソースコードを調べてみました(該当箇所はこちらのgetQuietPeriodメソッド)。ベタッと「5」という数値が書かれていますね。何かのノウハウなんだろうなぁーと理解。ということで、ファイル保存からJenkinsビルドまでスムーズに行うためには、「?delay=0sec」というパラメーターを付与することが重要です。
最後に
今の仕事では、フロントサイドとサーバーサイドでビルドを共通化するために、Jenkinsが導入されています。 今まではGruntからJenkinsを実行しようなんて思ってもみなかったですが、環境が変われば使い方も変わるもんですね。最後までご覧頂きましてありがとうございました。

