Continuous integration 同一分支的多个管道

Continuous integration 同一分支的多个管道,continuous-integration,gitlab,gitlab-ci,continuous-deployment,gitlab-pipelines,Continuous Integration,Gitlab,Gitlab Ci,Continuous Deployment,Gitlab Pipelines,GitLab CI提供了非常好的灵活性和多种功能。因此,使用GitLabCI yaml、调度器等实现特定配置的方式并不明显 我有兴趣设置一个工作流,我在下面以一种简化的方式介绍它 我只使用主分支,在主分支中,我希望在每次提交后启动主管道。这个管道将构建和测试我的包。 我想也有一个预定的夜间管道发布我的包的网站。因此,它需要最新的工件,生成文档并将其一起发布到GitLab页面 所以,基本上我想在同一个分支上运行两条不同的管道。主节点是常规节点,次节点是调度程序运行的节点 在我的实际用例中,我希望有

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

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

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

所以,基本上我想在同一个分支上运行两条不同的管道。主节点是常规节点,次节点是调度程序运行的节点

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

仅使用
规则并不能真正解决这一问题。有一个新的
工作流
命令,理论上可以通过分支在这里应用

if scheduled then
  include nightly.gitlab-ci.yml
else
  include primary.gitlab-ci.yml
但我认为这是不可能的

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

有什么想法可以实现我想要的配置吗


我想到的唯一办法是继续拥有另一个分支,即主机克隆,每天晚上我都需要在那里替换
.gitlab ci.yml
。这需要额外的工作站来实现自动化。

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

build\u作业:
...
测试工作:
...
部署作业:
...
仅:
-时间表
我理解您最初的问题是,您是否只能在计划的管道上运行部署作业,但在这种情况下为什么不测试它并重新构建?通常,在部署之前测试和构建工件是一种很好的做法,尤其是在不需要太多时间的情况下

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

我知道您需要4条管道,例如:

  • 为提交的更改运行主管道
  • 每晚运行1条管道
  • 每晚运行2条管道,与每晚运行1条不同
  • 每周管道运行
对于Primary,您可以利用以下功能仅在提交的更改上运行作业:

#仅在推送时运行的主作业(即推送提交时)
#它不能按计划运行
主管道作业:
阶段:建造
脚本:
-echo“我将仅在提交的更改上运行”
# [...]
规则:
-如果$CI_管道_源==“推送”
对于多个计划管道,您可以利用计划配置上设置的和自定义变量,例如:

.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
  # [...]
#夜间#u管道_1_作业_A和作业_B将在计划管道上运行
#仅在计划和每晚运行管道时\u 1==“true”
夜间管道作业:
# [...]
规则:
-如果:$CI_PIPELINE_SOURCE==“schedule”&&$RUN_NIGHTLY_PIPELINE_1==“true”
夜间管道作业:
# [...]
规则:
-如果:$CI_PIPELINE_SOURCE==“schedule”&&$RUN_NIGHTLY_PIPELINE_1==“true”
#夜间管道作业将在计划管道上运行
#仅在计划和每晚运行管道时\u 2==“true”
夜间管道作业:
# [...]
规则:
-如果:$CI_PIPELINE_SOURCE==“schedule”&&$RUN_NIGHTLY_PIPELINE_2==“true”
#每周管道作业将在计划管道上运行
#仅在计划和每周运行时\u管道==“true”
每周管道作业:
# [...]
规则:
-如果:$CI_PIPELINE_SOURCE==“schedule”&&$RUN_WEEKLY_PIPELINE==“true”
在GitlabCI设置CI/CD>计划>[你的计划]>变量中,你可以选择相关变量。例如,对于
夜间管道1


如果要在同一管道上运行多个作业,而不是重复
规则:
,则可以利用以下功能:


部署不仅仅是一个阶段,而是整个管道。此外,正如我在Q中所解释的,我希望有3个预定的管道。其中之一,部署管道只是从其他管道收集信息,并生成一个成功/失败表,提到提交sha,因为每日/每周/每次提交管道通常会有不同的sha。每周管道测试是一个繁重的测试套件,最多需要100小时。不幸的是,您的解决方案似乎不适用。根据我的经验,使用Gitlab+Gitlab CI可以轻松实现简单的工作流,但对于更高级的工作流,我会使用Jenkins或其他提供更多功能的工具。如果您仍然需要在Gitlab上执行此操作,则存在类似的问题,一些用户建议如何绕过此问题,例如,回答得好,这仍然是缺少功能的解决方法,但可能是目前为止最好的解决方法