如何在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
相关产品推荐
相关产品推荐

