GitLab CI/CD如何实现deploy触发时自动重跑依赖的build作业
可行配置方案
核心调整逻辑
当前配置的核心问题是将build和deploy两个存在先后依赖的作业放在了同一个deploy阶段,GitLab 同阶段作业默认并行调度,无法自动触发前置作业重跑。通过拆分阶段+配置作业触发规则,即可在不改变两个作业独立运行环境的前提下,实现单按钮触发全流程、强制build先重跑、禁止deploy独立运行的需求。
具体配置修改
- 首先在
gitlab-ci.yml顶部定义流水线阶段顺序,保证build永远在deploy之前执行:
stages: - build - deploy
- 修改
build作业配置,调整所属阶段、增加触发规则,仅在部署流程触发时自动运行:
build: extends: .node_base stage: build artifacts: paths: - artifact_folder rules: # 手动触发部署/手动点deploy按钮时,自动重跑build拉取最新文件 - if: $CI_PIPELINE_SOURCE == "web" when: always # 其余场景不自动触发build,避免无效运行 - when: never script: - npm start
- 修改
deploy作业配置,增加限制规则禁止独立重跑:
deploy: tags: - linux-docker stage: deploy when: manual image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest script: - aws --endpoint-url $AWS_HOST s3 sync artifact_folder/ s3://$AWS_S3_BUCKET --delete --acl public-read dependencies: - build rules: # 仅允许在流水线页面触发deploy,触发后自动拉起前置build作业 - if: $CI_PIPELINE_SOURCE == "web" when: manual # 禁止单独重跑deploy作业,避免复用旧的build制品 - if: $CI_PIPELINE_SOURCE == "job" when: never
最终效果
- GitLab界面仅在deploy阶段显示1个手动触发按钮,点击一次即可自动执行全流程:先跑build拉取最新外部文件生成制品,build成功后自动运行deploy上传S3,无需二次手动操作
- deploy作业无法脱离build独立运行,每次部署必然执行最新的build流程,不会复用历史旧制品
- 两个作业仍然使用各自原有运行环境,build走预装npm的.node_base环境,deploy走aws-base镜像,完全符合基础设施限制,不需要在deploy环境额外安装npm
内容的提问来源于stack exchange,提问作者Maror
相关产品推荐
相关产品推荐

