この記事はtomita@atuwebがお届けします。

Jenkins-cliを利用して「ジョブをチェーン」する方法を調べてみました。

やりたかったこと

  • 粒度の細かいジョブを複数作成し、「ジョブAを実行したら、続けてジョブBが実行される」仕組みを用意する。
  • しかし、「ビルドまで」「デプロイまで」といったゴールを柔軟に実行できるようにする。

用意したジョブ

Java + Spring + Mavenのプロジェクトで、warを更新しサーブレットコンテナに反映するまでの一連の処理をそれぞれジョブ化しました。

プロジェクトの構成は次の記事に紹介したものです。

[Java][Spring]Springのオレオレプロジェクト構成をチラ見せ!
Spring Frameworkで開発した、稼働実績があるプロジェクトの構成をご紹介いたします。 バージョンは以下の通りです。...

必要なジョブは、具体的にはこんな感じです。

  1. Gitリポジトリ更新
  2. 親プロジェクトのコンパイルとmvnローカルリポジトリへのインストール
  3. 子プロジェクトのコンパイルとwarの生成
  4. warをサーブレットコンテナへコピー
  5. サーブレットコンテナのリスタート

「ジョブを意味のある最小単位で構成し、ジョブをチェーンして運用すると幸せになれる」とおっしゃるJenkinsマイスターの教えに従い、上のようにジョブを細かく分けています。

時にwarだけ作ってサーブレットコンテナに配置したくないというケースがありますし、親プロジェクトに変更がないなら、コンパイルしてもしなくても(mvn installをスキップしても)子プロジェクトに影響はありませんね。

他のビルドを実行する

ビルドをチェーンする、一番シンプルな方法が他のビルドを実行するです。

ジョブの設定項目にあり、ビルド結果によって処理を分けることができますので、通常はこちらで問題ないでしょう。

このジョブの結果は次の3つから選択できます。

  • 成功したとき
  • 失敗したとき
  • 成功・失敗にかかわらず実行

そして、下流に指定するジョブは複数設定することができますので、結構柔軟ではあります。

今回のお話も、手っ取り早い方法は下流プロジェクトにビルドを流すことで、「成功した場合のみ下流を呼び出す」ようにしておけば、1つのトリガであとはJenkinsに仕事を任せることができます。

しかしながら、仕組み上「ある時はステップ1だけでとめたい」という、あいまいな状況には対応していません。
まあ、レアなケースだと思いますが。

cURLからジョブを実行する

これはうまくいかなかったケースです。

外部からJenkinsジョブを実行する手段の一つとして、cURLがあります。

次のように、curlコマンドでJenkinsジョブのURLにアクセスするだけです。

curl http://192.168.1.17:8080/job/WAR_Update/build

curlコマンドでジョブを指定するだけのお手軽実行ですね。
しかし、Remote APIの仕様か、リクエストを投げっぱなしで結果を受け取ることが難しそうでした。

そのため、「成功したときだけ次のビルドを実行」するということが難しく、今回やりたいことには沿いませんでした。
ガックシ

※結果を取得する方法をご存知の方は教えてください。

Jenkins-cli

そこでJenkins-cliです。

Jenkins-cliは名前の通り、Jenkinsのコマンドライン実行ツールです。

今回初めてその存在を知りましたが、これが万能で、ビルドの結果を取得するのも簡単に実現可能でした。

java -jar ${JENKINS_HOME}/userContent/jenkins-cli.jar -s ${JENKINS_URL} build WAR_Update -s

日本語サイト

Jenkins CLI
https://wiki.jenkins-ci.org/display/JA/Jenkins+CLI

ビルド実行のほか、ジョブの作成、複製、プラグインのインストールなどもできるようです。

ダウンロードと設置

上記サイトのダウンロードリンクが切れているようでした。

curlコマンドから

curlコマンドから以下コマンドでDLできます。

curl wget http://localhost:8080/jnlpJars/jenkins-cli.jar -O > jenkins-cli.jar

ネット上から

Windowsマシンでは標準でcurlコマンドが利用できませんが、サーチエンジンで「sourceforge, jenkins-cli」で検索すればDLサイトがヒットしてDLできました。

設置

特に制限はないようです。
私は、ホーム以下に設置しました。

最終的なビルド構成

単発のジョブと、単発のジョブをシーケンシャルに呼び出すためのジョブを用意しました。

war-update

  • git更新
  • core install
  • war package

Git更新して最新のWARを生成するジョブです。

war-release

  • サーブレットコンテナへwarをコピー
  • サーブレットコンテナのリスタート

最新のWARをサーブレットコンテナに反映するためのジョブです。

war-deploy

Git更新、WAR生成、サーブレットコンテナ反映と、上記をすべて実行するためのジョブです。

デメリット

今回は単発ジョブをまとめて呼び出すジョブを用意しました。

この形のデメリットとして、「Jenkins-cliを実行するジョブ」と「jenkins-cliから呼び出されたジョブ」の2つがビルド実行状態となるため、常にビルドのライン2本を占有してしまう点があります。

デフォルトはビルド2本ですから、デフォルト値から変更しないと、コンパイル中は何もできないことになってしまい、これが終わらなければ、他に何もできないことになってしまいます。
(実際には次に実行するジョブがキューに入り、ジョブが割り込みは可能ですが、これが遅い遅い、、、)

同時並行に走らせる予定のジョブが存在する場合は、デフォルト値の変更を検討してください。

おわりに

今回のお話は、そもそもが「ジョブが細かすぎないか」とか、「常に最新のwarを用意しておけば解決」できそうですが、、、せっかく覚えたことですし、ユースケースの一つとしてご紹介いたしました。

便利なjenkins-cli利用の参考になれば幸いです。

また、Jenkinsはさまざまな利用シーンがあります。
もっと活用して面倒な人間の手間をドンドン巻き取ってもらうことが幸せなプロジェクトへの一歩となりますから、Jenkinsを使ってCIを実現した生産性の高いプロジェクトが増えることを祈っています。
(結構使っわれてないです、、、)


参考

Developers.IO
Jenkinsの使い勝手をよくするための見直し6点
http://dev.classmethod.jp/tool/jenkins/jenkins-refactoring-jobs/
(クラスメソッドさんリスペクトです。まさに玄人集団!)

blog.hansode.org ビールをツマミにビールを飲む
#JenkinsCI CLI(jenkins-cli.jar)でジョブをbuildする
http://blog.hansode.org/archives/52688291.html

スポンサーリンク
ad_336
ad_336
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存