如何在Jenkins声明式流水线的Active Choice参数脚本中调用共享库方法?
Jenkins声明式流水线Active Choice参数调用外部类方法问题
我在Jenkins声明式流水线的Active Choice参数脚本中尝试从src/com/foo导入对象并调用方法,构建执行无报错,但构建参数未更新。Jenkinsfile里project参数调用d.getProjects()可正常工作,但CascadeChoiceParameter无法执行getDatabases(project),会回退到fallbackScript。请问是否有办法在ChoiceParameter/CascadeChoiceParameter中使用这些方法?
我的Jenkinsfile代码如下:
@Library('shared-library') _ def d = new com.foo.loadConfig() node { properties ([ parameters ([ choice(choices: d.getProjects(),description: 'Project List',name: 'project'), [ $class: 'CascadeChoiceParameter', choiceType: 'PT_SINGLE_SELECT', filterLength: 1, name: 'database', referencedParameters: 'project', script: [ $class: 'GroovyScript', fallbackScript: [ classpath: [], sandbox: true, script: 'return ["db"]' ], script: [ classpath: [], sandbox: true, script: ''' if (project.equals("Dummy")){ return ["db"] } else { def result = getDatabases(project) return result } ''' ] ] ] ]) ]) } pipeline { agent any stages { stage('Build'){ steps { echo 'Building..' } } } }
问题核心
CascadeChoiceParameter的Groovy脚本运行在独立的沙箱上下文中,和你在node块里定义的d对象不在同一个作用域,所以直接调用getDatabases()会找不到方法,触发回退脚本。
可行解决方法
方法1:在参数脚本中重新实例化类
既然共享库已经加载,参数脚本可以直接创建com.foo.loadConfig实例并调用方法:
script: ''' if (project.equals("Dummy")){ return ["db"] } else { def d = new com.foo.loadConfig() def result = d.getDatabases(project) return result } '''
方法2:将方法改为静态方法
如果loadConfig类中的方法是无状态的,可将getDatabases改为静态方法,直接通过类调用:
// 共享库src/com/foo/loadConfig.groovy修改内容 class loadConfig { static List getDatabases(String project) { // 原有业务逻辑 } }
参数脚本中调用方式:
def result = com.foo.loadConfig.getDatabases(project)
方法3:添加沙箱权限(若开启沙箱)
如果参数脚本启用了沙箱模式,需在Jenkins全局安全配置中,给com.foo.loadConfig类及getDatabases方法添加执行许可,避免权限拦截。
调试技巧
可以修改fallbackScript打印错误信息,方便排查具体问题:
fallbackScript: [ classpath: [], sandbox: true, script: ''' try { def d = new com.foo.loadConfig() return d.getDatabases(project) } catch (Exception e) { return ["Error: ${e.message}"] } ''' ]
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

