Jenkins Groovy脚本调用env.BUILD_NUMBER.toInteger()报空指针错误
报错原因说明
- 首先排除
toInteger()方法本身不可用的问题:报错的根本原因是env.BUILD_NUMBER在当前上下文中确实为null,不是方法本身存在限制。 - 核心触发点:
@NonCPS注解修饰的方法属于Jenkins Pipeline的特殊执行上下文,无法直接访问Pipeline的env全局变量。你在普通pipeline步骤中用echo能拿到值,是因为普通步骤运行在标准CPS(Continuation Passing Style)执行上下文,env变量是正常绑定的,两者运行环境完全不同。 - 额外注意点:
@NonCPS方法中不仅不能直接访问env,也不能调用大部分Pipeline内置步骤,仅支持原生Java/Groovy语法执行。
修复方案
调整方法参数,将env变量从外部传入
不要在@NonCPS方法内部访问env,而是在调用方法的pipeline步骤中先取出需要的值,作为参数传入即可:
// 调整后的方法定义 @NonCPS def cancelPreviousBuilds(String jobName, Integer currentBuildNum, String currentBranch) { def currentJob = Jenkins.instance.getItemByFullName(jobName) for (def build : currentJob.builds) { if (build.isBuilding() && build.number < currentBuildNum) { // 更稳妥的分支名获取方式,不需要解析展示名,避免Jenkins展示格式调整后逻辑失效 def buildBranch = build.environment.get('BRANCH_NAME') if (buildBranch == currentBranch) { build.doStop() } } } } // 在pipeline中调用方式示例: pipeline { agent any stages { stage('Cancel Old Builds') { steps { script { // 先在CPS上下文中取出env值,再传入方法 cancelPreviousBuilds(env.JOB_NAME, env.BUILD_NUMBER.toInteger(), env.BRANCH_NAME) } } } } }
额外注意事项
调用Jenkins内置API需要在Jenkins的「进程内脚本审批」中放行相关方法权限,否则会触发权限拦截报错。
内容的提问来源于stack exchange,提问作者jipot
相关产品推荐
相关产品推荐

