Gitlab CI/CD跨分支传递Artifact 解决源分支删除后无法拉取制品问题
GitLab 原生跨分支制品拉取解决方案
以下方案均不需要额外搭建外部存储,也无需按分支名规划存储路径:
方案1:按提交哈希拉取制品(兼容性最好)
GitLab 制品拉取API支持使用提交SHA替代分支名作为定位参数,源分支删除后对应提交只要仍存在于仓库(合并入主分支后提交必然保留),制品就可以正常拉取。
将原有拉取命令中的分支名替换为预设变量 $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA 即可:
curl -k --location --header "PRIVATE-TOKEN:super_secret_token" "https://gitlab.my_domain.tld/api/v4/projects/2/jobs/artifacts/$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA/download?job=terraform_plan" -o artifact.zip
建议将认证令牌替换为内置的 $CI_JOB_TOKEN,无需手动配置权限,安全性更高。
方案2:使用needs关键字直接关联MR流水线制品(GitLab 13.10+)
GitLab 原生支持跨流水线引用制品,不需要手动调用API拉取。主分支的apply job可以直接关联对应MR流水线的plan job,配置示例如下:
apply: stage: apply only: - main needs: - pipeline: $CI_MERGE_REQUEST_PIPELINE_ID job: terraform_plan script: - terraform apply tfplan
GitLab 会自动将对应plan job的制品下载到当前job的工作目录,无需额外操作。
方案3:将制品绑定到Merge Request对象(GitLab 14.1+)
在plan job的配置中添加expose_as字段,将制品直接绑定到MR对象:
terraform_plan: stage: plan only: - merge_requests artifacts: paths: - "*/tfplan" - executed_dirs.txt expose_as: "terraform-plan-artifacts"
后续拉取时可以通过MR IID定位制品,不受源分支删除影响,拉取API示例:
curl -k --location --header "PRIVATE-TOKEN:super_secret_token" "https://gitlab.my_domain.tld/api/v4/projects/2/merge_requests/$CI_MERGE_REQUEST_IID/artifacts/download?job=terraform_plan" -o artifact.zip
注意事项
- 需确保
plan阶段制品的过期时间长于MR从创建到合并的平均周期,避免制品提前被清理 - 所有用到的预设变量仅在MR合并触发的主分支流水线中自动注入,手动触发的主分支流水线需要手动传入对应参数
内容的提问来源于stack exchange,提问作者DavisTasar
相关产品推荐
相关产品推荐

