ジェンキンス・パイプラインが動作しない場合
サンプルのjenkinsパイプラインを作成していますが、そのコードは以下の通りです。
pipeline {
agent any
stages {
stage('test') {
steps {
sh 'echo hello'
}
}
stage('test1') {
steps {
sh 'echo $TEST'
}
}
stage('test3') {
if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}
}
}
}
このパイプラインは以下のエラーログで失敗します。
Started by user admin
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 15: Not a valid stage section definition: "if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}". Some extra configuration is required. @ line 15, column 9.
stage('test3') {
^
WorkflowScript: 15: Nothing to execute within stage "test3" @ line 15, column 9.
stage('test3') {
^
しかし、以下の例をこのURLから実行すると、正常に実行され、elseの部分が表示されます。
node {
stage('Example') {
if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}
}
}
唯一の違いは、実行例では stages
がないのに、私の場合はあるということです。
何が間違っているのか、誰か教えてください。
39
3
ステップ宣言でステップを囲む必要がありますが、declarativeでは
if
をトップレベルのステップとして使うことができないので、script
のステップで囲む必要があります。これを簡単にして、if文を避けられる可能性があります(elseを必要としない限り) "when"を使ってください。https://jenkins.io/doc/book/pipeline/syntax/ の "when directive" を参照してください。また、jenkins rest api を使って jenkinsfiles を検証することもできます。
少しアレンジが必要ですが、
when
は上記の条件式を置き換えるのに良い仕事をしてくれます。上の例を宣言型の構文で書いてみましょう。test3`のステージが2つの異なるステージになっていることに注意してください。一つは master ブランチで実行されるもの、もう一つはそれ以外の場所で実行されるものです。