Cra*_*igt 1 groovy jenkins jenkins-pipeline
我正在建立一个新版本。运行一个简单的 shell 命令效果很好,如下所示:
stage("Demo") {
sh "echo 'Hi There'"
}
Run Code Online (Sandbox Code Playgroud)
我一直试图将我的 shell 脚本“打包”到它们自己的类中,只是为了使事情变得更整洁。问题是,当尝试从一个类中执行相同的 shell 脚本时,jenkins 构建失败:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:未分类的方法 java.lang.Class sh java.lang.String
这是一个简单的例子,在将上述方法移动到它自己的类中后对我来说失败了:
stage('Demo stage') {
Tools.PrintMe("Hi There")
}
public class Tools {
public static void PrintMe(String message) {
sh "echo " + message
}
}
Run Code Online (Sandbox Code Playgroud)
脚本管理器中也没有提供选项来将这个被拒绝的方法列入白名单。
有没有办法解决这个问题?还是有我不知道的限制?
@Crait 要在您自己的类中调用预定义的步骤,您需要将脚本对象路径到您的类。
所以,试试这个:
stage('Demo stage') {
Tools.PrintMe(this, "Hi There")
}
public class Tools {
public static void PrintMe(def script, String message) {
script.sh "echo " + message
}
}
Run Code Online (Sandbox Code Playgroud)
正如@sshepel 上面指出的那样,在普通脚本中执行的代码与类中的代码不在同一个上下文中。我通过创建对脚本对象的静态引用,然后在我的类中对其执行,以与上述类似的方式解决了它。
//Set the static reference in the script
Script.environment = this
public class Script {
public static environment
}
public class Tools {
public static void PrintMe(String message) {
Script.environment.sh "echo " + message
}
}
Run Code Online (Sandbox Code Playgroud)
我这样做是为了避免通过传递脚本对象来污染方法签名。缺点是我所有的类都依赖于设置“Script.environment = this”。
归档时间: |
|
查看次数: |
2763 次 |
最近记录: |