Ответ 1
Убедитесь, что флажок "Использовать groovy песочницу" отключен (он находится ниже текстового поля конвейера script).
Я пытаюсь написать глобальную функцию 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"
}
Убедитесь, что флажок "Использовать groovy песочницу" отключен (он находится ниже текстового поля конвейера script).
Как объяснялось здесь, конвейерные "сценарии" не являются простыми скриптами Groovy, они сильно преобразуются перед запуском, некоторые части на главном, некоторые на ведомых, сериализуются и передаются на следующий шаг. Таким образом, не все функции Groovy поддерживаются.
Я не уверен насчет поддержки @Grab
. Это обсуждается в JENKINS-26192 (который объявлен решенным, поэтому, возможно, он работает сейчас).
Выдержка из очень интересного комментария:
Если вам нужно выполнить некоторые сложные или дорогостоящие задачи с неограниченным Groovy, физически работающим на подчиненном устройстве, может быть проще и эффективнее просто написать этот код в файле *.groovy в вашем рабочем пространстве (например, в проверке SCM) и затем используйте tool и sh/bat для запуска Groovy как внешнего процесса; или даже поместить этот материал в сценарий Gradle, выполнение плагина Groovy Maven и т.д. Сам сценарий рабочего процесса должен быть ограничен простыми и чрезвычайно легкими логическими операциями, ориентированными на управление общим потоком управления и взаимодействие с другими функциями Jenkins - подчиненным распределением, пользователем вход и тому подобное.
Короче говоря, если вы можете переместить ту пользовательскую часть, которой требуется SQL, во внешний сценарий и выполнить ее в отдельном процессе (вызванном из сценария конвейера), это должно работать. Но сделать это в самом сценарии конвейера сложнее.