You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jenkins多分支Jenkinsfile中按分支配置discard old builds等选项

问题解答

可行性结论

该需求完全可实现,你的设计思路是正确的,仅需要对语法做少量调整即可正常运行。

语法问题修正

你最初的写法存在语法问题:声明式流水线的options块默认不支持直接编写if流程控制语句,直接运行会抛出语法错误。可以选择以下两种修正方案:

方案1:声明式流水线使用三目表达式动态传参

适合判断逻辑简单的场景,不需要修改整体流水线结构:

pipeline {
  agent any
  options {
    disableConcurrentBuilds()
    buildDiscarder(logRotator(
      numToKeepStr: env.BRANCH_NAME.contains('release-') ? '20' : (env.BRANCH_NAME == 'master' ? '20' : '10'),
      daysToKeepStr: env.BRANCH_NAME.contains('release-') ? '365' : (env.BRANCH_NAME == 'master' ? '90' : '20')
    ))
  }
  // 其余流水线阶段逻辑
  stages {
    // 此处编写你的构建、测试、部署等阶段
  }
}

方案2:流水线外层使用脚本逻辑预定义配置

适合判断逻辑更复杂的场景,灵活性更高:

// 提前根据分支名称计算构建保留规则
if (env.BRANCH_NAME.contains('release-')) {
  properties([buildDiscarder(logRotator(numToKeepStr: '20', daysToKeepStr: '365'))])
} else if (env.BRANCH_NAME == 'master') {
  properties([buildDiscarder(logRotator(numToKeepStr: '20', daysToKeepStr: '90'))])
} else {
  properties([buildDiscarder(logRotator(numToKeepStr: '10', daysToKeepStr: '20'))])
}

pipeline {
  agent any
  options {
    disableConcurrentBuilds()
  }
  // 其余流水线阶段逻辑
  stages {
    // 此处编写你的构建、测试、部署等阶段
  }
}

官方规则说明

Jenkins官方流水线规范明确支持以下特性保障该需求生效:

  • 多分支流水线内置的BRANCH_NAME环境变量为全局可访问的变量,可用于所有配置项的逻辑判断
  • buildDiscarder的logRotator参数支持传入动态计算的字符串表达式,不需要写死固定值
  • Jenkinsfile中定义的构建丢弃规则优先级高于多分支流水线的全局分支源配置,不会出现全局配置覆盖自定义规则的问题

内容的提问来源于stack exchange,提问作者Heavy Breathing Cat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:36:03