如何在gitlab-ci中使用规则

时间:2020-01-15 09:05:02

标签: gitlab gitlab-ci pipeline gitlab-ci-runner

我正在尝试构建一个可以有条件执行的作业,具体取决于是否使用WebClientdevelop分支中修改了rules中的文件或子目录。如果仅在developer分支中找到更改,则将构建管道。

目前我在.gitlab-ci.yml中得到的是

deploy_dev_client:
  stage: client
  tags:
    - my tags
  script:
    - '& cd WebClient'
    - 'npm rebuild node-sass'
    - 'npm install @angular/cli@7.0.3'
    - '& npm run build-release --max_old_space_size=$NODE_MEMORY_SIZE'

  rules:
    - changes:
      - WebClient/**/*
      when: always
    - when: never

但是,在测试之后,我意识到只要将本地仓库中的内容推送到gitlab,甚至在其他分支,都将执行管道。

我尝试使用only:-develop',但是如果由于yaml invalid已经被使用而导致无法使用only的情况,则会导致rules错误。无论如何,我仍然可以使用rules来仅定位develop分支吗?

1 个答案:

答案 0 :(得分:2)

在此链接中:

https://docs.gitlab.com/ee/ci/yaml/#ruleschanges

他们写道rules: changes应该和only/except一样工作。如果您读到有关only/except的内容,则可能会遇到一些奇怪的事情:

https://docs.gitlab.com/ee/ci/yaml/#using-onlychanges-without-pipelines-for-merge-requests

将新分支或新标签推送到GitLab时,策略始终评估为true。

要解决此问题并仅在开发分支上运行您的工作,您应该可以将ifchanges结合起来:

deploy_dev_client:
  stage: client
  tags:
    - my tags
  script:
    - '& cd WebClient'
    - 'npm rebuild node-sass'
    - 'npm install @angular/cli@7.0.3'
    - '& npm run build-release --max_old_space_size=$NODE_MEMORY_SIZE'

  rules:
    - if: '$CI_COMMIT_REF_NAME== "development"'
      changes:
      - WebClient/**/*
      when: always

(我尚未测试此代码,所以让我知道它是否全部错了!)