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_b
は check-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を使うと簡単に好きなだけコントロール可能な方法で分割できます。