我如何转换这个groovy类并在Jenkins中作为库运行它?



我有一个groovy类,它有一个main方法和一些其他方法。

public class secrets {
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();
}
public static String getSecret(SecretsManagerClient sm,String secretName, String secretType){
.......

当尝试在Jenkins中运行这个时,我得到错误:

groovy.lang.MissingMethodException: No signature of method: com.dev.libs.secrets.call() is applicable for argument types: (java.lang.String, java.lang.String,) values: [secret, username]

我知道我需要一个call函数,但我不确定如何在这种情况下使用它。如何转换此代码?

假设您想对getSecret方法的结果String对象做一些事情。我进一步假设,你已经将secrets.groovy文件放在共享库中(在我的示例中以名称test-library标识)并在你的构建脚本中有正确的@Library注释。

注意:我不得不"一些对象来测试我的代码。所以基本上可以忽略前几个代码片段你喜欢。

Jenkins共享库代码

vars/Region.groovy的模拟文件

enum Region {
EU_WEST_1
}

vars/SecretsManagerClient.groovy的模拟文件

class SecretsManagerClient {
static SecretsManagerClientBuilder builder() {
new SecretsManagerClientBuilder()
}
def close() {
}
static class SecretsManagerClientBuilder {
SecretsManagerClientBuilder region(Region region) {
this
}
SecretsManagerClient build() {
new SecretsManagerClient()
}
}
}
vars/secrets.goovy代码示例
// probably some import for SecretsManagerClient and Region
//public class secrets {
def call(String secretName, String secretType) {
SecretsManagerClient sm = SecretsManagerClient.builder()
.region(Region.EU_WEST_1)
.build();
try {
return getSecret(sm, secretName, secretType);
} finally {
sm.close();
}
}
static String getSecret(SecretsManagerClient sm, String secretName, String secretType) {
"secret"
}
//}

Jenkins管道构建脚本

我使用了一个非常简单的构建脚本,调用构建步骤并返回getSecret方法的结果。

// import library named "test-library" in settings (mind the underscore at the end!)
@Library('test-library')_
// run on master node (or any other label you might choose)
node('master') {
// create a stage
stage('Get secret from new step') {
// run our custom build step named "secrets", which will use "call" function to call "getSecret"  
def theSecret = secrets "name", "type"
// print result
sh "echo ${theSecret}"
}
}

输出
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/Test-Job
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Get secret from new step)
[Pipeline] sh
+ echo secret
secret
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline

最新更新