如何在GitLab CI中结合并行矩阵动态使用needs,实现跨阶段作业提前启动
如何在GitLab CI中结合并行矩阵动态使用needs,实现跨阶段作业提前启动
我懂你的需求啦——就是想让plan阶段里对应某个目录的作业,不用等整个lint阶段的所有3个作业都做完,只要同目录的lint作业一完成就立刻启动,对吧?这在GitLab CI里完全可以通过动态needs配合矩阵变量实现,下面给你具体的配置方案和说明:
首先,我们要利用GitLab CI并行矩阵作业的命名规则:当你用parallel: matrix时,每个生成的作业名称会是原作业名:矩阵变量值,比如你的lint作业会生成lint:xxx、lint:yyy、lint: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




