2

GitLab CI 提供了非常好的灵活性和多种功能。因此,如何使用 GitLabCI yaml、调度程序等实现特定配置并不明显。

我有兴趣设置一个工作流程,我将在下面以简化的方式介绍它。

我只使用 master 分支,我希望我的主要管道在每次提交后启动。该管道将​​构建和测试我的包。我还想有一个预定的夜间管道来发布我的包裹的网站。因此,它需要最新的工件,生成文档并将其一起发布到 GitLab 页面。

所以,基本上我希望在同一个分支上运行两个不同的管道。主要是常规的,辅助是由调度程序运行的。

在我的实际用例中,我希望有 2 个计划的夜间管道和一个每周管道,因此包括主要的管道(每次提交),总共 4 个管道,仍然用于同一个分支。

使用only/rules并不能真正解决这个问题。有一个新workflow命令,理论上可以通过分支应用在这里

if scheduled then
  include nightly.gitlab-ci.yml
else
  include primary.gitlab-ci.yml

但我不认为这是可能的。

最用户友好的解决方案是为计划的管道提供一个选项来选择自定义.gitlab-ci.yml文件,而不是启动默认文件。

任何想法如何实现我正在寻找的配置?

我想到的唯一方法是继续拥有另一个分支,master 的克隆,我需要.gitlab-ci.yml每天晚上更换。这需要额外的工作站来自动化。

4

2 回答 2

1

我希望有 2 个预定的夜间管道和一个每周管道,因此包括主要管道(每次提交),总共 4 个管道,仍然用于同一个分支

我了解您需要 4 个管道,例如:

  • 为提交的更改运行主管
  • 每晚运行 1 个管道,每晚运行
  • Nightly 2管道每晚运行,与Nightly 1不同
  • 每周运行的每周管道

对于Primary,您可以利用rules以下方式仅在提交的更改上运行作业$CI_PIPELINE_SOURCE == "push"

# Primary job running only on push (i.e. on pushed commits)
# It won't run on schedule
primary_pipeline_job:
  stage: build
  script:
  - echo "I will run only on commited changes"
  # [...]
  rules:
  - if $CI_PIPELINE_SOURCE == "push"

对于多个计划的管道,您可以同时利用$CI_PIPELINE_SOURCE == "schedule"计划配置中设置的自定义变量,例如:

# nightly_pipeline_1_job_A and job_B will be run on scheduled pipelines
# only on schedule and when RUN_NIGHTLY_PIPELINE_1 == "true"
nightly_pipeline_1_job_A:
  # [...]
  rules:
  - if: $CI_PIPELINE_SOURCE == "schedule" && $RUN_NIGHTLY_PIPELINE_1 == "true"

nightly_pipeline_1_job_B:
  # [...]
  rules:
  - if: $CI_PIPELINE_SOURCE == "schedule" && $RUN_NIGHTLY_PIPELINE_1 == "true"

# nightly_pipeline_2_job_A will be run on scheduled pipelines
# only on schedule and when RUN_NIGHTLY_PIPELINE_2 == "true"
nightly_pipeline_1_job_B:
  # [...]
  rules:
  - if: $CI_PIPELINE_SOURCE == "schedule" && $RUN_NIGHTLY_PIPELINE_2 == "true"

# weekly_pipeline_job will be run on scheduled pipelines
# only on schedule and when RUN_WEEKLY_PIPELINE == "true"
weekly_pipeline_job:
  # [...]
  rules:
  - if: $CI_PIPELINE_SOURCE == "schedule" && $RUN_WEEKLY_PIPELINE == "true"

在您的 GitlabCI 设置CI/CD > Schedules > [Your schedule] > Variables中,您可以关联变量。例如,对于Nightly pipeline 1

在此处输入图像描述


如果您想在同一管道上运行多个作业,而不是复制rules:,您可以利用extends以下方法:

.nightly_pipeline_1:
  rules:
  - if: $CI_PIPELINE_SOURCE == "schedule" && $RUN_NIGHTLY_PIPELINE_1 == "true"

nightly_pipeline_1_job_A:
  extends: .nightly_pipeline_1
  # [...]

nightly_pipeline_1_job_B:
  extends: .nightly_pipeline_1
  # [...]
于 2020-10-23T13:24:42.877 回答
0

如果您有在每次提交后启动的管道,那么只需向其中添加部署阶段,该阶段只会针对计划的触发器执行。这样,您将只需要一个 CI 配置:

build_job:
...
test_job:
...
deploy_job:
...
  only:
    - schedules

我了解您最初的问题是您是否只能在预定的管道上运行部署作业,但为什么不对其进行测试并在这种情况下重新构建呢?在部署之前测试和构建工件通常是一种很好的做法,尤其是在不需要太多时间的情况下。

于 2020-10-19T09:19:56.537 回答