在 jenkinsfile 中移动到自定义 class 时命令失败
Commands fail when moving to them custom class in jenkinsfile
我正在设置一个新版本。 运行 一个简单的 shell 命令就可以完美运行,如下所示:
stage("Demo") {
sh "echo 'Hi There'"
}
我一直在尝试 "package" 我的 shell 脚本变成它们自己的 classes 只是为了让事情变得更整洁。问题是,当尝试从 class 中执行完全相同的 shell 脚本时,jenkins 构建失败:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:
unclassified method java.lang.Class sh java.lang.String
这是一个简单的例子,在将上述方法移到它自己的方法后我失败了 class:
stage('Demo stage') {
Tools.PrintMe("Hi There")
}
public class Tools {
public static void PrintMe(String message) {
sh "echo " + message
}
}
脚本管理器中也没有提供选项来将这个被拒绝的方法列入白名单。
有办法解决这个问题吗?还是有我不知道的限制?
@Crait 调用您自己的预定义步骤 class 您需要将脚本对象指向您 class.
所以,试试这个:
stage('Demo stage') {
Tools.PrintMe(this, "Hi There")
}
public class Tools {
public static void PrintMe(def script, String message) {
script.sh "echo " + message
}
}
正如@sshepel 上面指出的那样,在普通脚本中执行的代码与 class 中的代码不在同一上下文中。我通过创建对脚本对象的静态引用然后在我的 classes 中执行它以与上面类似的方式解决了它。
//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
}
}
我这样做是为了避免在传递脚本对象时污染方法签名。缺点是我所有的 classes 都依赖于设置 "Script.environment = this"。
我正在设置一个新版本。 运行 一个简单的 shell 命令就可以完美运行,如下所示:
stage("Demo") {
sh "echo 'Hi There'"
}
我一直在尝试 "package" 我的 shell 脚本变成它们自己的 classes 只是为了让事情变得更整洁。问题是,当尝试从 class 中执行完全相同的 shell 脚本时,jenkins 构建失败:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: unclassified method java.lang.Class sh java.lang.String
这是一个简单的例子,在将上述方法移到它自己的方法后我失败了 class:
stage('Demo stage') {
Tools.PrintMe("Hi There")
}
public class Tools {
public static void PrintMe(String message) {
sh "echo " + message
}
}
脚本管理器中也没有提供选项来将这个被拒绝的方法列入白名单。
有办法解决这个问题吗?还是有我不知道的限制?
@Crait 调用您自己的预定义步骤 class 您需要将脚本对象指向您 class.
所以,试试这个:
stage('Demo stage') {
Tools.PrintMe(this, "Hi There")
}
public class Tools {
public static void PrintMe(def script, String message) {
script.sh "echo " + message
}
}
正如@sshepel 上面指出的那样,在普通脚本中执行的代码与 class 中的代码不在同一上下文中。我通过创建对脚本对象的静态引用然后在我的 classes 中执行它以与上面类似的方式解决了它。
//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
}
}
我这样做是为了避免在传递脚本对象时污染方法签名。缺点是我所有的 classes 都依赖于设置 "Script.environment = this"。