2017-02-16 31 views
6

スクリプトパイプラインを宣言パイプラインに変換しようとしています。 steps {}ブロック内で単純なif文を実行する方法が分かります。Jenkinsの宣言パイプライン内で単純な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}") 
         } 
        } 
       } 
      ) 
     } 
    } 

これは、次の例外が発生:私は、steps {}ブロック内での簡単なif(..)を行うためにこれを行う方法上の任意のアイデアを許可されていないよので

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

を?

これは、when {}で完全な段階にするのは意味がありません。単純な段階(存在する場合は停止したコンテナを開始するなど)でさらに多くの手順があるためです。

単純な場合はどうすればよいですか?

+0

@ jon-sこれは私の他の質問と非常によく似ていますが(https://stackoverflow.com/questions/42277936/assigning-variables-in-a-parallel-step-using-declarative-pipeline-steps-in-jenki)、私は非常に一般的なシナリオ(if-statemen tとvar-assignment)、それをとにかく投稿します。 多分あなたはこれについて別の洞察力を持っていますか? –

答えて

5

残念ながら、今のところscript以内にそれをラップする必要があります。それとして、says here;

宣言パイプラインのみ宣言パイプラインでサポートされるの下に記載された手順を添加して、手順の包括的なリストを含む、Pipeline Steps referenceに記載利用可能なすべての手順を使用してもよいです。

ステップリファレンスを見ると、パイプラインステップに貢献するすべてのプラグインが一覧表示されます。そして、私が見る限り、if、then、elseをサポートするステップはありません。答えは、いいえ、現時点では不可能ですが、これをステップとして実装してプラグインに追加するのはかなり簡単です。

2

これは、条件付きを処理するwhen {}ステップを追加することができますConditional BuildStepプラグインを使用して

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' 
         } 
        } 
       } 
      } 
     } 
    } 
} 
0

動作するはずです。

このコンテキスト内の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}") 
       } 
      } 
     ) 
    } 
} 

関連ブログ記事is here.

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}") 
       } 
      } 
     ) 
    } 
} 
関連する問題