我有一个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