Нет подходящего ClassLoader, найденного для захвата при использовании @GrabConfig

Я пытаюсь написать глобальную функцию script, которая использует groovy.sql.SQL.

При добавлении аннотации @GrabConfig(systemClassLoader=true) я получаю исключение при использовании глобальной функции в файле Jenkins.

Вот исключение:

hudson.remoting.ProxyException: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during conversion: No suitable ClassLoader found for grab

Вот мой код:

@GrabResolver(name='nexus',    root='http://internal.repo.com')
@GrabConfig(systemClassLoader=true)
@Grab('com.microsoft.sqlserver:sqljdbc4:4.0')
import groovy.sql.Sql
import com.microsoft.sqlserver.jdbc.SQLServerDriver

def call(name) {
  echo "Hello world, ${name}"

  Sql.newInstance("jdbc:sqlserver://ipaddress/dbname", "username","password", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
  //  sql.execute "select count(*) from TableName"
}

Ответ 1

Убедитесь, что флажок "Использовать groovy песочницу" отключен (он находится ниже текстового поля конвейера script).

Ответ 2

Как объяснялось здесь, конвейерные "сценарии" не являются простыми скриптами Groovy, они сильно преобразуются перед запуском, некоторые части на главном, некоторые на ведомых, сериализуются и передаются на следующий шаг. Таким образом, не все функции Groovy поддерживаются.

Я не уверен насчет поддержки @Grab. Это обсуждается в JENKINS-26192 (который объявлен решенным, поэтому, возможно, он работает сейчас).

Выдержка из очень интересного комментария:

Если вам нужно выполнить некоторые сложные или дорогостоящие задачи с неограниченным Groovy, физически работающим на подчиненном устройстве, может быть проще и эффективнее просто написать этот код в файле *.groovy в вашем рабочем пространстве (например, в проверке SCM) и затем используйте tool и sh/bat для запуска Groovy как внешнего процесса; или даже поместить этот материал в сценарий Gradle, выполнение плагина Groovy Maven и т.д. Сам сценарий рабочего процесса должен быть ограничен простыми и чрезвычайно легкими логическими операциями, ориентированными на управление общим потоком управления и взаимодействие с другими функциями Jenkins - подчиненным распределением, пользователем вход и тому подобное.

Короче говоря, если вы можете переместить ту пользовательскую часть, которой требуется SQL, во внешний сценарий и выполнить ее в отдельном процессе (вызванном из сценария конвейера), это должно работать. Но сделать это в самом сценарии конвейера сложнее.