他のビルドをトリガーするジェンキングルーヴパイプラインがあります。次のスクリプトで行われます。Jenkinsパイプラインスクリプト - ビルド実行待ち
for (int i = 0; i < projectsPath.size(); i++) {
stepsForParallel[jenkinsPath] = {
stage("build-${jenkinsPath}") {
def absoluteJenkinsPath = "/${jenkinsPath}/BUILD"
build job: absoluteJenkinsPath, parameters: [[$class: 'StringParameterValue', name: 'GIT_BRANCH', value: branch],
[$class: 'StringParameterValue', name: 'ROOT_EXECUTOR', value: rootExecutor]]
}
}
}
parallel stepsForParallel
問題は、私の仕事は、他の一般的な仕事に依存していることである、つまりジョブXは、ジョブYトリガーとジョブZは、私が達成したいのですがどのような仕事のY.が仕事ということですトリガXはジョブYを起動し、ジョブZはXによってトリガされたYの結果を待ちます。
実行中のすべてのビルドを繰り返し実行して、同じタイプのビルドが実行されているかどうかを確認する必要があります。はいの場合はそれを待ちます。ビルドを待つことができ、次のコードを実行する必要が:
def busyExecutors = Jenkins.instance.computers
.collect {
c -> c.executors.findAll { it.isBusy() }
}
.flatten()
busyExecutors.each { e ->
e.getCurrentWorkUnit().context.future.get()
}
私の問題は、私は待つ必要がどのジョブを実行している伝える必要があるということです。行うには私は確認する必要があります:
- ビルドが
がどのように私はこの種のデータを盗んでき
私はジェンキンがサイレントピリオド機能を持っていることを知っていますが、期間が過ぎると新しいジョブがトリガーされます。
EDIT1
私はこの機能を必要とする理由だけで明確にします。私はアプリケーションとライブラリを構築する仕事を持っています。アプリケーションはlibsに依存し、libsは他のlibsに依存します。ビルドがトリガされると、ダウンストリームジョブ(依存するlibs)がトリガされます。
サンプルの依存関係ツリー:
A -> B,C,D,E
B -> F
C -> F
D -> F
E -> F
Iは、次いで、B、C、D、Eをトリガするときにトリガされ、Fはまた、(4回)でトリガされます。私はFを1回だけトリガーしたいと思います。
私はほとんど動作するベータ/ PoCソリューション(下記)を持っています。今、私はこのコードの問題を次のようしている。
- は、テキストは、「すでにジョブを実行見つかったが、」(job.future.getまで、画面にフラッシュされていないとエコー)
を終了し、私はこの醜い「待機を持っています"(for(i = 0; i < 1000; ++ i){})。 getメソッドは、私が解決するために同様の問題を抱えている
import hudson.model.* def getMatchingJob(projectName, branchName, rootExecutor){ result = null def busyExecutors = [] for(i = 0; i < Jenkins.instance.computers.size(); ++i){ def computer = Jenkins.instance.computers[i] for(j = 0; j < computer.getExecutors().size(); ++j){ def executor = computer.executors[j] if(executor.isBusy()){ busyExecutors.add(executor) } } } for(i = 0; i < busyExecutors.size(); ++i){ def workUnit = busyExecutors[i].getCurrentWorkUnit() if(!projectName.equals(workUnit.work.context.executionRef.job)){ continue } def context = workUnit.context context.future.waitForStart() def parameters def env for(action in context.task.context.executionRef.run.getAllActions()){ if(action instanceof hudson.model.ParametersAction){ parameters = action } else if(action instanceof org.jenkinsci.plugins.workflow.cps.EnvActionImpl){ env = action } } def gitBranchParam = parameters.getParameter("GIT_BRANCH") def rootExecutorParam = parameters.getParameter("ROOT_EXECUTOR") gitBranchParam = gitBranchParam ? gitBranchParam.getValue() : null rootExecutorParam = rootExecutorParam ? rootExecutorParam.getValue() : null println rootExecutorParam println gitBranchParam if( branchName.equals(gitBranchParam) && (rootExecutor == null || rootExecutor.equals(rootExecutorParam)) ){ result = [ "future" : context.future, "run" : context.task.context.executionRef.run, "url" : busyExecutors[i].getCurrentExecutable().getUrl() ] } } result } job = getMatchingJob('project/module/BUILD', 'branch', null) if(job != null){ echo "found already running job" println job def done = job.future.get() for(i = 0; i < 1000; ++i){} result = done.getParent().context.executionRef.run.result println done.toString() if(!"SUCCESS".equals(result)){ error 'project/module/BUILD: ' + result } println job.run.result }