能否使用多个GitLab CI/CD YAML文件实现多流水线配置?
实现GitLab CI/CD多流水线拆分配置
配置思路
利用GitLab CI的rules规则,基于触发场景(合并请求目标分支、分支推送等)实现任务隔离:
- 仅当合并请求目标为
main分支时,单独运行Checkov安全扫描任务 - 其他场景(如普通分支推送、
main分支直接提交等)执行原有Terraform构建流程
完整.gitlab-ci.yml示例
# 全局变量配置(按需调整) variables: TERRAFORM_VERSION: "1.5.7" # Checkov安全扫描任务:仅针对目标main分支的合并请求触发 checkov-security-scan: stage: security-check image: bridgecrew/checkov:latest script: - checkov -d . --framework terraform --compact rules: - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"' when: always allow_failure: false # 原有Terraform计划任务:排除目标main分支的合并请求场景 terraform-plan: stage: tf-build image: hashicorp/terraform:$TERRAFORM_VERSION script: - terraform init -input=false - terraform plan -out=tfplan -input=false rules: - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"' when: never - if: '$CI_COMMIT_BRANCH' when: always # Terraform部署任务:仅在main分支直接提交时触发 terraform-apply: stage: tf-deploy image: hashicorp/terraform:$TERRAFORM_VERSION script: - terraform apply -auto-approve tfplan rules: - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"' when: never - if: '$CI_COMMIT_BRANCH == "main"' when: always
关键细节说明
rules是核心控制逻辑:通过GitLab内置环境变量$CI_MERGE_REQUEST_TARGET_BRANCH_NAME精准识别合并请求目标分支- 任务阶段分离:将Checkov放在独立的
security-check阶段,与Terraform的tf-build、tf-deploy阶段完全隔离,保证流水线独立性 - 灵活控制任务执行:
when: always强制满足条件时执行,when: never直接跳过不符合的场景,allow_failure可控制扫描不通过时是否阻断流水线
内容的提问来源于stack exchange,提问作者thom4s94
相关产品推荐
相关产品推荐

