2014/02/17更新

[GruntJS] gruntからJenkinsのジョブを実行する

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
今日はライトなネタですが、gruntからJenkinsのジョブを開始する方法をブログに書きたいと思います。

画像

引用:http://flic.kr/p/jvGd6b




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を実行しようなんて思ってもみなかったですが、環境が変われば使い方も変わるもんですね。

最後までご覧頂きましてありがとうございました。





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。