Команды терпят неудачу при переходе к ним в пользовательский класс в jenkinsfile

#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. можете ли вы объяснить механику, лежащую в основе того, как это работает?