スキップしてメイン コンテンツに移動

Reading: Jenkins2: Up and Running - Jenkins v2 落ち穂拾い

設定をしていく上で書籍内を再訪した内容とかの落ち穂拾い。

記述的パイプラインの話


宣言的パイプラインと対の関係として紹介される、記述的パイプライン(これで訳がいいのか自信ないけど)については、次の記述がわかりやすかった。

The script Statement
The script DSL statement is a special statement intended just for use in Declarative Pipelines; it allows you to define a block/closure that can house any nondeclarative code. As you may have guessed, the name is a reference to "Scripted" Pipelines.

出典:"Jenkins2: Up and Running" Chapter 7. Declarative Pipelines

Declarative Pipeline内で、宣言的ではない処理(e.g. 変数宣言とか)を呼び出すにはScriptというStatementを使う。で、その中に書いている内容こそ、まさにDeclarative Pipelineではない場合に使われるScripted Pipelineそのものなんだなと理解した。


処理を止めないスクリプト


シェルスクリプトを実行する時、Jenkinsのデフォルトの振る舞いとしては、複数行あるスクリプトのどこかで死んだらその後の処理は実行されないことになってる。
それでは困る時にはどうするかというと、普段のシェルスクリプトでそうするように、オプション(e)をsetで足せば良いみたい。
ちなみに、Jenkinsは自動で各ステップの実行内容を出力するオプション(x)をつけてくれているので、それが嫌だったら、同様の方法で対応できるとのこと。

なので、まとめると次のようにすれば、タイポしているechというコマンドの行の後続のecho LINE2についても実行してくれる。

If you want to turn both options off, you can combine them in one set command, as shown in here:

    sh '''set +xe
          ech LINE1
          echo LINE2'''

This code will not echo out the lines as it executes them and will not stop for an error, so the output will look like this:

[Pipeline] {
[Pipeline] sh
[sh-test2] Running shell script
+ set +xe
/home/jenkins2/worker_node1/workspace/sh-test2@tmp ... ech: not found
LINE2
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS


出典:"Jenkins 2: Up and Running" Chapter 11. Integration with the OS (Shells, Workspaces, Environments, and Files)

Blue Oceanの便利機能の想定

Blue OceanではTestとArchiveというViewが用意されている。
プロジェクトでRustを使ったテストをしているので、テストフェーズはあるけれど、そこには表示されなかった。
また、Archiveには常に実行時のログだけが表示されていた。

これを使うにはいくつかの対応が必要や、Jenkinsの想定にあわせ込みが必要みたい。
まずTestについては、JUnitのテスト結果のXMLのスタイルが必要な様子。Java、あるいはJVM系の言語以外だとJUnitと同様のスタイルのテスト結果管理ってどれくらい普遍的なものなんだろう......。
またArchiveについては出来上がったビルド結果についてArchiveに置く設定を書いてあげればいいみたいなのでそんなに難しくなさそう。
どれくらいの期間・数、それを保持するかによって、ストレージを逼迫しそうだから、それも設定としてどこかでやった方がいいんだろうね。

    post {
        always {
            archiveArtifacts artifacts: 'build/libs/**/*.jar',
              fingerprint: true
            junit 'build/test-results/**/*.xml'
        }
    }

出典:"Jenkins2: Up and Running" Chapter 13. Integrating Artifact Management


書籍の中だと、Artifactoryとの連携も書かれていて、以前に自分がやっていたGitHubへのやや無理やりなリリース処理よりは幾分マシなリリースマネジメントができそうなんだなとも思った。


ワークスペースの掃除

ワークスペースは自動できれいにはされない。そのため、次のように指定して、不必要なものを掃除するのを明示する必要がある。

cleanWs patterns: [[pattern: '*.bak', type: 'INCLUDE'],
[pattern: '*.tmp', type: 'INCLUDE']]

出典:"Jenkins 2: Up and Running" Chapter 11. Integration with the OS (Shells, Workspaces, Environments, and Files)


エージェントの指定

同じ内容について書籍でも触れられていたけど、一つのJenkinsfile内で複数のエージェントを使い分けるときの指定方法は少しだけ注意が必要だった。
感覚的に、トップレベルに置いたものが各ステージに適用されるのは多分、誰もが同じようなイメージだと思う。
他方で、そこから上書きしたいといったときの挙動が自分の想定と違った。

もし各ステージの中でエージェントを変える場合には、トップレベルをnoneにした上で、各ステージでエージェントの指定をするみたい。各ステージで指定すると上書きしてそのエージェントを使う、というイメージでいたので、エラーに遭遇してどうしたらいいのか少し考えてしまった。

none
When applied at the top-level of the pipeline block no global agent will be allocated for the entire Pipeline run and each stage section will need to contain its own agent section. For example: agent none

出典:Pipeline Syntax https://www.jenkins.io/doc/book/pipeline/syntax/

今日の一言:
梅雨が明けて嬉しい!あとやっぱりBloggerでいい感じにブログ書くの難しいなあ。