当前位置: 首页 > 知识库问答 >
问题:

如何在沙盒管道脚本中将Jenkins配置为@Grab依赖项

戎鹏云
2023-03-14

我能够在Jenkins管道脚本中以沙盒和非沙盒模式使用@Grab注释。我的问题是,依赖项在默认情况下是针对maven central repository解决的,但我需要针对我们公司的Artifactory解决它们。要演示此问题,请使用以下简单的管道脚本:

//@Grab(group = 'my.compay', module='my-module-name', version='1.0.0-SNAPSHOT')
//import my.company.MyFancyClass
@Grab('com.google.guava:guava:23.0')
import com.google.common.base.Joiner

pipeline {
    agent any
    stages {
        stage('Grape Test') {
            steps {
                echo "Joiner: ${Joiner.class}"
                // echo "MyFancyClass: ${MyFancyClass.class}"
            }
        }
    }
}

当我按原样运行脚本时,我将在输出中看到类的完全限定名称。然而,当我取消注释与公司artifactory脚本中公开的依赖项一起工作的注释行时,失败如下:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 2: unable to resolve class my.company.MyFancyClass
 @ line 1, column 1.
   @Grab(group = 'my.company', module='my-module-name', version='1.0.0-SNAPSHOT')

1 error

经过调查,我发现@Grab使用了Groovy特有的东西,称为Grape,这在这里有描述。所提到的文档描述了如何使用文件~/中的常春藤设置配置Grape以使用您自己的存储库。groovy/grapeConfig。xml。我找到了解决方案,并使其适用于具有以下内容的常规Groovy代码:

<ivysettings>
<settings defaultResolver="downloadGrapes"/>
<credentials host="localhost" realm="Artifactory Realm" username="USERNAME" passwd="PASSWORD"/>
<resolvers>
  <chain name="downloadGrapes" returnFirst="true">
    <filesystem name="cachedGrapes">
      <ivy pattern="${user.home}/.groovy/grapes/[organisation]/[module]/ivy-[revision].xml"/>
      <artifact pattern="${user.home}/.groovy/grapes/[organisation]/[module]/[type]s/[artifact]-[revision](-[classifier]).[ext]"/>
    </filesystem>
    <ibiblio name="localm2" root="file:${user.home}/.m2/repository/" checkmodified="true" changingPattern=".*" changingMatcher="regexp" m2compatible="true"/>

    <ibiblio name="maven-release" m2compatible="true" root="http://artifactory:8081/artifactory/maven-release"/>
    <ibiblio name="maven-snapshot" m2compatible="true" root="http://artifactory:8081/artifactory/maven-snapshot"/>
    <!-- todo add 'endorsed groovy extensions' resolver here -->
    <ibiblio name="jcenter" root="https://jcenter.bintray.com/" m2compatible="true"/>
    <ibiblio name="ibiblio" m2compatible="true"/>
  </chain>
</resolvers>
</ivysettings>

不幸的是,这个常春藤配置文件只部分修复了我的问题,并使Grapes只能从常规Groovy代码中正常工作(从CLI调用graped命令也是如此)。

我不知道Jenkins是如何使用Groovy/Grapes的,但它显然忽略了该文件的默认位置。我阅读了一些常春藤文档,发现可以自定义一些常春藤设置,例如使用属性配置文件位置。这就是为什么我试图说服Jenkins通过使用以下命令从CLI运行配置来有效地使用配置:

java -Divy.settings.file=%USERPROFILE%\.groovy\grapeConfig.xml -jar jenkins.war --httpPort=8888

这确实有效,但令我惊讶的是,它只是部分有效!只有当我关闭管道脚本的沙盒模式时,它才有效。如果我打开它,我再次只能从maven Central@Grab依赖项。

任何想法都非常欢迎...

共有1个答案

萧渝
2023-03-14

由于我还没有收到任何答案,我进一步进行了调查,得出了有趣的结论。首先,让我们看看修改后的管道脚本:

@Grab('com.google.guava:guava:23.0')
import com.google.common.base.Joiner

