Gitlab CI有条件地运行阶段
如下所示,我有两个阶段。 1-建造 2-部署 我有3种分支机构 1-硕士 2-测试 3-开发人员创建的其他分支。(发展) 我想为所有分支运行构建,但我有部署的条件 1-如果分支是测试运行部署 2-如果分支为其他分支,则不运行部署 3-如果分支为主运行,则仅手动部署 但是这三个条件在我的gitlab-ci.yml中不能正常工作Gitlab CI有条件地运行阶段,gitlab,gitlab-ci,Gitlab,Gitlab Ci,如下所示,我有两个阶段。 1-建造 2-部署 我有3种分支机构 1-硕士 2-测试 3-开发人员创建的其他分支。(发展) 我想为所有分支运行构建,但我有部署的条件 1-如果分支是测试运行部署 2-如果分支为其他分支,则不运行部署 3-如果分支为主运行,则仅手动部署 但是这三个条件在我的gitlab-ci.yml中不能正常工作 stages: - build - deploy default: image: node:latest before_script: - |
stages:
- build
- deploy
default:
image: node:latest
before_script:
- |
if [ "$CI_BUILD_REF_NAME" == "master" ]; then
ENV="prod"
elif [ "$CI_BUILD_REF_NAME" == "test" ]; then
ENV="test"
else
ENV="dev"
fi
- npm install
build:
stage: build
script:
- cp ./src/env-${ENV}.js ./src/env.js
- npm run build-compressed
deploy:
stage: deploy
rules: //this section doesn't work properly
- if: '$ENV == "test"'
when: always
- if: '$ENV == "prod"'
when: manual
- when: never
script:
- cp ./src/env-${ENV}.js ./src/env.js
- npm run build-compressed
- npm run publish:${ENV}
我建议通过规则进行这样的区分。由于可以使用规则轻松覆盖变量,请参见 下面你可以找到一个简短的例子
rules
- if: $CI_COMMIT_BRANCH =~ /test/
variables: # Override ENV defined
ENV: "test" # at the job level.
- if: $CI_COMMIT_BRANCH =~ /master/
variables: # Override ENV defined
ENV: "prod" # at the job level.
- variables: # not 100% sure about this one, as when can stand without a if clause, i assume variables can too :D
ENV: "dev"
此外,我还将根据部署阶段中的分支执行规则检查。-由于验证分支比在以后的阶段确保Env变量仍然正确设置更容易
同样需要注意的是评估的顺序。仅仅因为默认部分中的脚本之前有一个,并不意味着整个脚本只计算一次。每个作业对之前的脚本进行一次评估
此外,在作业运行之前,将对规则进行评估,因为它需要确定是否应执行作业。这意味着您无法从before\u脚本中引用变量
如果要将变量从第一个作业传递到第二个作业,则需要以一种持久化的方式保存它-这样,变量在第二阶段开始之前可用。(我仍然不确定是否可以在规则中使用它们进行评估,这是您需要检查的)
我希望基于您的评论,我的补充澄清能帮助您找到最佳方法。感谢您的回复,但变量没有错误。开始部署的条件对我不起作用:->stage:deploy->rules:你对此有什么想法吗?我不能100%确定它们是否能成功地进行到下一个阶段。因此,我建议使用规则,而不是之前的脚本。如果您想传递一个env变量,您需要一个dotenv工件()——它们将被自动使用。我假设before脚本中的env变量计算得太晚。检查规则后,它不会自动转入下一个阶段。我确信ENV变量会带入部署部分,因为当我使用echo它时,我可以将ENV视为test。before脚本在每个作业之前运行,而不是在整个管道之前运行,这就是为什么ENV变量存在于作业中的原因