You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:39:42