我有以下 GitLab CI:
stages:
- firstStage
- secondStage
-first-job:
stage: firstStage
parallel:
matrix:
- ENVIRONMENT:
- test
- production
environment: $ENVIRONMENT
script:
- echo "firstStage $ENVIRONMENT"
when: manual
allow_failure: false
-second-job:
stage: secondStage
parallel:
matrix:
- ENVIRONMENT:
- test
- production
environment: $ENVIRONMENT
script:
- echo "secondStage $ENVIRONMENT"
when: manual
allow_failure: false
我的问题是我想仅为“测试”环境执行所有作业。但现在,如果我不为所有环境(测试/生产)执行“第一项作业”,我就无法为任何环境执行第二项作业。
我知道我可以:
但我想知道是否有一种更干净的方法来预先配置环境并仅执行其中一个环境的管道..
rules
关键字 来控制作业执行。为此,请使用自定义脚本设置一个环境变量,然后可以在 rules
条件下使用该环境变量。
[Updated GitLab CI Pipeline]
|
setup
|
firstStage
/ \
test production
| | (via rules)
secondStage secondStage
那就是:
stages:
- setup
- firstStage
- secondStage
setup-job:
stage: setup
script:
- export SELECTED_ENVIRONMENT=test
artifacts:
reports:
dotenv: environment_variables
first-job:
stage: firstStage
parallel:
matrix:
- ENVIRONMENT:
- test
- production
script:
- echo "firstStage $ENVIRONMENT"
environment:
name: $ENVIRONMENT
rules:
- exists:
variables: $SELECTED_ENVIRONMENT == $ENVIRONMENT
when: manual
allow_failure: false
second-job:
stage: secondStage
parallel:
matrix:
- ENVIRONMENT:
- test
- production
script:
- echo "secondStage $ENVIRONMENT"
environment:
name: $ENVIRONMENT
rules:
- exists:
variables: $SELECTED_ENVIRONMENT == $ENVIRONMENT
when: manual
allow_failure: false
needs:
- first-job
带有
setup
的附加 setup-job
阶段会导出值为 SELECTED_ENVIRONMENT
的 test
变量。dotenv
中的 artifacts:reports
工件 (
setup-job
) 捕获导出的 SELECTED_ENVIRONMENT
变量,以便可以在后续阶段使用。
在
first-job
和 second-job
中,rules
关键字与 exists
指令一起使用,以检查 SELECTED_ENVIRONMENT
变量是否与每个作业的 ENVIRONMENT
变量匹配。这将确保 firstStage
和 secondStage
中的作业仅在 test
环境中运行,根据 SELECTED_ENVIRONMENT
中设置的 setup-job
值。needs
中的second-job
关键字确保它在执行之前等待first-job
成功完成。