在 GitLab 白银和高级版中,有
$CI_JOB_TOKEN 可用,它允许以下 .gitlab-ci.yaml sn-p:
build_submodule:
image: debian
stage: test
script:
- apt update && apt install -y unzip
- curl --location --output artifacts.zip "https://gitlab.example.com/api/v4/projects/1/jobs/artifacts/master/download?job=test&job_token=$CI_JOB_TOKEN"
- unzip artifacts.zip
only:
- tags
但是,如果您没有银牌或更高级别的 gitlab 订阅,而是依赖免费套餐,也可以使用 API 和管道触发器。
假设我们有 项目 A 正在构建 项目 B 需要的 app.jar。
首先,您需要一个 API 令牌。
转到Profile settings/Access Tokens 页面创建一个,然后将其作为变量存储在项目B中。在我的例子中是GITLAB_API_TOKEN。
在项目 B 的 CI/CD 设置中添加一个新触发器,例如“项目 A 已构建”。这将为您提供一个可以复制的令牌。
打开 项目 A 的 .gitlab-ci.yaml 并从 项目 B 的 CI / CD 设置触发器部分复制 trigger_build: 部分。
项目 A:
trigger_build:
stage: deploy
script:
- "curl -X POST -F token=TOKEN -F ref=REF_NAME https://gitlab.example.com/api/v4/projects/${PROJECT_B_ID}/trigger/pipeline"
将 TOKEN 替换为该令牌(最好将其作为变量存储在 project A 中 - 然后您需要将其设为 token=${TRIGGER_TOKEN_PROJECT_B} 或其他内容),并将 REF_NAME 替换为您的分支(例如master)。
然后,在项目 B 中,我们可以编写一个仅基于触发器构建并检索工件的部分。
项目 B:
download:
stage: deploy
only:
- triggers
script:
- "curl -O --header 'PRIVATE-TOKEN: ${GITLAB_API_TOKEN}' https://gitlab.example.com/api/v4/projects/${PROJECT_A_ID}/jobs/${REMOTE_JOB_ID}/artifacts/${REMOTE_FILENAME}"
如果您知道工件路径,则可以将${REMOTE_FILENAME} 替换为它,例如build/app.jar。项目 ID 可以在 CI/CD 设置中找到。
我扩展了 project A 中的脚本以传递触发器设置部分中记录的剩余信息:
将variables[VARIABLE]=VALUE 添加到 API 请求中。变量值可用于区分触发管道和正常管道。
所以触发器传递了 REMOTE_JOB_ID 和 REMOTE_FILENAME,当然你可以根据需要修改它:
curl -X POST \
-F token=TOKEN \
-F ref=REF_NAME \
-F "variables[REMOTE_FILENAME]=build/app.jar" \
-F "variables[REMOTE_JOB_ID]=${CI_JOB_ID}" \
https://gitlab.example.com/api/v4/projects/${PROJECT_B_ID}/trigger/pipeline