如何在Jenkins流水线中获取GitLab流水线的构建产物?
在Jenkins流水线中获取GitLab构建产物的可行方案
嘿,不用纠结找不到专门的插件,其实有几个靠谱的方法能解决这个需求,我给你整理了三个实用方案,你可以根据团队的实际场景来选:
方案1:直接调用GitLab API下载产物
GitLab本身提供了完整的API来访问流水线和构建产物,这是最直接的方式,完全不需要额外插件。步骤很清晰:
- 先在GitLab里创建一个个人访问令牌,权限要勾上
read_api和read_repository,确保能拿到流水线和产物的访问权限。 - 然后去Jenkins的凭证管理里,把这个令牌存成「Secret Text」类型的凭证,避免明文写在脚本里。
- 最后在Jenkins流水线里加个阶段,用API先找到最新成功的流水线,再定位到对应的构建产物,用
curl或者wget下载下来。给你个示例代码片段参考:
pipeline { agent any environment { GITLAB_TOKEN = credentials('gitlab-access-token') // 这里填你存的凭证ID PROJECT_ID = '123' // GitLab项目的ID,在项目主页就能看到 GITLAB_BASE_URL = 'https://your-gitlab-domain.com' // 你的GitLab实例地址 } stages { stage('Fetch GitLab Build Artifacts') { steps { script { // 获取最新成功的流水线ID def pipelineData = sh(script: """ curl --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \ "${GITLAB_BASE_URL}/api/v4/projects/${PROJECT_ID}/pipelines?status=success&per_page=1" """, returnStdout: true).trim() def pipelineId = new groovy.json.JsonSlurper().parseText(pipelineData)[0].id // 获取该流水线对应的成功Job ID def jobData = sh(script: """ curl --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \ "${GITLAB_BASE_URL}/api/v4/projects/${PROJECT_ID}/pipelines/${pipelineId}/jobs?status=success&per_page=1" """, returnStdout: true).trim() def jobId = new groovy.json.JsonSlurper().parseText(jobData)[0].id // 下载并解压产物到Jenkins工作目录 sh """ curl --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \ "${GITLAB_BASE_URL}/api/v4/projects/${PROJECT_ID}/jobs/${jobId}/artifacts" \ -o gitlab-artifacts.zip unzip gitlab-artifacts.zip -d ./gitlab-build-output """ } } } } }
- 小提示:如果是私有项目,一定要确保令牌权限足够;还可以调整API参数,比如指定特定分支的流水线,或者过滤特定的Job名称。
方案2:通过共享存储中转产物
如果你们团队已经有共享存储(比如NFS、S3兼容存储),可以让GitLab流水线把产物先传到存储里,再让Jenkins从存储拉取,这样两个系统就解耦了:
- 先在GitLab的
.gitlab-ci.yml里加个上传产物的阶段:
upload_to_storage: stage: post-build only: - main // 按需指定分支 script: - zip -r build-output.zip ./dist // 把你的产物目录打包 # 这里以上传到S3为例,用rsync传NFS的话改成rsync命令就行 - aws s3 cp build-output.zip s3://your-team-bucket/gitlab-artifacts/${CI_COMMIT_SHA}/ dependencies: - build // 依赖你的构建阶段,确保产物已经生成
- 然后在Jenkins流水线里加个拉取的步骤:
stage('Get Artifacts from Shared Storage') { steps { sh """ aws s3 cp s3://your-team-bucket/gitlab-artifacts/${GIT_COMMIT}/build-output.zip ./ unzip build-output.zip -d ./jenkins-build-dir """ } }
这个方案的好处是产物存储更持久,就算GitLab的产物过期了(默认GitLab产物会清理),你还能从共享存储拿到,适合需要长期保留产物的场景。
方案3:用Webhook触发Jenkins并传递产物信息
如果需要GitLab流水线一成功,Jenkins就立刻拉取产物,可以用Webhook来实现,这个需要用到Jenkins的「Generic Webhook Trigger」插件(官方插件,很好找):
- 第一步:在GitLab项目的「Settings → Integrations」里加个Jenkins的Webhook URL,触发条件选「Pipeline events」,只勾选「Success」状态,再设置个token验证。
- 第二步:在Jenkins里创建一个流水线任务,开启参数化构建,加个
ARTIFACT_DOWNLOAD_URL的字符串参数;然后在任务的「触发器」里启用「Generic Webhook Trigger」,配置好token和参数映射(把Webhook里的产物URL映射到这个参数)。 - 第三步:在GitLab流水线的最后加个通知Jenkins的阶段,用GitLab的预定义变量
CI_JOB_ARTIFACTS_URL直接拿到产物链接,传给Jenkins:
notify_jenkins: stage: notify only: - main script: - curl -X POST \ -H "Content-Type: application/json" \ -d '{"artifact_url": "'"${CI_JOB_ARTIFACTS_URL}"'", "commit_sha": "'"${CI_COMMIT_SHA}"'"}' \ "https://your-jenkins-domain.com/generic-webhook-trigger/invoke?token=your-webhook-token"
- 最后在Jenkins流水线里直接用参数下载:
pipeline { agent any parameters { string(name: 'ARTIFACT_DOWNLOAD_URL', description: 'GitLab build artifact download link') } stages { stage('Download Artifacts') { steps { sh "curl -o artifacts.zip ${ARTIFACT_DOWNLOAD_URL}" unzip artifacts.zip -d ./build-output } } } }
这个方案适合需要实时联动的场景,GitLab成功后立刻触发Jenkins处理产物。
内容的提问来源于stack exchange,提问作者SP.
相关产品推荐
相关产品推荐

