如何从同一个管道构建中复制工件?

时间:2018-05-30 15:34:01

标签: android jenkins jenkins-plugins jenkins-pipeline

当我将Copy Artifact Plugin用于Jenkins时,如何从同一管道运行(下游)的另一个作业中检索正确的工件?现在我正在使用“最新成功构建”中的工件,但这可能也是错误的,因为我从中获取工件的工作可能已经再次运行并产生了另一个工件。

对完整设置的更多解释:

对于我的项目,我正在使用Jenkins构建&自动部署到Nexus,HockeyApp和Play商店。我创建了一个使用以下JenkinsFile(简化版)的Multibranch Pipeline:

#!groovy

node('android') {
    def branchName = env.BRANCH_NAME
    def params = [string(name: 'BRANCH_NAME', value: branchName)]
    echo "Using branch: ${branchName}"

    stage('Build & Unittests') {
        build job: 'Android - Unittests', parameters: params
    }

    if (branchName == 'master') {
        stage('Nexus publish') {
            build job: 'Android - Nexus publish', parameters: params
        }

        stage('HockeyApp') {
            build job: 'Android - HockeyApp', parameters: params
        }

        stage('Google Play Store') {
            build job: 'Android - Play Store', parameters: params
        }
    }
}

所有其他作业都是具有2轴的多配置项目:FLAVOR和TYPE

作业'Android - Unittests'将创建.apk的工件,可供所有后续工作使用。为此,我使用了Copy Artifact Plugin

例如,这是我的工作'Android - Nexus publish'的构建配置:

'Android - Nexus publish' build configuration example

那么如何使用'Android-Unittests'工作中的正确工件?

PS。这在我的案例中非常重要,因为我正在与几个分支机构合作。经常会发生几个分支将启动管道,因此“上次成功构建”并不总是正确的:“Android - Play Store”作业可能是在另一个分支已经启动后构建的

1 个答案:

答案 0 :(得分:2)

您可以根据生成它的构建的ID复制工件。

要做到这一点,你需要:

  • 更改您的管道,以便它捕获' Android的ID - Unittests'它的触发
  • 更改' Android - Nexus发布'
    • 添加一个字符串变量,该变量将保存' Android的构建ID - Unittests'作业例如' BUILD_AND_UNIT_TEST_JOB_ID'
    • 更改复制工件步骤的配置,以使用基于您添加的参数的特定构建。

所以,你的' Android - Unittests'管道应如下所示:

#!groovy
node('android') {
    def branchName = env.BRANCH_NAME
    def params = [string(name: 'BRANCH_NAME', value: branchName)]
    echo "Using branch: ${branchName}"

    def buildAnUnitTestJobId
    stage('Build & Unittests') {
        def buildAnUnitTestJob = build job: 'Android - Unittests', parameters: params
        // Note that buildAnUnitTestJob will be null if 'Android - Unitttests' fails
        buildAnUnitTestJobId  = buildAnUnitTestJob.id
    }

    if (branchName == 'master') {
        stage('Nexus publish') {
            build job: 'Android - Nexus publish', parameters: params + [string(name:'BUILD_AND_UNIT_TEST_JOB_ID', value: buildAnUnitTestJob)]
        }

        stage('HockeyApp') {
            build job: 'Android - HockeyApp', parameters: params
        }

        stage('Google Play Store') {
            build job: 'Android - Play Store', parameters: params
        }
    }
}

并且' Android - Nexus发布'应该有这些变化: Add string variable for build id Change your copy artifact step