2016-09-16 11 views
7

Jenkinsパイプライン:ジョブj1をトリガするパイプラインp1があり、次にj2がトリガされます。 j1によって設定され、パイプラインp1でj2に渡されるいくつかのパラメータが必要です。 Jenkinsパイプラインプラグインを使用してこの機能を実装するにはどうすればよいですか?事前に感謝同じパイプラインに戻る(パイプラインによってトリガされる)ジョブからのパラメータ/結果を返す

+0

何が..........ですか? – StephenKing

+0

どのようにトリガーしますか?いくつかのコードを共有できますか? – hakamairi

答えて

6

私は同様の問題がありました。ジョブJ1、J2にプロパティファイルを作成させてから、メインパイプラインP1の「アーティファクトのコピー」を使用してこれらのファイルを取得する必要がありました。その後、プロパティをJavaプロパティに変換します(Jenkinsではスクリプトの承認が必要な場合があります)。 Jenkins Pipelineがコードで直接パラメータを返すことができればいいでしょう(おそらくこれを行うには離れていますが、わかりません)。ビルドステップからの復帰はRunWrapperです(ビルドの説明のような既存のプロパティを使用しない限り)私が見ることができるカスタム結果を返す方法はないようです。

// Pipeline code in P1 

// Build J1 and get result. 
def j1BuildResult = build job: 'J1', parameters: [string(name: 'J1_PROP', value: 'FOO')], propagate: true, wait: true 

// Get results of J1 
step([$class    : 'CopyArtifact', filter: 'j1-result.properties', 
     fingerprintArtifacts: true, 
     flatten    : true, 
     projectName   : 'J1', 
     selector   : [$class  : 'SpecificBuildSelector', buildNumber: buildResult.getNumber().toString()]]) 

// Load J1 properties (you may need to turn off sandbox or approve this in Jenkins) 
Properties j1Props = new Properties() 
j1Props.load(new StringReader(readFile('j1-result.properties'))) 

// Build J2 
def j2BuildResult = build job: 'J2', parameters: [string(name: 'J2_PROP', value: j1Props.someProperty)], propagate: true, wait: true 

// Get results of J2 
step([$class    : 'CopyArtifact', filter: 'j2-result.properties', 
     fingerprintArtifacts: true, 
     flatten    : true, 
     projectName   : 'J2', 
     selector   : [$class  : 'SpecificBuildSelector', buildNumber: buildResult.getNumber().toString()]]) 

// Load J2 properties (you may need to turn off sandbox or approve this in Jenkins) 
Properties j2Props = new Properties() 
j1Props.load(new StringReader(readFile('j2-result.properties'))) 
7
それは "ENV" を使用して行うことができ

だから私はこのような何かを持っていました。 j1がその情報をビルドのenvに追加するように管理している場合。

j1がパイラインだった場合、env.MYKEY=MYVALUEにすることができます。 フリースタイルの仕事の場合、私はそれがEnvInject plugin(試していない)を使って動作するはずだと思います。 p1の場合、ビルド結果から外れた場合は、その情報を持つ地図が表示されます。

あなたがp1何かラインでこれを行うのであれば、:

// somewhere in your pipeline, i.e. p1: 
def j1BuildResult = build job: 'J1' 
def j1EnvVariables = j1BuildResult.getBuildVariables(); 

を、その後j1EnvVariablesあなたはj1に設定された変数を含むマップになります。

PS:その情報をパラメータとして渡す方法p2です。カバーされたhere

+0

それは私のための例外を生成します:org.kohsuke.stapler.NoStaplerConstructorException:java.lang.Stringクラスのコンストラクタに@DataBoundConstructorがありません 修正するための考え方 – OlivierTerrien

+0

'EnvInject plugin'で試してみましたが動作しません。 – igreen

3

あなたは、環境変数と一緒にパラメータを構築得ることができます

def buildProperties = runWrapper.rawBuild.getEnvironment() 

を使用してそれがグルーヴィーなマップです。 「インプロセススクリプト承認」でmethod hudson.model.Run getEnvironmentを可能にし、(なぜならrawBuildの)nodeクロージャ内でこのコードを呼び出す必要があり:ターゲットパラメータは

String someProperty = buildProperties.someProperty 

制限が受信することができます。

私もrunWrapper.rawBuild.getAction(ParametersAction.class)を試しましたが、それはJenkinsfileに多くのインポートが必要です。

注:runWrapper.getBuildVariables()は私のために何も返しません。

関連する問題