如何将带main方法的Groovy类改造为Jenkins可运行的共享库?
报错原因
Jenkins 共享库中,当你以 secrets(参数1, 参数2) 的形式调用类/脚本时,Jenkins 会默认匹配目标类下的 call() 方法,你当前代码仅实现了 main 和 getSecret 方法,没有对应2个字符串入参的 call 方法,因此抛出方法不存在的异常。
改造方案
根据你存放代码的目录不同,有两种适配方式:
方式1:代码存放在 src/com/dev/libs/ 目录下
保留原有类结构,新增和调用入参匹配的 call 实例方法即可,改造后完整代码如下:
package com.dev.libs import software.amazon.awssdk.regions.Region import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient class secrets { // 新增2个入参的call方法,匹配调用时的参数类型 String call(String secretName, String secretType) { SecretsManagerClient sm = SecretsManagerClient.builder() .region(Region.EU_WEST_1) .build() try { return getSecret(sm, secretName, secretType) } finally { sm.close() } } // 原有getSecret方法逻辑保持不变 public static String getSecret(SecretsManagerClient sm,String secretName, String secretType){ // ....... 原有实现 } // main方法可保留用于本地测试,不影响Jenkins运行 public static void main(String[] args) { String secretName = args[0]; String secretType = args[1]; //username, password or b64_authkey SecretsManagerClient sm = SecretsManagerClient.builder() .region(Region.EU_WEST_1) .build(); getSecret(sm, secretName, secretType); sm.close(); } }
调用方式(Jenkinsfile 中使用):
// 先导入对应类 import com.dev.libs.secrets // 实例化类后直接调用 def secretTool = new secrets() def userName = secretTool('secret', 'username') // 也可显式调用call方法,效果完全一致 def passWord = secretTool.call('secret', 'password')
方式2:代码存放在 vars/ 目录下作为全局步骤
如果要实现无需导入、直接在 Jenkinsfile 中调用的全局步骤,把文件命名为 secrets.groovy 放到 vars 目录下,代码无需包声明,直接实现 call 方法即可:
import software.amazon.awssdk.regions.Region import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient String call(String secretName, String secretType) { SecretsManagerClient sm = SecretsManagerClient.builder() .region(Region.EU_WEST_1) .build() try { return getSecret(sm, secretName, secretType) } finally { sm.close() } } String getSecret(SecretsManagerClient sm,String secretName, String secretType){ // ....... 原有实现 }
调用方式(Jenkinsfile 中直接使用,无需导入):
def userName = secrets('secret', 'username')
注意事项
- 确保 Jenkins 运行节点/共享库已引入 AWS Secrets Manager 对应的 SDK 依赖,否则会出现类找不到的异常
- 确保 Jenkins 运行环境有访问 AWS Secrets Manager 的权限,比如 IAM 角色、AK/SK 配置等
内容的提问来源于stack exchange,提问作者TheWalkingMalteser
相关产品推荐
相关产品推荐

