从Jenkins迁移至GitLab:如何在单gitlab-ci.yml中分离CI与手动部署
方案可行性结论
你描述的需求完全可以通过单个gitlab-ci.yml实现,GitLab CI原生支持「部分任务自动触发、部分任务仅手动执行」的运行模式,不需要调整现有开发人员的提交、合并流程,完全适配你当前的Jenkins使用习惯。
你草拟的配置仅需做少量调整即可正常运行:
- 修正
stages段的重复定义,两个test保留一个即可,阶段是按顺序执行的,相同阶段的任务会并行运行,不需要重复声明。 - 可以给手动部署/销毁任务增加分支限制,避免在非主干分支误触发生产操作,调整后示例如下:
workflow: rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS' when: never - if: '$CI_COMMIT_BRANCH' stages: - test - deploy - destroy test-python-job: stage: test rules: - if: '$CI_PIPELINE_SOURCE == "push"' - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' script: - echo "Test Python" - black - bandit - flake8 - tox test-terraform-job: stage: test rules: - if: '$CI_PIPELINE_SOURCE == "push"' - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' script: - echo "Test Terraform" - terraform validate --yadda test-ansible-job: stage: test rules: - if: '$CI_PIPELINE_SOURCE == "push"' - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' script: - echo "Test Ansible" - ansible-lint --yadda deploy-job: stage: deploy variables: DEPLOYMENT_ID: "Only deploy-job can use this variable's value" secrets: DATABASE_PASSWORD: vault: production/db/password@ops rules: # 仅主干分支显示手动部署按钮 - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' when: manual allow_failure: true script: - echo "Terraform Deploy" - terraform deploy - ansible-playbook yaddas destroy-job: stage: destroy variables: DEPLOYMENT_ID: "Only destroy-job can use this variable's value" secrets: DATABASE_PASSWORD: vault: production/db/password@ops rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' when: manual allow_failure: true script: - terraform destroy
注:allow_failure: true 是为了避免手动任务未执行时,整个流水线被标记为失败,符合常规CI流水线的校验逻辑。
迁移适配成本评估
整体迁移成本极低,核心适配工作仅包含以下内容:
- 原有Jenkins多分支流水线的自动校验逻辑(代码检查、测试、镜像构建)可以直接平移到
gitlab-ci.yml的自动触发任务中,脚本基本不需要修改。 - 原有手动触发的部署任务逻辑可以直接平移到
when: manual的任务中,GitLab支持手动运行流水线时自定义输入参数,完全兼容你当前Jenkins参数化部署的使用习惯。 - 现有Ansible、Terraform配置以及CI环节构建的Docker镜像可以直接复用,不需要做适配调整。
- 权限管控逻辑可以完全对齐:GitLab支持配置仅指定角色的用户可触发手动部署/销毁任务,和原有Jenkins的权限管控能力一致。
内容的提问来源于stack exchange,提问作者Justin S
相关产品推荐
相关产品推荐

