2017-03-02 7 views
5

既存のビルドパイプラインをjenkins宣言型パイプライン(マルチブランチパイプライン)として再構築し、ビルド伝播を処理する際に問題があります。ヘビー級エグゼキュータをブロックせずに宣言パイプラインでユーザー入力を待つ方法

すべての関連ファイルをパッケージ化して隠した後、パイプラインはユーザーの入力がトリガーされるのを待つことになっています。

入力ステップを追加するだけで、現在のビルドノードがブロックされます。このエグゼクターはかなり重いので、私はこのステップをより軽量のマシンに移したいと思っています。

最初はスクリプトパイプラインとして仕事をして、ちょうど2つの異なるnode('label')ブロックを作成しました。宣言的な構文と似たようなことをする方法はありますか?

node('spine') { 
    stage('builder') { 
     sh 'mvn clean compile' 
     stash name: 'artifact', includes: 'target/*.war' 
    } 
} 
node('lightweight') { 
    stage('wait') { 
     timeout(time:5, unit:'DAYS') { 
      input message:'Approve deployment?' 
     } 
    } 
    // add deployment stages 
} 

私はすでに、物事のカップルを試してみました:

がトップレベルでのエージェントの設定および伝播ステップにさらなる薬剤の設定を追加することが、その後、私はトップレベルとブロック2つのエグゼキュータを持っています定義済みの構築ノードは停止しません。

トップレベルにagent noneを設定し、ステップごとにエージェントを設定してください。 git checkoutは最初のノードに存在しません。私はあなたのアドバイス、次の私のパイプラインを再構成

EDIT 1

は、それが現在のようになります。

pipeline { 
agent none 
tools { 
    maven 'M3' 
} 
stages { 
    stage('Build') { 
     agent { label 'spine' } 
     steps { 
      checkout scm // needed, otherwise the workspace on the first step is empty 
      sh "mvn clean compile" 
     } 
    } 
    stage('Test') { 
     agent { label 'spine' } 
     steps { 
      sh "mvn verify" // fails because the workspace is empty aggain 
      junit '**/target/surefire-reports/TEST-*.xml' 
     } 
    } 
} 
} 

彼らは実行をいけないと、ワークスペースがステップ間で引き継がれていないため、このビルドが失敗します同じエグゼキュータ上で

EDIT 2は明らかに時には同じエグゼキュータ上で実行し、手順にはありません。

エージェント定義のラベルが現在のエグゼキュータで実行されることを期待していました。変化する。

答えて

14

best practice 7を参照してください。Do not:ノードブロック内で入力を使用します。宣言型パイプラインでは、ノードの選択はagentディレクティブによって行われます。

ドキュメントhereは、ピララインにnoneを定義し、ステージレベルのagentディレクティブを使用して、必要なノードでステージを実行する方法を説明しています。私は反対側も試みました(いくつかのノードでグローバルエージェントを定義し、入力の段階レベルでnoneを定義します)が、動作しません。パイプラインがスレーブを割り当てた場合、1つ以上の特定の段階でスレーブを解放することはできません。

これはour pipelineの構造である:一般

pipeline { 
    agent none 
    stages { 
    stage('Build') { 
     agent { label 'yona' } 
     steps { 
     ... 
     } 
    } 
    stage('Decide tag on Docker Hub') { 
     agent none 
     steps { 
     script { 
      env.TAG_ON_DOCKER_HUB = input message: 'User input required', 
       parameters: [choice(name: 'Tag on Docker Hub', choices: 'no\nyes', description: 'Choose "yes" if you want to deploy this build')] 
     } 
     } 
    } 
    stage('Tag on Docker Hub') { 
     agent { label 'yona' } 
     when { 
     environment name: 'TAG_ON_DOCKER_HUB', value: 'yes' 
     } 
     steps { 
     ... 
     } 
    } 
    } 
} 

、ビルド段階は「ヨナ」とラベル付けされたビルドスレーブ上で実行されるが、入力段は、マスタ上で実行されます。

+0

これは宣言型パイプラインでは機能しません。ノードブロックはありません。 – Laures

+0

合意。答えを更新しました。 – Bert

+0

私は同じことをやってみたが、問題にぶつかった。明らかに、同じエージェント上で実行されていても、ワークスペースは1つのステージから他のステージに引き継がれません。私の2番目のビルドステップ(Mavenビルド)は空のワークスペースを見つけます – Laures

1

エージェントを使用せず、入力ステップを含むステージ以外のすべてのステージにエージェントを定義します。

ソース:Use a lightweight executor for a declarative pipeline stage (agent none)

での議論の更新:あなたが「Gitのチェックアウトは、最初のノードに存在しない」とはどういう意味ですか?宣言的なパイプラインのためにあなたが今までに持っているものを示してください。

関連する問題