解决Jenkins共享库无法正常工作的问题

130次阅读
没有评论

问题描述

最近,我尝试将共享库添加到我的Jenkins实例中,以便更轻松地维护在每个项目中运行的所有代码。
我有一个名为myorg/jenkins的仓库。在其中,我有一个Jenkinsfile和一个用于包含库的Groovy文件。Jenkinsfile如下所示:

@Library('utils@develop')_
import com.*

def jenkinsSlave = "slave.myorg.com"
node(jenkinsSlave) {
    stage('Test') {
        def var = "kek"
        myorg.echoTest(var)
    }
}

我尝试在这里执行echoTest方法,并传递一个参数。

共享库的结构如下(Jenkinsfile位于此仓库的根目录):

src
└── com
    └── myorg
        └── Utils.groovy

Utils.groovy文件内容如下:

#!/usr/bin/groovy
package com.myorg

def echoTest(test) {
    println("Test + ${test}")
}

return this

我已经在Jenkins中将这个仓库添加到全局库部分,并指向主分支,这里是develop分支。

不幸的是,当我运行构建时,Jenkins报错如下:

groovy.lang.MissingPropertyException: No such property: myorg for class: groovy.lang.Binding
...

我尝试了各种配置,但到目前为止,我无法使其工作。我尝试了一些关于实现这一点的教程,但我无法通过这个问题。

有没有人注意到这个设置中是否存在任何配置错误?

解决方案

请注意以下操作可能涉及版本差异,请谨慎操作并备份数据。

方案1:修复引用问题

根据您的报错信息,似乎您在Jenkinsfile中的代码中没有正确地实例化Utils类,因此无法引用echoTest方法。您可以尝试以下方法来修复这个问题:
1. 将Jenkinsfile中的myorg.echoTest(var)更改为Utils.echoTest(var),以正确引用Utils类中的方法。
2. 或者,您可以直接使用echoTest(var)来调用方法,因为您已经在Jenkinsfile中导入了com.*

修复后的Jenkinsfile可能如下所示:

@Library('utils@develop')_
import com.*

def jenkinsSlave = "slave.myorg.com"
node(jenkinsSlave) {
    stage('Test') {
        def var = "kek"
        Utils.echoTest(var) // 或者直接使用 echoTest(var)
    }
}

方案2:脚本批准

当您看到scriptsecurity.sandbox错误时,意味着您需要在Jenkins的脚本批准页面允许该脚本。您可以访问Jenkins的脚本批准页面,地址为https://<你的Jenkins地址>/scriptApproval/。在该页面中,您可以批准您的脚本,从而解除该脚本的沙箱限制。

另外,我建议您不要在管道中直接导入您的自定义包。相反,我建议您在./vars文件夹下定义一个步骤,在该步骤中导入自定义包。

请注意,共享库被视为可信任的,不会触发沙箱错误。更多详情请参阅官方文档

请尝试上述两种方案之一,看看是否能够解决您的问题。

希望这些解决方案对您有帮助!如果您需要进一步的帮助,请随时问我。

正文完