Jenkinsのジョブの進化

Jenkinsのジョブの進化をみていくよ〜。

はじまりはシンプルだった

プロジェクトの成果物をチェックするために、チェッカを動かすジョブ check-project-artifacts を作る。

check_aというチェッカを動かす必要があり、そのチェッカを動かした後のワークスペースの成果物はこんな感じ:

check-project-artifacts:
  ./target/check_a-result

一般の開発者は check-project-artifacts のJenkins成果物をブラウザで開いて利用する。

チェッカが増えた

チェッカの種類が増え、もう1つのチェック check_b を実施することになった。

check-project-artifacts のジョブの最後にチェッカの追加をそのまま追加することにした。

check-project-artifacts:
  ./target/check_a-result
  ./target/check_b-result

さらにチェッカが増えた

更にチェッカの種類が増えた。(check_c)

このままチェッカを一つのジョブに追加しつづけると埒があかず、しかもチェッカを直列に実行していると遅いので、チェッカごとにジョブを分割することにした。

  • check-project-artifacts (もともとあったやつ)
    • check-project-artifacts_a (分割後)
    • check-project-artifacts_b (分割後)
    • check-project-artifacts_c (分割後)

それぞれ子供側のチェッカのジョブが終了したら、自分のチェック結果を成果物として保存し、 check-project-artifacts を後続ジョブとして呼ぶ。

check-project-artifacts ではそれぞれ分割したジョブから成果物をコピーし、そのまま自分のジョブ成果物として保存する。

check-project-artifacts:
  ./target/check_a-result
  ./target/check_b-result
  ./target/check_c-result

check-project-artifacts_a:
  ./target/check_a-result

check-project-artifacts_b:
  ./target/check_b-result

check-project-artifacts_c:
  ./target/check_c-result

一部のチェッカについて、実行時間が長いので並列化を検討する

check_b が長時間かかっているようなので、チェック対象となるプロジェクト成果物をある程度の単位(ここでは dirA,dirB,dicC)に切り分け、ジョブをさらに細かく分割する。

  • check-project-artifacts
    • check-project-artifacts_check_a
    • check-project-artifacts_check_b
      • check-project-artifacts_check_b_dirA (分割後)
      • check-project-artifacts_check_b_dirB (分割後)
      • check-project-artifacts_check_b_dirC (分割後)
    • check-project-artifacts_check_c

check-project-artifacts_check_bcheck-project-artifacts を分割した時と同様、分割したジョブが完了したら分割前の親ジョブを呼び、親ジョブで子ジョブの成果物を回収する。

ただし、分割された子ジョブの成果物はそのままでは分割されていて見づらいため、親ジョブで分割された成果物を結合する処理を実施する。

check-project-artifacts_check_b_dirA:
  ./target/dirA_check_b-result

check-project-artifacts_check_b_dirB:
  ./target/dirB_check_b-result

check-project-artifacts_check_b_dirC:
  ./target/dirC_check_b-result

check-project-artifacts_check_b:
  ./target/dirA_check_b-result (結合用)
  ./target/dirB_check_b-result (結合用)
  ./target/dirC_check_b-result (結合用)
  ./target/check_b-result (上記3ファイルを結合したもの)

(ほかのプロジェクトは省略)

で、何が言いたいの?

Jenkinsのジョブがこうやって成長と複雑化を遂げることを言いたかった。

また、上記のようなジョブの分割といった場合は前のエントリで紹介しているように、Job DSL Pluginを使うと簡単に好きなだけコントロール可能な方法で分割できます。