在Jenkins中复制同一作业上多个构建的工件

时间:2015-08-16 08:15:28

标签: jenkins

我正在使用MultiJob插件,并且有一个多次触发Job-A的作业(Job-B)。 我的要求是从每个构建中复制一些工件(xml文件)。

我遇到的困难是使用Copy Artifact Plugin和#34;上次成功构建&#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复制工件,而不仅仅是从上一次构建中复制工件。 我怎么能这样做?

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)

我建议您采用以下方法:

  1. 使用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)
    

    此脚本将创建三个环境变量,这些变量对应于上游作业的三个最后构建号。

  2. 添加三个构建步骤Copy artifacts from upstream project以复制上游项目的最后三个版本中的工件(使用上面脚本中的环境变量来设置内部版本号):

  3. enter image description here

    1. 运行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. 注意:或许,需要调整脚本以捕获“上游项目只有两个版本”,“当前作业没有上游作业”等异常情况,“当前作业已超过一个上游工作“等。

答案 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

#--------------------------------------