2016年8月9日火曜日

[Jenkins] Pipeline Plugin を使ってみた

Jenkins LTS も2系がリリースされたことですし、そろそろ本格的に移行を始めないとまずいよなーということで構築中です。


まずは、普段一番よく使っている svn のコミットを git にプッシュするジョブを移植しました。
(本当は逆がいいんだけど、そのうち開発フローを見直す予定…)
できたのがこちら。ちょっと詰まったところだけ解説していきます。
node {
    withEnv(['SVN_LOGFILE=..\\svnlog.txt']) {
    stage 'make commit message'
    
    env.SVN_REPO = SVN_REPO
    env.ISSUE_NUMBER = ISSUE_NUMBER
    if( CommitMessage == "" ) {
        bat '''
        for /f "tokens=1,2" %%i in ( \'svn info http://svn.osdn.jp/svnroot/iutest/%SVN_REPO%\' ) do (
          if "%%i" == "Revision:" (
            call :setr %%j
            goto :EOF
          )
        )
        goto :EOF
        :setr
        chcp 65001
        SET LANG=ja_JP.UTF-8
        SET REVISION=%1
        if exist %SVN_LOGFILE% del /F %SVN_LOGFILE%
        for /f "skip=2 eol=- tokens=*" %%c in ('svn log http://svn.osdn.jp/svnroot/iutest/%SVN_REPO% -r HEAD') do (
            @echo %%c >> %SVN_LOGFILE%
        )
        if "x%ISSUE_NUMBER%" == "x" (
            @echo update r%REVISION% >> %SVN_LOGFILE%
        ) else (
            @echo update r%REVISION% #%ISSUE_NUMBER% >> %SVN_LOGFILE%
        )
        '''
    } else {
        env.COMMIT_MESSAGE = CommitMessage
        bat '''
        chcp 65001
        SET LANG=ja_JP.UTF-8
        echo %COMMIT_MESSAGE% > %SVN_LOGFILE%
        '''
    }
    bat '''
    @echo off
    chcp 65001
    SET LANG=ja_JP.UTF-8
    type %SVN_LOGFILE%
    '''

    stage 'git clone'
    deleteDir()
    git branch: 'develop', url: 'git@github.com:srz-zumix/iutest.git'

    stage 'svn export'
    bat 'rm -rf *'
    bat 'svn export --force http://svn.osdn.jp/svnroot/iutest/%SVN_REPO% ./'
    
    stage 'git commit'
    bat 'git add .'
    bat 'git commit -a -F %SVN_LOGFILE%'
    
    stage 'git push'
    //input 'git push OK?'
    bat 'git push git@github.com:srz-zumix/iutest.git develop'
    }
}

どうしたら良いかわからない
Pipeline script をいざ書こうと設定を開いたものの…
どう書けばいいのかサッパリわからない。。。

まず何をしたらいいのか分からない迷子状態です。
第7回大阪Jenkins勉強会の LT を思い返すと、スクリプトを Generate してました。

ということで、Pipeline Syntax を使ってみます。



① Sample Step から「bat: Windows Batch Script」を選んで出てくる ②「Batch Script」にバッチ処理をコピペで③「Generate Groovy」を押すと、スクリプトがに ④ に出てきます。


あれ?これで終わりじゃない?
でも、これじゃあ Pipeline になってないし、こんな感じにしたい!(し、まだ問題がある)

https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Stage+View+Plugin

ということで、次のステップ。
ステージを追加します。

ステージ
ここは詰まってないです。Pipeline Syntax で「stage」を選択して Generate すると
stage 'git push'
こんなスクリプトが出てくるので、コピーするだけ。簡単です。

問題はどうステージに分けるかですが、今回は以下のようにしました。
  1. コミットメッセージの作成
  2. git clone
  3. svn export
  4. git commit
  5. git push

ビルドパラメータを参照する
ビルドパラメータの参照ですが、今までのバッチ処理では環境変数として参照できていたので、Pipeline のバッチ処理でも環境変数で参照できると思ったのですが、そうでもないようです。

node {
    stage 'env'
    bat 'echo %TEXT_PARAM%'
}

このように「ECHO は <ON> です。」と出力されます。


では、どうしたらよいか。
Getting Started with Pipeline
こちらによれば、ビルドパラメーターは Groovy の変数としては見えるようです。

というわけで、以下のように環境変数に set して対応しました。

node {
    stage 'env'
    env.TEXT_PARAM=TEXT_PARAM
    bat 'echo %TEXT_PARAM%'
}

これでビルドパラメーターがバッチ処理から見えるようになりました。

input
動作確認ができるまで、最後の git push ステージに input を入れて push されないようにして検証してました。
これなんですが、第7回大阪Jenkins勉強会のときに川口さんがもっといい方法があるよ~的なことを言っていた気がしたのですが、忘れてしまいました。。。
なんだっけなぁ

最後に
最後に出来上がったパイプラインの実行結果です。


さらに、せっかくなので blueocean で表示。

blueocean についてはこっちを参照してください。
ブログズミ: [Jenkins] Blue Ocean を試してみる


さて、これで Pipeline がどんなものか分かりました。
これからは積極的に使っていこうと思います。
では。


0 件のコメント:

コメントを投稿