別のパイプラインスクリプトからパイプラインスクリプトをロードする場合、2つのパイプラインは同じノードで実行されません。最初のパイプラインはマスターノードで実行され、2番目のパイプラインはスレーブノードで実行されます。
私はこのように多くの仕事のために_Pipeline Script from SCM
_オプションでJenkinsパイプラインを使用しています:
私の各ジョブは、対応するGitリポジトリURLを_Poll SCM
_オプションで定義しているため、コードに変更が加えられたときにリポジトリが自動的にポーリングされます(基本的なジョブの使用法)。
私の各ジョブは、リポジトリのルートに単純なJenkinsfile
を定義し、内部のパイプラインスクリプトは、基本的に、より一般的なパイプラインをロードするだけです。
例:
_node {
// --- Load the generic pipeline ---
checkout scm: [$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'http://github/owner/pipeline-repo.git']]]
load 'common-pipeline.groovy'
}()
_
私のcommon-pipeline.groovyパイプラインは、アーティファクトの構築、リリース、デプロイなどの実際の処理を実行します。 :
_{ ->
node() {
def functions = load 'common/functions.groovy'
functions.build()
functions.release()
functions.deploy()
}
}
_
今私は各ジョブのノードを強制したくないしたがって、両方のパイプラインにはnode("master")
またはnode("remote")
があります。ただし、手動で、最初のパイプラインが特定のノード(master、slave1、slave2、slave3) 2番目/ロードされたパイプラインは同じノードで実行されます。そうしないと、実際のGitリポジトリコードが他のノードのワークスペースから利用できないためです。
2番目のパイプラインを最初のパイプラインと同じノードで実行するように指定したり、load
ステップを使用するときに引数を渡したりする方法はありますか?
チェックアウト後、スクリプトのロード前にワークスペースを隠しておくのはどうですか?:
例えば.
stash includes: '**', name: "source"
次に、別のnode(){}セクションでそれをアンスタッシュします。
例えばunstash "source"
そうすれば、他のノードで利用できるようになります
ただし、ワークスペースをクリーンアップすることを忘れないでください
または、チェックアウトのロジックも含む共通関数を作成するのはどうですか(おそらくブランチをパラメーターとして渡す)。次に、Jenkinsファイルのnode(){}を破棄し、共有groovyスクリプトでnode(){}エントリを使用できますか?
例えばJenkinsfile
load 'common-pipeline.groovy'
createWorlflow("*/master")
common-pipeline.groovy:
def createWorkflow(branches){
node() {
def functions = load 'common/functions.groovy'
functions.checkout(branches)
functions.build()
functions.release()
functions.deploy()
}
}
2番目のパイプラインのパラメーター化されたジョブを作成し、そのパラメーターを使用して、2番目のジョブをトリガーするときにノードを制御できます。
2番目のパイプラインは次のようになります。
node(runhereParam) {
}