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

How to copy artifact from in the same pipeline-build?

当我将 Copy Artifact Plugin 用于 Jenkins 时,如何通过同一管道从另一项作业中检索到正确的工件,该作业作为 运行(下游)?现在我正在使用来自 'Latest successful build' 的工件,但这也可能是错误的,因为我从中获取工件的工作可能已经再次 运行 并产生了另一个工件。

完整设置的更多解释:


对于我的项目,我使用 Jenkins 构建并自动部署到 Nexus、HockeyApp 和 Play 商店。我创建了一个使用以下 JenkinsFile(简化版)的多分支管道:

#!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 - Unittests' 工作中的正确工件?

ps。这对我来说非常重要,因为我正在与多个分支机构合作。多个分支将启动管道的情况经常发生,因此 'last successful build' 并不总是正确的:作业 'Android - Play Store' 可能是在另一个分支已经启动后构建的

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

为此,您需要:

  • 更改您的管道,使其捕获正在触发的 'Android - Unittests' 的 ID
  • 改变'Android - Nexus publish'
    • 添加一个字符串变量,它将保存 'Android - Unittests' 作业的构建 ID,例如 '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 publish'应该有这些变化: