#jenkins #groovy #jenkins-pipeline
#дженкинс #groovy #дженкинс-конвейер
Вопрос:
Я настраиваю новую сборку. Выполнение простой команды оболочки работает отлично, как показано ниже:
stage("Demo") {
sh "echo 'Hi There'"
}
Я пытался «упаковать» свои сценарии оболочки в их собственные классы, просто чтобы немного подправить ситуацию. Проблема в том, что при попытке выполнить один и тот же точный сценарий оболочки из класса Дженкинс завершает сборку с:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: неклассифицированный метод java.lang.Класс sh java.lang.Строка
Это простой пример, который не работает для меня после перемещения вышеуказанного метода в его собственный класс:
stage('Demo stage') {
Tools.PrintMe("Hi There")
}
public class Tools {
public static void PrintMe(String message) {
sh "echo " message
}
}
В диспетчере сценариев также не предусмотрена опция для внесения этого отклоненного метода в белый список.
Есть ли способ обойти это? Или есть ограничение, о котором я не знаю?
Ответ №1:
@Crait чтобы выполнить вызов предопределенных шагов в вашем собственном классе, вам необходимо указать путь к объекту скрипта к вашему классу.
Итак, попробуйте это:
stage('Demo stage') {
Tools.PrintMe(this, "Hi There")
}
public class Tools {
public static void PrintMe(def script, String message) {
script.sh "echo " message
}
}
Ответ №2:
Как указывал @sshepel выше, код, выполняемый в обычном скрипте, не находится в том же контексте, что и код внутри класса. Я решил это аналогично описанному выше, создав статическую ссылку на объект script, а затем выполнив ее в своих классах.
//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
}
}
Я сделал это таким образом, чтобы избежать загрязнения сигнатур методов при передаче объекта script. Недостатком является то, что все мои классы будут зависеть от наличия набора «Script.environment = this».
Комментарии:
1. Я не очень хорошо знаком с Java. можете ли вы объяснить механику, лежащую в основе того, как это работает?