如何在Jenkins中获取定时触发构建的归档产物路径以对比构建结果?
获取上一次成功定时构建的归档产物路径
核心思路
关键是先通过CI系统的内置标识区分定时构建和手动构建,再筛选出最近一次成功的定时构建,最后获取其归档产物路径。以下是主流CI工具的实现方案:
Jenkins
- 区分定时构建:Jenkins定时触发的构建会自带
TIMERTRIGGER类型的构建原因,可通过环境变量或API识别。 - 获取最近成功定时构建:
- 用Shell脚本调用Jenkins API:
# 替换为你的Jenkins实例信息 JENKINS_URL="http://your-jenkins-domain" JOB_NAME="your-ci-job-name" AUTH="username:api-token" # 筛选出最近一次成功的定时构建号 LAST_SUCCESS_TIMER_BUILD=$(curl -s -u $AUTH "$JENKINS_URL/job/$JOB_NAME/api/json?tree=builds[number,result,actions[causes[shortDescription]]]" | \ jq -r '.builds[] | select(.result == "SUCCESS" and .actions[0].causes[0].shortDescription == "Started by timer") | .number' | head -n 1) # 拼接归档产物的绝对路径(替换为你的实际归档路径) ARCHIVE_PATH="$JENKINS_URL/job/$JOB_NAME/$LAST_SUCCESS_TIMER_BUILD/artifact/dist/" - 或者在Jenkins Pipeline中直接获取:
def targetJob = Jenkins.instance.getItemByFullName("your-ci-job-name") def lastTimerSuccessBuild = targetJob.getBuilds().find { it.result == Result.SUCCESS && it.getCause(hudson.triggers.TimerTrigger.TimerTriggerCause) != null } def localArchivePath = lastTimerSuccessBuild.getArtifactsDir().getAbsolutePath() + "/dist/"
- 用Shell脚本调用Jenkins API:
GitLab CI
- 区分定时构建:定时触发的流水线会自动设置
CI_PIPELINE_SOURCE=schedule环境变量。 - 获取最近成功定时流水线:
# 替换为你的GitLab实例信息 GITLAB_API="https://your-gitlab-domain/api/v4" PROJECT_ID="123" PRIVATE_TOKEN="your-access-token" BUILD_JOB_NAME="build-and-archive" # 获取最近一次成功的定时流水线ID LAST_SUCCESS_TIMER_PIPELINE=$(curl -s --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "$GITLAB_API/projects/$PROJECT_ID/pipelines?source=schedule&status=success" | \ jq -r '.[0].id') # 获取归档产物的下载路径(或本地存储路径,取决于你的配置) ARCHIVE_PATH="$GITLAB_API/projects/$PROJECT_ID/jobs/artifacts/$LAST_SUCCESS_TIMER_PIPELINE/download?job=$BUILD_JOB_NAME"
GitHub Actions
- 区分定时构建:定时触发的工作流运行会标记
github.event_name=schedule。 - 获取最近成功定时工作流:
# 替换为你的仓库信息 REPO="your-username/your-repo" GH_TOKEN="your-github-token" WORKFLOW_NAME="ci-workflow.yml" # 获取最近一次成功的定时工作流运行ID LAST_SUCCESS_TIMER_RUN=$(curl -s -H "Authorization: token $GH_TOKEN" "https://api.github.com/repos/$REPO/actions/runs?event=schedule&status=success" | \ jq -r '.workflow_runs[0].id') # 获取归档产物的API路径 ARCHIVE_PATH="https://api.github.com/repos/$REPO/actions/runs/$LAST_SUCCESS_TIMER_RUN/artifacts"
通用注意事项
- 确保执行脚本的账号有足够权限访问CI系统的API或归档目录。
- 如果你的CI系统有内置插件/工具(比如Jenkins的
Copy Artifact插件),优先使用内置功能,比API调用更稳定。 - 可将获取到的
ARCHIVE_PATH直接传入你的对比脚本中使用。
内容的提问来源于stack exchange,提问作者totikom
相关产品推荐
相关产品推荐

