使用带有 Jenkins Job DSL 插件错误的葡萄下载依赖项

Posted

技术标签:

【中文标题】使用带有 Jenkins Job DSL 插件错误的葡萄下载依赖项【英文标题】:Downloading dependencies using grape with Jenkins Job DSL plugin error 【发布时间】:2014-04-22 13:23:24 【问题描述】:

我使用 Jenkins Job DSL 插件完成了一项使用 SVNKit 库获取 SVN 分支的工作,但我在使用 Grape(使用 Ivy)设置 de jar 库时遇到了一个问题。

如果我在脚本中设置:

@Grapes( 
    @Grab(group='org.tmatesoft.svnkit', module='svnkit', version='1.8.3') 
)
import org.tmatesoft.svn.core.SVNDirEntry
import org.tmatesoft.svn.core.SVNNodeKind
...
...

我收到以下错误:

FATAL: startup failed:
General error during conversion: Error grabbing Grapes -- [download failed: net.java.dev.jna#jna;3.5.2!jna.jar]

java.lang.RuntimeException: Error grabbing Grapes -- [download failed: net.java.dev.jna#jna;3.5.2!jna.jar]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    ...

这很好奇,因为如果我转到 %USERPROFILE%\.groovy\grapes\org.tmatesoft.svnkit\svnkit\jars SVNKIT 的 jars 就在那里,但出于某种奇怪的原因,Grapes 无法下载 JNA jars。

我解决了在葡萄路径中下载 JNA jar 的问题,并且它有效,但我想知道发生了什么以及如何以正确的方式执行此操作。

我正在使用:

Windows 7 64 位 Oracle JDK 1.6.0_45 Apache Tomcat 5.5.26 詹金斯 1.553 Job DSL Jenkins 插件 1.21

更新: 我不知道为什么,但现在删除 de .groovy 文件夹后,似乎工作正常。

我想我在第一次尝试获取 JNA 时遇到了网络问题,Ivy 决定在 Maven Central 上将 JNA 设置为断开的链接。之所以现在可以工作,可能是因为我删除了.groovy文件夹后,Grape尝试下载,这次网络正常。

如果有人能澄清一下就好了:)

【问题讨论】:

【参考方案1】:

我们在grapeConfig.xml 中使用我们的nexus 作为主机。

<?xml version="1.0" encoding="UTF-8"?>
<ivy-settings>
  <settings defaultResolver="downloadGrapes" />
    <property name="repo.host" value="ourhost.on.network" override="false"/>
    <property name="repo.realm" value="Sonatype Nexus Repository Manager" override="false"/>
    <property name="repo.user" value="xxx"  override="false"/>
    <property name="repo.pass" value="xxx"  override="false"/>

  <credentials host="nexus.evdssz.admin.ch" realm="$repo.realm" username="$repo.user" passwd="$repo.pass"/>
  <resolvers>
      <chain name="downloadGrapes" returnFirst="true">
      <ibiblio name="nexus" root="https://ourhost.on.network:8443/nexus/content/groups/public/" m2compatible="true"/>
      <ibiblio name="nexusreleases" root="https://ourhost.on.network:8443/nexus/content/repositories/releases/" m2compatible="true"/>
      <ibiblio name="localm2" root="file:/opt/jenkins_home/.m2/repository/" checkmodified="true" changingPattern=".*" changingMatcher="regexp" m2compatible="true"/>
    </chain>
  </resolvers>
</ivy-settings>

以下示例代码在 Jenkins 中的 groovy 库中使用:

import com.google.common.collect.HashBiMap
@Grab(group='com.google.code.google-collections', module='google-collect', version='snapshot-20080530')
def getFruit()  [grape:'purple', lemon:'yellow', orange:'orange'] as HashBiMap 
assert fruit.lemon == 'yellow'
assert fruit.inverse().yellow == 'lemon'

启用对葡萄正在做什么的调试。在你的 Jenkins 上安装葡萄工具。 设置 java 选项以启用调试信息: JAVA_OPTS="-Dgroovy.grape.report.downloads=true -Divy.message.logger.level=4"

以上信息来自这里: http://docs.groovy-lang.org/latest/html/documentation/grape.html

在所有新配置之后,我还: - 删除 .groovy/grapes/* - 重新启动詹金斯

迈克

【讨论】:

这一切都可以在没有启用 Jenkins 沙箱的情况下工作【参考方案2】:

您是否尝试过配置抓取解析器 (http://docs.groovy-lang.org/latest/html/api/groovy/lang/GrabResolver.html) ?我不知道葡萄的默认解析器,但可能默认解析器不起作用。

【讨论】:

【参考方案3】:

我认为有时当使用 Grapes(可能还有其他类似技术)解决依赖关系时,会在完全下载或正确配置依赖关系之前切换某些标志。我在 Maven 和 Gradle 上也遇到过这种情况,通常通过清除 .m2 或 .gradle 中的缓存工件并强制再次获取它们来解决问题。

【讨论】:

我在这里发布了一个简单的示例 Groovy 脚本如何显式下载最新的 JAR 依赖项 -> ***.com/questions/27136532/…

以上是关于使用带有 Jenkins Job DSL 插件错误的葡萄下载依赖项的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins:使用 job-dsl/pipeline 语法的多个 cron 表达式

Jenkins job DSL - 每当构建 Ivy 依赖项时构建

Jenkins作业DSL参数被配置块覆盖

使用job-dsl / pipeline语法的多个cron表达式

Jenkins触发job插件_Join

36-Jenkins-Job迁移