我是 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
规则吗?如果是这样,我如何将计划的管道设置为仅运行自动化测试而不触发其他作业?
如果您想使用
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
这种处理规则的方式使概览和重用规则变得更容易,这在大型配置中绝对有意义
您应该使用 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"'
我对规则也有类似的问题,当它们看起来像的时候
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