在 Jenkins 中使用多分支管道“定期构建”

Posted

技术标签:

【中文标题】在 Jenkins 中使用多分支管道“定期构建”【英文标题】:"Build Periodically" with a Multi-branch Pipeline in Jenkins 【发布时间】:2017-01-03 06:39:59 【问题描述】:

我正在使用 Pipeline 插件运行 Jenkins 2。我已经设置了一个多分支管道项目,其中每个分支(主、开发等)在根目录中都有一个 Jenkinsfile。设置很简单。但是,即使代码没有更改,我也不知道如何让每个分支定期运行(而不是分支索引)。我需要在我的 Jenkinsfile 中添加什么来启用定期构建?

【问题讨论】:

【参考方案1】:

如果您使用声明式管道并且只想在特定分支上触发构建,您可以执行以下操作:

String cron_string = BRANCH_NAME == "master" ? "@hourly" : ""

pipeline 
  agent none
  triggers  cron(cron_string) 
  stages 
    // do something
  

发现于Jenkins Jira

【讨论】:

这可行,但请注意,提交和推送 Jenkinsfile 不足以让触发器被拾取;该作业之后也必须手动运行一次。 触发器可以在阶段块内吗? IE。 stage('部署到生产') triggers cron(MASTER_TRIGGER) 这将在声明性 jenkins 文件中工作还是仅在脚本 jenkins 文件中工作? 应该使用声明性的 Jenkinsfile。触发器仅在选项标签 iirc 内有效。如果您只想部署 master 分支,您可以在 deploy 块中放置一个脚本 if (BRANCH_NAME == „Master“) //deploy。 (我目前在手机上,所以语法可能有误) @Learner "如果你使用声明式管道"【参考方案2】:

如果您使用的是声明式 Jenkinsfile,那么您使用 triggers 指令。

pipeline 
    agent any
    triggers 
        cron('H 4/* 0 0 1-5')
    
    stages 
        stage('Example') 
            steps 
                echo 'Hello World'
            
        
    

【讨论】:

有什么方法可以只在master 分支上触发 cron 吗?提供一些背景信息:当团队成员创建一个新功能分支并在那里提交时,Jenkins 文件仍应触发(通过轮询或推送),但我不希望这些功能分支上的 cron 触发器触发。 使用:stage('Stage1') when branch "master" steps OR stage('Stage1 (Not master)') when not branch 'master' 步骤 sh 'do-non-master.sh' 【参考方案3】:

我能够找到一个示例来说明这一点,即丢弃旧版本,这也是我想要的。

Jenkinsfile in jenkins-infra/jenkins.io:

properties(
    [
        [
            $class: 'BuildDiscarderProperty',
            strategy: [$class: 'LogRotator', numToKeepStr: '10']
        ],
        pipelineTriggers([cron('H/30 * * * *')]),
    ]
)

【讨论】:

顺便说一句,对于第一个属性,您可以使用 buildDiscarder 符号来简化语法,正如 Pipeline Syntax 应该显示的那样。 在 jenkins 2.79 下的脚本化管道中不起作用(java.lang.UnsupportedOperationException: Undefined symbol ‘pipelineTriggers’) Eric,试试这个脚本管道:pipelineTriggers([[$class: "TimerTrigger", spec: "H 1 * * *"]])【参考方案4】:

这对我有用:

  triggers 
    cron(env.BRANCH_NAME == 'development' ? 'H */12 * * *' : '')
  

在article中查看更多信息

【讨论】:

【参考方案5】:

对于参数化的定期运行或计划的触发器,可以使用如下。

triggers
    parameterizedCron env.BRANCH_NAME == "develop" ? '''H 03 * * * % buildSlave=vm1;testSlave=vm2;HYPERVISOR=vbox;VERSION=10.5.0.0
H 03 * * * % buildSlave=vm1;testSlave=vm2;HYPERVISOR=workstation;VERSION=10.5.0.0''' : ""

【讨论】:

【参考方案6】:

我遇到了上述解决方案的问题。 我不是 Jenkins 向导,所以不确定我是否使用旧格式/语法或其他东西,但以下内容对我有用。

#!/usr/bin/env groovy
properties(
    [
        pipelineTriggers([
                [
                    $class: 'TimerTrigger',
                    spec: 'H 7,19 * * *'
                ]
         ])
    ]
)

确定自:https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/triggers/TimerTrigger.java

【讨论】:

以上是关于在 Jenkins 中使用多分支管道“定期构建”的主要内容,如果未能解决你的问题,请参考以下文章

DEVOPS技术实践_08:Jenkins多分支管道

如何限制Jenkins并发多分支管道构建?

如何让通用 Webhook 触发器插件与 Jenkins 中的多分支管道一起使用?

多分支管道作业未显示打开的拉取请求

Jenkins Subversion Multibranch 管道找不到管道

如何测试使用分支名称的Jenkins管道(或其他jenkins脚本)?