Jenkinsで複数のジョブ実行をパイプライン化させる際に、メンテナンス性を考えてPipeline as Codeさせることにしました。 (Pipeline as Codeって普通に書きましたが、ググるとJenkinsの話しか出てきません。)
JenkinsでPipeline as Codeさせるのには専用のDSLが存在し、それを使ってJenkinsfileを書くことができます。ただし気をつけなければいけないのはこれには2つの記法が存在していて、一つは初期のScripted Pipeline
というもので、こちらは現在は使用が推奨されていません(とはいえケースバイケースのようですが)。
ただ、インターネットに転がっている適当なスクリプトを「自分のところでもだいたい用法同じだから!」ってコピペして使おうとすると結構な割合でこちらの古い構文のものにぶちあたるので注意が必要です。(私はそうなりました。)
ということで今回は新しいほう(といっても3年ほど前に出た)のDeclarative Pipeline
で単純なサンプルを書きました。
pipeline { agent any // どのノードで実行するか決める environment { // 環境変数をセットする workspace = "/path/to/jenkins/workspace" export_dir = "/path/to/jenkins/export" } stages { stage('build') { steps { echo 'Start Build' build job: 'build' echo 'Finish Build' } } stage('backup') { steps { echo 'Start Backup' build job: 'backup' echo 'Finish Backup' } } stage('test') { // test1 とtest2 は並列で実行される parallel { // stageの下で宣言 stage('test1') { sh './do_test1.sh' sleep 5 } stage('test2') { sh './do_test2.sh' sleep 5 } } } stage('deploy') { steps { echo 'Start Deploy' build job: 'deploy' echo 'Finish Deploy' } } } post { always { echo '<--------all process has done.-------->' deleteDir() // 事後はワークスペースをきれいにする } success { echo 'SUCCESS :)' slackSend channel: '#notifiy', color: 'good', message: "ビルドが完了したよ :smiley:" } unstable { echo 'UNSTABLE :\' slackSend channel: '#notifiy', color: 'warning', message: "ビルドが終わらなかったよ :thinking_face:" } failure { echo 'FAILED :(' slackSend channel: '#notifiy', color: 'danger', message: "ビルドが失敗したよ :zany_face:" } } }
こんな感じでどのタスクにどれくらい時間がかかっているかなどを可視化できます。 Slackにもちゃんとメッセージが送られています。
※とはいえ、上のはあくまでサンプルです。ビルドどうこう言ってるのに'Finish Deploy'とか書いてます。変にコピペしないでね。
仮にJenkinsをわかっていなくてもおおよそこのスクリプトによってどのような手順で処理が進むのかわかると思います。
ちなみにslackSendコマンドはSlack Notification
というPluginを入れて設定すれば使用できます。bot_userを使うようにすればカスタマイズ性も高まります。(もちろん、他に設定でメールなども送れます。)
上でScripted Pipeline
のサンプルとDeclarative Pipeline
のサンプルを勘違いするなよー、って書きましたが、見分け方は簡単でblockのトップがnode or pipeline かで見分けられます。(さらにpararell対応する前か後かみたいなのもあるようですが…)