我正在使用MultiJob插件,并且有一个多次触发Job-A
的作业(Job-B
)。
我的要求是从每个构建中复制一些工件(xml文件)。
我遇到的困难是使用Copy Artifact Plugin和#34;上次成功构建"选项只会采用Job-B
的最后版本,而我需要从{{1>}的相同版本触发的所有版本中复制< / p>
流程如下:
Job-A
启动并触发:
Job-A
注意:`Job-A` -->
Job-B build #1
Job-B build #2
Job-B build #3
** copy artifcats of all last 3 builds, not just #3 **
可以在同一次运行中的不同从站上执行(我通过在上游作业A上设置参数来设置从站运行动态)
当所有构建完成后,我希望Job-B
从构建#1,#2和#3复制工件,而不仅仅是从上一次构建中复制工件。
我怎么能这样做?
答案 0 :(得分:6)
这是更通用的groovy脚本;它使用groovy插件和copyArtifact插件;请参阅代码注释中的说明。
它只是将所有下游作业中的工件复制到上游作业的工作空间中。
如果你多次打电话给同一份工作,你可以使用copyArtifact&#39; target&#39;中的工作号码。用于保持工件分离的参数。
// This script copies artifacts from downstream jobs into the upstream job's workspace.
//
// To use, add a "Execute system groovy script" build step into the upstream job
// after the invocation of other projects/jobs, and specify
// "/var/lib/jenkins/groovy/copyArtifactsFromDownstream.groovy" as script.
import hudson.plugins.copyartifact.*
import hudson.model.AbstractBuild
import hudson.Launcher
import hudson.model.BuildListener
import hudson.FilePath
for (subBuild in build.builders) {
println(subBuild.jobName + " => " + subBuild.buildNumber)
copyTriggeredResults(subBuild.jobName, Integer.toString(subBuild.buildNumber))
}
// Inspired by http://kevinormbrek.blogspot.com/2013/11/using-copy-artifact-plugin-in-system.html
def copyTriggeredResults(projName, buildNumber) {
def selector = new SpecificBuildSelector(buildNumber)
// CopyArtifact(String projectName, String parameters, BuildSelector selector,
// String filter, String target, boolean flatten, boolean optional)
def copyArtifact = new CopyArtifact(projName, "", selector, "**", null, false, true)
// use reflection because direct call invokes deprecated method
// perform(Build<?, ?> build, Launcher launcher, BuildListener listener)
def perform = copyArtifact.class.getMethod("perform", AbstractBuild, Launcher, BuildListener)
perform.invoke(copyArtifact, build, launcher, listener)
}
答案 1 :(得分:2)
我建议您采用以下方法:
使用Groovy Plugin中的Execute System Groovy script
执行以下脚本:
import hudson.model.*
// get upstream job
def jobName = build.getEnvironment(listener).get('JOB_NAME')
def job = Hudson.instance.getJob(jobName)
def upstreamJob = job.upstreamProjects.iterator().next()
// prepare build numbers
def n1 = upstreamJob.lastBuild.number
def n2 = n1 - 1
def n3 = n1 - 2
// set parameters
def pa = new ParametersAction([
new StringParameterValue("UP_BUILD_NUMBER1", n1.toString()),
new StringParameterValue("UP_BUILD_NUMBER2", n2.toString()),
new StringParameterValue("UP_BUILD_NUMBER3", n3.toString())
])
Thread.currentThread().executable.addAction(pa)
此脚本将创建三个环境变量,这些变量对应于上游作业的三个最后构建号。
添加三个构建步骤Copy artifacts from upstream project
以复制上游项目的最后三个版本中的工件(使用上面脚本中的环境变量来设置内部版本号):
运行build和checkout构建日志,你应该有这样的东西:
Copied 2 artifacts from "A" build number 4
Copied 2 artifacts from "A" build number 3
Copied 1 artifact from "A" build number 2
注意:或许,需要调整脚本以捕获“上游项目只有两个版本”,“当前作业没有上游作业”等异常情况,“当前作业已超过一个上游工作“等。
答案 2 :(得分:0)
您可以在“执行Shell”构建步骤中使用以下示例。 请注意,它只能从Jenkins Master机器运行,调用此步骤的作业也会触发MultiJob。
#--------------------------------------
# Copy Artifacts from MultiJob Project
#--------------------------------------
PROJECT_NAME="MY_MULTI_JOB"
ARTIFACT_PATH="archive/target"
TARGET_DIRECTORY="target"
mkdir -p $TARGET_DIRECTORY
runCount="TRIGGERED_BUILD_RUN_COUNT_${PROJECT_NAME}"
for ((i=1; i<=${!runCount} ;i++))
do
buildNumber="${PROJECT_NAME}_${i}_BUILD_NUMBER"
cp $JENKINS_HOME/jobs/$PROJECT_NAME/builds/${!buildNumber}/$ARTIFACT_PATH/* $TARGET_DIRECTORY
done
#--------------------------------------