Jenkinsパイプラインの条件付きステップ/ステージ


96

特定のブランチをビルドする場合にのみ、ビルドステップ/ステージをどのように実行しますか?

たとえば、ブランチが呼び出された場合にのみ展開ステップを実行し、deployment他のすべては同じままにします。

回答:


187

宣言型パイプライン構文で同じことを行うと、以下にいくつかの例があります。

stage('master-branch-stuff'){
  agent any
  when{
    branch 'master'
  }
  steps {
    echo 'run this stage - ony if the branch = master branch'
  }
}

<b

stage('feature-branch-stuff') {
    agent label:'test-node'
    when { branch "feature/*" }
    steps {
        echo 'run this stage - only if the branch name started with feature/'
    }
}

<b

stage('expression-branch') {
    agent label:'some-node'
    when {
    expression {
        return env.BRANCH_NAME != 'master';
        }
    }
    steps {
        echo 'run this stage - when branch is not equal to master'
    }
}

<b

stage('env-specific-stuff') {
    agent label:'test-node'
    when { 
      environment name: 'NAME', value: 'this' 
    }
    steps {
        echo 'run this stage - only if the env name and value matches'
    }
}

今後のより効果的な方法 -https://issues.jenkins-ci.org/browse/JENKINS-41187
こちらも ご覧ください-https://jenkins.io/doc/book/pipeline/syntax/#when


beforeAgent true条件が実行するかどうかを決定するためにgit状態を必要としない場合、ディレクティブを設定して、条件を実行するためにエージェントが起動しないようにすることができます。

when { beforeAgent true; expression { return isStageConfigured(config) } }

リリース投稿ドキュメント



新しいWHEN句の更新
REF:https//jenkins.io/blog/2018/04/09/whats-in-declarative

equals-2つの値(文字列、変数、数値、ブール値)を比較し、それらが等しい場合はtrueを返します。正直なところ、これを以前に追加できなかった理由はわかりません。not {equals ...}の組み合わせを使用して、「等しくない」比較を行うこともできます。

changeRequest-最も単純な形式では、このパイプラインがGitHubプルリクエストなどの変更リクエストを作成している場合、これはtrueを返します。また、変更要求に対してより詳細なチェックを実行して、「これはマスターブランチに対する変更要求ですか?」と尋ねることができます。とはるかに。

buildingTag-ブランチや特定のコミット参照ではなく、パイプラインがSCMのタグに対して実行されているかどうかを確認するだけの単純な条件。

tag-buildingTagと同等の詳細な機能で、タグ名自体と照合できます。


1
これをビルド後のアクションに使用できますか?
ダグ

1
when{}条件がfalseと評価された場合でも、Jenkinsが指定されたエージェントをスピンアップすることがわかりました。:(
Trejkaz

1
@Trejkazあなたが今使用できるbeforeAgent trueことを避けるために
ニック・ジョーンズ

1
@NickJonesは確かに、beforeAgentそのための回避策になりました。
Trejkaz

47

ifenv.BRANCH_NAME、例を使用するだけです。

    if (env.BRANCH_NAME == "deployment") {                                          
        ... do some build ...
    } else {                                   
        ... do something else ...
    }                                                                       

4
ステージの前か後か?
ジェット

5
舞台の前に、ステージは枝であれば内部のことができます
クシシュトフKrasoń

配置が実際に重要であるとは思わない
omu_negru 2018

9
宣言型パイプラインではこの作業を行うことができません。これは宣言型パイプラインで機能しますか?WorkflowScript:9:ステージ@行9、列9が必要です。if(env.BRANCH_NAME == "deployment"){WorkflowScript:8:ステージが指定されていません@行8、列5。ステージ{
ピッチブラック4 0819年

4
これは、スクリプト化されたパイプラインでのみ機能します。宣言型パイプラインの場合、ステップ内でスクリプト{}を使用する必要があります。
ペドロエンリケ

1

他の回答によると、私は並列ステージのシナリオを追加しています:

pipeline {
    agent any
    stages {
        stage('some parallel stage') {
            parallel {
                stage('parallel stage 1') {
                    when {
                      expression { ENV == "something" }
                    }
                    steps {
                        echo 'something'
                    }
                }
                stage('parallel stage 2') {
                    steps {
                        echo 'something'
                    }
                }
            }
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.