You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在GitLab CI中结合并行矩阵动态使用needs,实现跨阶段作业提前启动

如何在GitLab CI中结合并行矩阵动态使用needs,实现跨阶段作业提前启动

我懂你的需求啦——就是想让plan阶段里对应某个目录的作业,不用等整个lint阶段的所有3个作业都做完,只要同目录的lint作业一完成就立刻启动,对吧?这在GitLab CI里完全可以通过动态needs配合矩阵变量实现,下面给你具体的配置方案和说明:

首先,我们要利用GitLab CI并行矩阵作业的命名规则:当你用parallel: matrix时,每个生成的作业名称会是原作业名:矩阵变量值,比如你的lint作业会生成lint:xxxlint:yyylint:zzz这三个独立作业。

接下来修改你的CI配置,重点是给plan作业加上动态的needs配置:

stages:
  - lint
  - plan
  - apply

.terraform_path: &terraform_path
  - DIR:
      - "xxx"
      - "yyy"
      - "zzz"

lint:
  stage: lint
  parallel:
    matrix: *terraform_path
  script:
    - |
      terraform fmt -check -recursive -diff
      cd $DIR
      terraform init
      terraform validate
  artifacts:
    expire_in: 1 hour
    paths:
      - $DIR/.terraform

plan:
  stage: plan
  parallel:
    matrix: *terraform_path
  # 关键:动态引用对应DIR的lint作业
  needs: ["lint:$DIR"]
  script:
    - |
      cd $DIR
      # 复用lint生成的artifacts,快速初始化
      terraform init -reconfigure
      terraform plan -out=$PLAN -parallelism=30
      terraform show --json $PLAN | convert_report > $PLAN_JSON
  rules:
    - *run_if_no_lock
  artifacts:
    paths:
      - $DIR/$PLAN

核心说明:

  • needs: ["lint:$DIR"]:这里的$DIR会自动替换为当前矩阵项的目录值(比如xxx、yyy),这样每个plan作业只会等待对应目录的lint作业完成,而不是整个lint阶段的所有作业。
  • 保留lint的artifacts:这样plan作业可以直接复用lint生成的.terraform目录,不用重复执行完整的terraform init,只用-reconfigure快速初始化就能节省大量时间。
  • 作业独立性:每个plan作业的启动完全依赖同目录的lint作业,互不干扰——比如lint:xxx完成后,plan:xxx立刻启动,哪怕lint:yyy还在运行。

这样配置后,就能完美实现你要的“当前阶段单个作业完成后,立刻启动下一阶段对应作业”的需求啦!

备注:内容来源于stack exchange,提问作者a1dude

火山引擎 最新活动