使用@GrabConfig时,找不到合适的ClassLoader

Bri*_*ght 15 groovy jenkins jenkins-pipeline

我正在尝试编写一个使用groovy.sql.SQL的全局函数脚本.

添加注释@GrabConfig(systemClassLoader=true)时,在Jenkinsfile中使用全局函数时会出现异常.

这是一个例外:

hudson.remoting.ProxyException: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during conversion: No suitable ClassLoader found for grab
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

@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"
}
Run Code Online (Sandbox Code Playgroud)

Hug*_* M. 1

正如这里所解释的所解释的,管道“脚本”不是简单的 Groovy 脚本,它们在运行之前经过大量转换,一些部分在主设备上,一些部分在从设备上,它们的状态(变量值)被序列化并传递到下一步。因此,并非所有 Groovy 功能​​都受支持。

\n\n

我不确定@Grab支持情况。JENKINS-26192中对此进行了讨论(它被声明为已解决,所以也许它现在可以工作)。

\n\n

摘自一个非常有趣的评论

\n\n
\n

如果您需要在从属设备上物理运行不受限制的 Groovy 来执行一些复杂或昂贵的任务,则只需将该代码写入工作区中的 *.groovy 文件中可能是最简单且最有效的(例如,在 SCM 结账中),然后使用工具和 sh/bat 将 Groovy 作为外部进程运行;或者甚至将这些内容放入 Gradle 脚本、Groovy Maven 插件执行等中。工作流程脚本本身应仅限于简单且极其轻量级的逻辑操作,专注于编排控制和交互的整体流程其他 Jenkins 功能\xe2\x80\x94slave 分配、\n 用户输入等。

\n
\n\n

简而言之,如果您可以将需要 SQL 的自定义部分移至外部脚本并在单独的进程中执行(从管道脚本调用),那么应该可以工作。但在 Pipeline 脚本本身中执行此操作更为复杂。

\n