同一分支有多个管道

时间:2020-10-19 07:57:43

标签: continuous-integration gitlab gitlab-ci continuous-deployment gitlab-pipelines

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

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

我只使用master分支,我希望我的主管道在每次提交后启动。该管道将​​构建并测试我的程序包。 我还希望有一个按计划的每晚发布管道,以发布我的软件包的网站。因此,它需要使用最新的工件,生成文档并将其一起发布到GitLab页面。

因此,基本上,我想在同一分支上运行两个不同的管道。主要是常规的,而次要是调度程序运行的。

在我的实际用例中,我希望有2条计划的夜间管道和1条每周管道,因此包括主要管道(每次提交),总共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。这需要额外的工作站来自动化。

2 个答案:

答案 0 :(得分:1)

我希望有2条计划的夜间管道和1条每周管道,所以包括主要的(每次提交),总共4条管道,仍然是同一分支

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

  • 主要管道运行提交的更改
  • 每天晚上运行
  • 几乎1 管道
  • 每晚运行
  • Nightly 2 管道,与 Nightly 1
  • 每周管道每周运行

对于主要,您可以利用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>时间表> [您的时间表]>变量中,您可以关联变量。例如,对于Nightly pipeline 1

enter image description here


如果您要在同一管道上运行多个作业,而不是复制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
  # [...]

答案 1 :(得分:0)

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

variables:
  major: 1
  minor: $[counter(variables['major'], 1)]

steps:

- task: update-assembly-info@2
  inputs:
    assemblyInfoFiles: '**\*AssemblyInfo.*'
    company: 'com'
    product: 'pro'
    fileVersionMajor: '$(Date:yyyy)'
    fileVersionMinor: '$(Date:MM)'
    fileVersionBuild: '$(Date:dd)'
    fileVersionRevision: '$(minor)'
    assemblyVersionMajor: '$(Date:yyyy)'
    assemblyVersionMinor: '$(Date:MM)'
    assemblyVersionBuild: '$(Date:dd)'
    assemblyVersionRevision: '$(minor)'

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