Gitlab CI有条件地运行阶段

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: - |

如下所示,我有两个阶段。

1-建造

2-部署

我有3种分支机构

1-硕士

2-测试

3-开发人员创建的其他分支。(发展)

我想为所有分支运行构建,但我有部署的条件

1-如果分支是测试运行部署

2-如果分支为其他分支,则不运行部署

3-如果分支为主运行,则仅手动部署

但是这三个条件在我的gitlab-ci.yml中不能正常工作

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变量存在于作业中的原因