Gitlab 计划的管道还 运行 另一项工作未按计划进行

Gitlab scheduled pipeline also run another job not on schedule

我是这个 Gitlab CI/CD 功能的新手,我遇到了以下问题。

我的 gitlab-ci.yml、自动化测试和我的部署工作中有这 2 个工作。

automation_test_scheduled:
  stage: test
  script:
    - yarn test:cypress
  only:
    - schedules

deploy_to_staging:
  stage: deploy-staging
  environment: staging
  only:
    - staging

我想 运行 我的自动化测试每天自动进行,并且我已经针对我的暂存分支创建了一个新的管道计划。

但是,当调度程序被触发时,它也会 运行 我的部署作业,这不是必需的,因为我只希望我的自动化测试 运行 在计划的管道中。

发生这种情况是因为我的 deploy_to_staging 工作有 only: - staging 规则吗?如果是这样,我如何才能将计划的管道设置为仅 运行 自动化测试而不触发其他作业?

您应该使用 rules 而不是 only,因为后者不再处于积极开发中。

考虑到这一点,您可以使用 predefined variables CI_COMMIT_REF_SLUGCI_PIPELINE_SOURCE 更改为以下 rules 子句。如果由 schedule 触发,automation_test_scheduled 仅在分支 staging 上 运行,并且 deploy_to_staging 作业在 运行 上发生任何更改=16=]分支.

automation_test_scheduled:
  stage: test
  script:
    - yarn test:cypress
  rules:
    - if: '$CI_COMMIT_REF_SLUG == "staging" && $CI_PIPELINE_SOURCE == "schedule"'

deploy_to_staging:
  stage: deploy-staging
  environment: staging
  rules:
    - if: '$CI_COMMIT_REF_SLUG == "staging"'

如果您想使用 only/except 执行此操作,添加

可能就足够了
except: 
  - schedules

到您的部署作业。 虽然作为
值得注意的是,此时首选基于 rules 的系统。
当涉及到 运行 个职位时,这也允许做出更具表现力和更详细的决策。
为两个作业设置规则的最简单方法是:

automation_test_scheduled:
  stage: test
  script:
    - yarn test:cypress
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"

deploy_to_staging:
  stage: deploy-staging
  environment: staging
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"
      when: never
    - if: $CI_COMMIT_REF_SLUG == "staging"

这可能就是您所需要的。
不过,当涉及到规则时,一种特别方便的处理方式是为配置定义一些通用规则,并通过 yaml 锚点重用这些规则。以下是您的案例的一些可重用定义:

.definitions:
  rules:
    - &if-scheduled 
      if: $CI_PIPELINE_SOURCE == "schedule"
    - &not-scheduled
      if: $CI_PIPELINE_SOURCE == "schedule"
      when: never
    - &if-staging
      if: $CI_COMMIT_REF_SLUG == "staging"

然后你可以像这样在你的工作中使用它们:

automation_test_scheduled:
  stage: test
  script:
    - yarn test:cypress
  rules:
    - *if-scheduled

deploy_to_staging:
  stage: deploy-staging
  environment: staging
  rules:
    - *not-scheduled
    - *if-staging

这种处理规则的方式使概览和重用规则变得更容易一些,这在大型配置中绝对有意义