1225

Twitter:@dn0t_ GitHub:@ogrew

Declarative Pipelineでビルドパイプラインをコード管理する.

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:"
        }
    }
}

f:id:taiga006:20200108191048p:plain こんな感じでどのタスクにどれくらい時間がかかっているかなどを可視化できます。 f:id:taiga006:20200108191212p:plain Slackにもちゃんとメッセージが送られています。

※とはいえ、上のはあくまでサンプルです。ビルドどうこう言ってるのに'Finish Deploy'とか書いてます。変にコピペしないでね。

仮にJenkinsをわかっていなくてもおおよそこのスクリプトによってどのような手順で処理が進むのかわかると思います。 ちなみにslackSendコマンドはSlack NotificationというPluginを入れて設定すれば使用できます。bot_userを使うようにすればカスタマイズ性も高まります。(もちろん、他に設定でメールなども送れます。)

上でScripted PipelineのサンプルとDeclarative Pipelineのサンプルを勘違いするなよー、って書きましたが、見分け方は簡単でblockのトップがnode or pipeline かで見分けられます。(さらにpararell対応する前か後かみたいなのもあるようですが…)

参考

jenkins.io

www.blazemeter.com

cocodrips.hateblo.jp

b-side.work