web-dev-qa-db-ja.com

Jenkinsの宣言型パイプライン内で単純なifステートメントを実行する方法

スクリプトパイプラインを宣言パイプラインに変換しようとしています。 _steps {}_ブロック内で単純なif文を実行する方法を疑問に思います。

_    stage ('Deploy to Docker') {
        steps {
            parallel (
                "instance1" : {
                    environment {
                        containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim()
                    }
                    steps {
                        if (containerId.isEmpty()) {
                            docker.image('some/image').run("--name ${fullDockerImageName}")
                        }
                    }
                }
            )
        }
   }
_

これにより、次の例外が発生します。

_WorkflowScript: 201: Expected a step @ line 201, column 29.
                           if (containerId.isEmpty()) {
_

_steps {}_ブロック内で単純なif(..)を実行することは許可されていないため、これを行う方法についてのアイデアはありますか?

これを_when {}_で完全なステージにすることは意味がないようです。単純なステージ(停止したコンテナが存在する場合は起動するなど)でさらに多くのステップが発生するためです。

単純なifを実行する最良の方法は何ですか?

22
Jasper Roel

残念ながら、今のところscriptで囲む必要があります。そのまま ここで言う ;

宣言的パイプラインは、 Pipeline Steps reference に記載されている利用可能なすべてのステップを使用できます。これには、宣言的パイプラインでのみサポートされる以下のステップが追加されたステップの包括的なリストが含まれます。

また、ステップリファレンスを見ると、パイプラインステップに寄与するすべてのプラグインがリストされているだけです。そして、私が見る限りでは、もしそうでなければ、サポートするステップはありません。したがって、答えはいいえ、今のところ不可能です。しかし、これをステップとして実装してプラグインに追加するのはかなり簡単なはずです。

14
Jon S

これは動作するはずです

pipeline {
     stages {
        stage ('Main Stage') {
            steps {
                script {
                    if (true) {
                        stage ('Stage 1') {
                            sh 'echo Stage 1'
                        }
                    }
                    if (false) {
                        stage ('Stage 2') {
                            sh 'echo Stage 2'
                        }
                    }
                }
            }
        }
    }
}
11
Reuben Abela

これは、Jenkins Declarativeパイプライン内でif/elseまたは制御ロジックを使用する最も正しい/ベストプラクティスの方法だと思います。

https://jenkins.io/doc/book/pipeline/syntax/#when

@IronSeanの答えは、あなたがそのプラグインを必要とするようには思えません(もう)。

2
Ruwd

Conditional BuildStep プラグインを使用すると、when {}条件を処理するステップ。

このコンテキスト内でのisEmpty()チェックの構文の問題を除いて、以下が機能するはずです。

stage ('Deploy to Docker') {
    steps {
        parallel (
            "instance1" : {
                environment {
                    containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim()
                }
                when {
                    expression {
                        return containerId.isEmpty()
                    }
                }
                step {
                    docker.image('some/image').run("--name ${fullDockerImageName}")
                }
            }
        )
    }
}

関連するブログ投稿 ここにあります

[〜#〜] edit [〜#〜]:申し訳ありませんが、実際のsnytaxはこれに近いようです。必要な条件:

stage ('Deploy to Docker') {
    when {
        expression {
            return containerId.isEmpty()
        }
    }
    steps {
        parallel (
            "instance1" : {
                environment {
                    containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim()
                }
                step {
                    docker.image('some/image').run("--name ${fullDockerImageName}")
                }
            }
        )
    }
}
2
IronSean