You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多项目GitLab CI/CD扫描作业的集中模板管理方案问询

集中管理GitLab CI代码扫描任务,避免逐个修改项目配置

问题背景

我在devops仓库的devops/gitlab-templates/code-scans/scans.yml文件中维护代码扫描任务,当前已集成Checkov和Snyk扫描,后续计划新增更多扫描类型。现有近10个项目要求合并至main分支时执行这些扫描,但当前每个项目的.gitlab-ci.yml都需单独配置扫描任务的触发规则,每次新增或移除扫描都要修改所有项目的配置,耗时且易出错。

当前项目侧的.gitlab-ci.yml配置如下:

include:
  - project: "<org>/devops"
    ref: "main"
    file: "/gitlab-templates/code-scans/scans.yml"

stages:
  - checkov
  - snyk

checkov:
  only:
    - main

snyk:
  only:
    - main

需求:能否在scans.yml中集中管理所有扫描任务,让每个项目只需引入一次模板即可自动执行全部扫描?

可行解决方案

核心思路是将扫描任务的触发规则、阶段定义全部纳入模板管理,项目侧仅需引入模板,无需额外配置扫描任务。

1. 修改scans.yml模板

在模板中统一定义扫描阶段、触发规则,并让所有扫描任务复用这些配置:

# 统一定义扫描阶段,项目侧会自动继承
stages:
  - code_scans

# 复用的触发规则:仅在main分支执行扫描
.code_scan_trigger:
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
      when: always

# Checkov扫描任务
checkov:
  extends: .code_scan_trigger
  stage: code_scans
  image: python:3.9
  script:
    - echo "SCANNING checkov"
    - echo "-----------------------------"
    - pip install checkov >/dev/null
    - checkov -d . --quiet --soft-fail --check HIGH --bc-api-key $BC_API_KEY --include-all-checkov-policies --run-all-external-checks 

# Snyk扫描任务
snyk:
  extends: .code_scan_trigger
  stage: code_scans
  image: node:latest
  script:
    - echo "SCANNING snyk"
    - echo "-----------------------------"
    - npm install -g npm@latest
    - npm install -g snyk
    - snyk --help
    - snyk auth $SNYK_TOKEN
    - snyk test 
  needs: [checkov]

2. 项目侧简化配置

每个项目仅需引入模板即可,无需再定义阶段和扫描任务:

include:
  - project: "<org>/devops"
    ref: "main"
    file: "/gitlab-templates/code-scans/scans.yml"

原方案失败原因

你之前的尝试中,模板里定义的scans任务并未关联Checkov和Snyk的执行逻辑,且项目侧覆盖了阶段定义,导致模板中checkov、snyk对应的阶段不存在,扫描任务无法触发。新方案直接在模板中完成所有扫描任务的配置,项目侧无需额外操作,后续新增扫描仅需在scans.yml中添加新任务并继承.code_scan_trigger即可。

扩展:支持可选扫描(按需启用)

如果部分项目不需要全部扫描,可通过CI变量控制任务是否执行:

checkov:
  extends: .code_scan_trigger
  rules:
    - !reference [.code_scan_trigger, rules]
    - if: '$DISABLE_CHECKOV == "true"'
      when: never

项目侧如需禁用Checkov,只需在CI/CD变量中设置DISABLE_CHECKOV=true即可,无需修改配置文件。

内容的提问来源于stack exchange,提问作者Yagel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:25:22