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

如何将带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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:57:04