在 GitLab CI 中使用合并请求作业中的工件

Nic*_*ini 8 gitlab gitlab-ci

在我的项目中,我使用合并请求来测试构建,并在提交合并到主版本后进行部署。目前我的.gitlab-ci.yml样子:

build:
  stage: build
  script:
    - yarn build
  artifacts:
    paths:
      - public

deploy:
  stage: deploy
  script: yarn deploy
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Run Code Online (Sandbox Code Playgroud)

这种方式仅提交成功构建的内容并合并到 master 并部署。然而,构建阶段运行两次,一次在合并请求分支中,一次在主分支中。我想要这样的东西:

build:
  stage: build
  script:
    - yarn build
  artifacts:
    paths:
      - public
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"

deploy:
  stage: deploy
  script: yarn deploy
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Run Code Online (Sandbox Code Playgroud)

但是部署作业应该有一种方法来提取build合并请求分支中作业生成的工件。是否可以?

Kev*_*Rak 0

检查CI_MERGE_REQUEST_REF_PATH变量是否可用。

如果是这样,那么您也许可以将其与GET /projects/:id/jobs/artifacts/:ref_name/download?job=nameAPI 调用结合使用,在最近成功的合并请求管道中下载所需作业的工件。

像这样的东西:

rules:
  - if: ${CI_PIPELINE_SOURCE} == "merge_request_event"
script:
    # Download the binaries from the most recent successful pipeline for the CI_MERGE_REQUEST_REF_PATH
    # See: https://docs.gitlab.com/ee/api/job_artifacts.html#download-the-artifacts-archive
    - echo Downloading ${CI_API_V4_URL}/projects/$(echo ${CI_PROJECT_PATH} | sed "s/\//%2F/g")/jobs/artifacts/$(echo ${CI_MERGE_REQUEST_REF_PATH} | sed "s/\//%2F/g")/download?job=build
    # Because of the ':' in the header, the whole curl command must be inside single-quotes
    - 'curl
       --header "JOB-TOKEN: ${CI_JOB_TOKEN}"
       --output ${CI_PROJECT_DIR}/artifacts.zip
       ${CI_API_V4_URL}/projects/$(echo ${CI_PROJECT_PATH} | sed "s/\//%2F/g")/jobs/artifacts/$(echo ${CI_MERGE_REQUEST_REF_PATH} | sed "s/\//%2F/g")/download?job=build'
    # extract desired artifacts from the zip file.
    - unzip
       -o
       -d ${CI_BUILDS_DIR}/${CI_PROJECT_NAMESPACE}
       ${CI_PROJECT_DIR}/artifacts.zip
       'directory/subDirectory/*'
Run Code Online (Sandbox Code Playgroud)

请注意,CI_PROJECT_PATH 和 CI_MERGE_REQUEST_REF_PATH 通常都包含/字符。我曾经sed将它们更改为 URL 编码的%2F.

  • 据我了解,“CI_MERGE_REQUEST_REF_PATH”仅适用于合并请求管道(分离、结果和列车),并且在您(最有可能)部署到的默认分支上不可用。 (2认同)