サンプルのジェンキンスパイプラインを作成しています。これがコードです。
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
がありませんが、私の場合はあります。
ここで何が間違っていますか、誰でも提案できますか?
最初の試行は宣言型パイプラインを使用することであり、2番目の試行はスクリプトパイプラインを使用することです。ステップをステップ宣言で囲む必要があり、if
を宣言の最上位ステップとして使用できないため、script
ステップでラップする必要があります。これは、機能する宣言バージョンです。
pipeline {
agent any
stages {
stage('test') {
steps {
sh 'echo hello'
}
}
stage('test1') {
steps {
sh 'echo $TEST'
}
}
stage('test3') {
steps {
script {
if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}
}
}
}
}
}
"when"を使用することで、これを単純化し、ifステートメントを(潜在的にelseが必要でない限り)避けることができます。 https://jenkins.io/doc/book/pipeline/syntax/ の「whenディレクティブ」を参照してください。 jenkins rest apiを使用してjenkinsfilesを検証することもできます。とても甘い。 jenkinsの宣言型パイプラインをお楽しみください!
少し並べ替える必要がありますが、when
は上記の条件を置き換えるのに適しています。以下は、宣言構文を使用して記述された上記の例です。 test3
ステージは2つの異なるステージになりました。 1つはmasterブランチで実行され、もう1つは他のもので実行されます。
stage ('Test 3: Master') {
when { branch 'master' }
steps {
echo 'I only execute on the master branch.'
}
}
stage ('Test 3: Dev') {
when { not { branch 'master' } }
steps {
echo 'I execute on non-master branches.'
}
}