如何从同一个管道构建中复制工件?
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'应该有这些变化:
当我将 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'应该有这些变化: