2015-08-16 136 views
5

我正在使用MultiJob插件,並且有一個作業(Job-A)可以多次觸發Job-B。 我的要求是從每個版本複製一些工件(xml文件)。在Jenkins的同一作業中複製多個構建的工件

我有困難的是,使用複製神器插件與「最後一次成功的構建」選項,將只取最後構建Job-B,而我需要從所有生成發佈引發了的體形相同複製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 ** 

Job-B可以在同一運行不同的奴隸被執行(我設置了從通過設置在上游作業的參數動態運行)

當所有構建完成後,我想Job-A從構建#複製神器1,#2和#3,而不僅僅是最後一次構建。 我該怎麼做?

+0

上次成功的工件的想法是始終有最新的穩定工件下載。在你的例子中,讓我們說構建#2失敗了,是否應該從它複製工件? –

+0

是的,無論構建狀態如何,我都會複製文物。 – etaiso

回答

2

我建議你採取下列措施:

  1. 使用Execute System Groovy scriptGroovy Plugin執行下面的腳本:

    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從最後三個複製工件建立上游項目(從腳本使用環境變量上面設置版本號):

enter image description here

  • 運行構建和檢查構建的日誌,你應該有這樣的事情:

    Copied 2 artifacts from "A" build number 4 
    Copied 2 artifacts from "A" build number 3 
    Copied 1 artifact from "A" build number 2 
    
  • 注意或許,腳本需要調整以捕捉異常情況,如「上游項目只有兩個版本」,「當前作業沒有上游作業」,「當前作業有多個上游作業「等。

    +1

    感謝您的回答和解決方案,但我一直在尋找更通用的東西。例如,下游項目的數量因運行而不同。我想這可以從腳本改變,但我必須「手動」複製文物,而不是通過插件。 – etaiso

    4

    這裏是更通用的groovy腳本;它使用groovy插件和copyArtifact插件;請參閱代碼註釋中的說明。

    它只是將來自所有下游作業的工件複製到上游作業的工作空間中。

    如果您多次調用同一個作業,則可以使用copyArtifact的「目標」參數中的作業編號來分隔工件。

    // 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) 
    } 
    
    +0

    我在哪裏可以得到發射器和聽衆在這個代碼? – fhcat

    0

    您可以使用「Execute 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 
    
    #-------------------------------------- 
    
    相關問題