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
。这需要额外的工作站来自动化。
答案 0 :(得分:1)
我希望有2条计划的夜间管道和1条每周管道,所以包括主要的(每次提交),总共4条管道,仍然是同一分支
我了解您需要4个管道,例如:
对于主要,您可以利用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
:
如果您要在同一管道上运行多个作业,而不是复制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)'
我理解您最初的问题是,是否只能在计划的管道上运行部署作业,但为什么不进行测试并在这种情况下重新构建呢?通常最好在部署前测试和构建工件,尤其是在不需要太多时间的情况下。