如何在 gitlab-ci 中使用规则

Việ*_*yễn 6 pipeline gitlab gitlab-ci gitlab-ci-runner

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

目前我得到的.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
Run Code Online (Sandbox Code Playgroud)

但是,经过测试,我意识到每当我从本地存储库向 gitlab 推送某些内容时都会执行管道,即使在另一侧的分支上也是如此。

我试过使用only:-develop',但它导致yaml invalid错误,可能是因为only如果rules已经使用则无法使用。无论如何,我仍然可以使用rules仅针对develop分支吗?

MrB*_*rta 6

在这个链接中:

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。

为了解决这个问题并且只在开发分支上运行你的工作,你应该能够结合if使用changes

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
Run Code Online (Sandbox Code Playgroud)

(我还没有测试过这段代码,所以如果有错,请告诉我!)