rules:changes 在 MR 管道中始终评估为真

rules:changes always evaluates as true in MR pipeline

我有一个 monorepo,其中每个包都应构建为 docker 图像。

我为每个触发子管道的包创建了一个触发作业。

在 MR 中,我的更改规则被忽略,所有子管道都被触发。

.gitlab-ci.yml

---
workflow:
  rules:
     - if: $CI_MERGE_REQUEST_ID || $CI_COMMIT_BRANCH

trigger-package-a:
  stage: build
  trigger:
    include: .gitlab/ci/packages/package-gitlab-ci.yml
    strategy: depend
  rules:
   - changes:
      - "packages/package-a/**/*"
  variables:
    PACKAGE: package-a

trigger-package-b:
  stage: build
  trigger:
    include: .gitlab/ci/packages/package-gitlab-ci.yml
    strategy: depend
  rules:
    - changes:
      - "packages/package-b/**/*"
  variables:
    PACKAGE: package-b

done_job:
  stage: deploy
  script:
    - "echo DONE"
    - "cat config.json"
stages:
  - build
  - deploy

package-gitlab-ci.yml

workflow:
   rules:
     - if: $CI_MERGE_REQUEST_ID
     - changes:
         - "packages/${PACKAGE}/**/*"

stages:
  - bootstrap
  - validate

cache:
  key: "${PACKAGE}_${CI_COMMIT_REF_SLUG}"
  paths:
    - packages/${PACKAGE}/node_modules/
  policy: pull

install-package:
  stage: bootstrap
  script:
    - echo ${PACKAGE}}
    - echo '{"package":${PACKAGE}}' > config.json
    - "cd packages/${PACKAGE}/"
    - yarn install --frozen-lockfile
  artifacts:
    paths:
      - config.json
  cache:
    key: "${PACKAGE}_${CI_COMMIT_REF_SLUG}"
    paths:
     - packages/${PACKAGE}/node_modules/
    policy: pull-push

lint-package:
  script:
   - yarn lint
  stage: validate
  needs: [install-package]
  before_script:
   - "cd packages/${PACKAGE}/"

test-package:
  stage: validate
  needs: [lint-package]
  before_script:
     - "echo working on ${PACKAGE}"
     - "cd packages/${PACKAGE}/"
  rules:
     - if: $CI_MERGE_REQUEST_ID
  script:
     -  yarn test

看起来您的下游管道正在定义一个具有 2 个独立规则的工作流:ifchanges。如果满足 if 中的第一个条件,即如果它是 MR 管道,这可能会导致包含作业。尝试删除 changes 前面的破折号,如示例 here 中所示,将其视为单个规则:

workflow:
   rules:
     - if: $CI_MERGE_REQUEST_ID
       changes:
         - "packages/${PACKAGE}/**/*"

编辑: 最近的 issue 声明 rules:changestrigger 没有按预期工作。因此,您实际上可能需要从上游管道中删除 changes 并在下游管道中解决此问题。

旁注,与您的问题没有直接关系:GitLab Docs 为 运行 分支或 MR 管道提供工作流模板,而不会创建重复项。如果有帮助,您可以在上游管道中使用它:

workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
      when: never
    - if: '$CI_COMMIT_BRANCH'