GitLab CI能否实现多分支/版本流水线部署及定时更新?
GitLab CI实现分支部署测试+手动/定时触发生产部署方案
完全可以实现你需要的流水线需求,先分析你现有配置的问题,再给出完整的解决方案:
现有配置的问题
- 生产部署触发条件过窄:你的
deploy:prod规则仅匹配固定标签v11.0.0,只有推送该特定标签时才会执行,主分支推送或定时任务触发时都不会触发这个任务。 - 阶段顺序无依赖:测试和生产部署都放在
release阶段,无法保证“测试通过后再部署生产”的执行顺序。
完整配置方案
下面的配置将实现:
- 主分支推送时,自动执行测试→部署测试环境,需手动确认后部署生产
- 推送版本标签(如
v1.0.0)时,自动执行测试→部署测试→部署生产 - 定时任务触发时,自动执行测试→部署测试→部署生产(用于更新证书等)
# 定义流水线阶段顺序,确保执行流程:测试→部署测试→部署生产 stages: - test - deploy_test - deploy_prod # 测试阶段:所有触发场景都需先执行测试 test: image: alpine:3.18 stage: test script: - echo "执行自动化测试用例..." # 这里替换成你的实际测试命令 rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' when: always - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/' when: always - if: '$CI_PIPELINE_SOURCE == "schedule"' when: always # 部署测试环境:主分支、标签、定时触发时自动执行,依赖测试通过 deploy:test: image: alpine:3.18 stage: deploy_test script: - echo "部署到测试环境:分支=$CI_COMMIT_BRANCH,标签=$CI_COMMIT_TAG" - cat version.txt # 这里替换成你的实际测试环境部署命令 rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' when: always - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/' when: always - if: '$CI_PIPELINE_SOURCE == "schedule"' when: always needs: [test] # 必须等待测试阶段成功完成才会执行 # 部署生产环境:支持三种触发方式 deploy:prod: image: alpine:3.18 stage: deploy_prod script: - echo "部署到生产环境:分支=$CI_COMMIT_BRANCH,标签=$CI_COMMIT_TAG" - cat version.txt - echo "更新证书、配置等内容..." # 这里替换成你的实际生产环境部署命令 rules: # 1. 主分支推送后,手动确认部署(测试通过后需人工触发) - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' when: manual allow_failure: false # 禁止跳过,必须手动确认 # 2. 推送版本标签时自动部署(适配vX.X.X格式的版本号) - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/' when: always # 3. 定时任务触发时自动部署(用于定期更新证书) - if: '$CI_PIPELINE_SOURCE == "schedule"' when: always needs: [deploy:test] # 必须等待测试环境部署完成才会执行
定时任务设置
在GitLab项目的「CI/CD」→「计划」页面添加定时任务,设置执行频率(比如每天凌晨2点),触发后流水线会自动执行全流程,完成生产环境的证书更新等操作。
关键配置说明
needs关键字:用来定义任务依赖,确保前序阶段成功后才会执行当前任务,实现“测试通过再部署”的顺序要求。when: manual:主分支推送时,生产部署需要手动确认,避免误操作直接部署生产。- 正则匹配标签:用
$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/'匹配所有标准版本格式的标签,无需固定某个标签。 CI_PIPELINE_SOURCE == "schedule":识别定时触发的流水线,自动执行全流程。
内容的提问来源于stack exchange,提问作者danrhjones
相关产品推荐
相关产品推荐

