Gitlab 计划的管道还运行另一个未按计划进行的作业

问题描述 投票:0回答:3

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

我的 gitlab-ci.yml 中有这两项工作,自动化测试和部署工作。

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
规则吗?如果是这样,我如何将计划的管道设置为仅运行自动化测试而不触发其他作业?

gitlab gitlab-ci
3个回答
2
投票

如果您想使用

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

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


2
投票

您应该使用 rules 而不是

only
,因为后者不再处于积极开发状态。

考虑到这一点,您可以使用

预定义变量
rules
CI_COMMIT_REF_SLUG
更改为以下
CI_PIPELINE_SOURCE
子句。如果由
automation_test_scheduled
触发,则
staging
仅在分支
schedule
上运行,并且
deploy_to_staging
作业在
staging
分支上的任何更改上运行。

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"'

0
投票

我对规则也有类似的问题,当它们看起来像的时候

  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      changes:
        - script/*
      when: manual
    - if: $CI_PIPELINE_SOURCE == "schedule"
      when: never
    - when: never

我改变了顺序,它成功了。

  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"
      when: never
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      changes:
        - script/*
      when: manual
    - when: never
© www.soinside.com 2019 - 2024. All rights reserved.