pipeline {
    agent any
    stages {
        stage('Grape Test') {
            steps {
                echo "Joiner: ${Joiner.class}"
                 script {
                    Joiner.class.getClassLoader().getURLs().each { url ->
                        println url.toExternalForm()
                    }
                }
           }
        }
    }
}

我在沙盒模式下运行了这个脚本,maven central似乎满足了对Guava的依赖性。令人惊讶的是,我发现Joiner来自其他地方,如缩短的输出所示:

...

[Pipeline] echo
Joiner: class com.google.common.base.Joiner

...

[Pipeline] echo
file:/C:/Users/mrohac/.jenkins/war/WEB-INF/lib/guava-11.0.1.jar

...

所以,这个测试证明了在导入工作并从类路径加载类时,@Grab处于沙盒模式,被默默忽略。这让我得出结论,如何在管道中使用用Java编写的脚本专有代码的唯一方法是将相关依赖项放在类路径上。

因此,在管道脚本中启用自定义Java代码的结论是将相关的依赖关系放在类路径上。对于作为Jenkins新手的我来说,实现这一点的最佳方法是值得怀疑的。无论如何,我可以确认将依赖关系放在~/. jenkins/war/WEB-INF/lib/可以有效地在管道脚本中使用所需的类。

当然,这可能意味着新的问题,尤其是与Jenkins整体稳定性相关的问题,这可能会因课堂上的冲突而受到损害。无论如何,我希望管道脚本可以使用自定义Java代码进行扩展,并将对Jenkins稳定性的影响降至最低,例如通过引入专用的管道插件来注册和加载此类依赖项。

 类似资料:
  • 问题内容: 我最近将bash执行命令重写为Jenkins管道。旧代码就像 现在,我使用管道脚本来包装命令,像这样 但是,我遇到了一个错误。当我尝试时,它会正确显示。所以我怀疑内部有问题。 在使用管道之前,命令在外壳执行中工作正常。因此,源代码安装在Jenkins服务器上,似乎管道脚本不知道源命令是什么。 如何在sh wrapd块中运行source命令? 问题答案: 替换为 请注意,第一个点后有一个

  • 我正试图在我的maven项目中使用Jenkins主从架构。我有windows机器上的Jenkins master和Linux机器上的slave。现在的问题是,当我运行Jenkins脚本时,它会给我一个错误,比如无法初始化git存储库,因为Jenkins正在尝试执行git。Linux从机上的exe。有人能告诉我怎么解决吗? 以下是我的Jenkins管道脚本和错误日志 错误如下

  • 我有一个Maven SpringBoot项目。我想把它推到云工厂。为此,我为Jenkins编写了一个groovy管道脚本。我要补充什么?在脚本和/或pom中。xml将其发布到Artifactory中,这样Jenkins将从Git中提取代码并将其发布到Artifactory。在另一个环境中,我将拉出artifactory版本化的JAR,并将其推送到Cloud Foundry。 假设我的项目的grou

  • 问题内容: 我正在尝试在我的Jenkins版本中屏蔽密码。 我一直在尝试mask-passwords插件。 但是,这似乎不适用于我的Jenkins管道脚本,因为如果定义了密码,然后在这样的脚本中使用它,则会得到: 如果使用,则其值将解析为。 那么,如何在Jenkins管道脚本中屏蔽密码? 问题答案: 最简单的方法是使用Credentials插件。 您可以在此处定义不同类型的凭据,无论是单个密码(“

  • 我尝试了以下链接:https://docs.microsoft.com/en-us/azure/devops/artifacts/get-start-maven?view=azure-devops

  • 我需要重载jenkins函数来调试IDE中的管道脚本。 我是java/groovy等的新手。我将编写几百行脚本化管道。Groovy是基于java的。由于我是新手,我更喜欢函数名完成/建议和调试功能,在这里我可以一步一步地浏览这些行并查看vars中的内容。 我用groovy插件设置了一个EclipseLuna。这实际上是有效的=)!(对于最新的eclipse,插件还没有准备好)。调试也很酷! 但是特