[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を実行しようなんて思ってもみなかったですが、環境が変われば使い方も変わるもんですね。最後までご覧頂きましてありがとうございました。