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_SLUG
和 CI_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"
- ¬-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
这种处理规则的方式使概览和重用规则变得更容易一些,这在大型配置中绝对有意义
我是这个 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_SLUG
和 CI_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"
- ¬-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
这种处理规则的方式使概览和重用规则变得更容易一些,这在大型配置中绝对有意义