从 Jenkinsfile 中的共享库导入类

2023-12-21

我有一个具有以下结构的共享库存储库:

(root)
+- src             
|   +- com
|       +- company
|           +- DeploySteps.groovy
+- vars
|   +- MainDeploySteps.groovy

该库通过 Jenkinsfile 导入到作业中,如下所示:

library identifier: 'jenkinslib@master', retriever: modernSCM(
     [$class       : 'GitSCMSource',
      remote       : '[email protected] /cdn-cgi/l/email-protection:jenkinslib.git',
      credentialsId: 'jenkins-credentials'])

src/com/company/DeploySteps.groovy 中的存储库中的类有一个方法(例如 CheckoutSCM),我希望将其包含在 Jenkinsfile 中。

部署步骤.groovy:

def CheckoutSCM() {
    useful steps here
}

是否有可能在 Jenkinsfile 中包含此特定方法,例如

import com.company.DeploySteps

然后像这样使用它:

CheckoutSCM('repo-here')

稍后在 Jenkinsfile 中?我读文档 https://jenkins.io/doc/book/pipeline/shared-libraries/很多次但没有找到答案是否可以从src文件夹,不仅来自vars.

为什么我问因为现在导入时:import com.company.DeployUtils然后尝试调用方法CheckoutSCM()查看 Jenkins 控制台输出中的错误:

java.lang.NoSuchMethodError:找不到这样的 DSL 方法“CheckoutSCM” 步骤之间

下面列出了可用的方法,其中没有我的CheckoutSCM一定)

那么,是否有可能导入类src文件夹到 Jenkinsfile?

附:我可以在 Jenkinsfile MainDeploySteps 中访问

MainDeploySteps {}

不过没有任何问题。


我只是想添加一个答案来解决 OP 和后续评论中的几个问题。

我是否正确理解您的共享库仅公开“vars”目录中的全局变量,以将该变量包含到 Jenkinsfile 中?虽然尝试直接从“src”文件夹将其他任何内容包含到 Jenkinsfile 中并不是它的设计方式,因为“src”类旨在包含“vars”目录中的变量。

首先让我介绍一下共享库的背景知识。有 2 种类型称为动态共享库 https://www.jenkins.io/doc/book/pipeline/shared-libraries/#loading-libraries-dynamically(定义使用library步骤)和全局共享库 https://www.jenkins.io/doc/book/pipeline/shared-libraries/#automatic-shared-libraries(在 Jenkins 全局配置中定义并使用@Library注解)。两者之间的两个重要区别是:

  • 沙箱限制不适用于全局共享库中的代码,因为此类库中的代码被视为trusted(毕竟是管理员全局配置的)。动态共享库的情况并非如此,因为它们是由用户定义的,因此不可信。
  • 全局共享库中的类可以静态引用Jenkinsfile并作为编译的一部分得到解决Jenkinsfile,但这对于动态共享库是不可能的,因为这些库是在运行时定义的,并且类在编译时无法进行交叉检查。

来到OP,它使用动态共享库概念,这意味着类不能被静态引用。然而,动态共享库中有一些可以利用的功能。这些详细信息可以在文档中找到,但这里是一个摘要:

  • library步骤返回库的表示形式,可以将其分配给变量以供进一步使用,例如def myLib = library identifier: ...
  • 可以使用库对象上的完全限定名称来引用类,例如def myCls = myLib.com.mycom.mypkg.MyClass
  • 您收到的不是实际的 Groovy 类,而是一个类似代理的对象,只允许对底层类进行有限的操作。
  • 您可以使用实例化一个新实例new功能和它的工作原理非常相似new操作员。您传递的参数与传递给构造函数的参数相同,例如,myCls.new(arg1, arg2)
  • 您可以获取静态变量(尽管无法设置它)或使用代理对象调用静态方法,就像它是真正的类一样。如果您使用实例化对象new无论如何,您也可以通过实例访问静态成员(正常的 Groovy 语义适用)。

在这两种类型的库中,var 文件使用相同的机制公开(也称为全局变量和自定义步骤),因此使用上没有区别。此外,var 文件在库的上下文中执行,因此在 var 文件中,您不需要特殊的语法来访问类,无论它们是在全局库还是动态共享库中。

现在要回答OP中的真正问题,可以调用CheckoutSCM来自动态共享库。如果它被定义为静态函数,则可以使用以下方式调用它myLib.com.company.DeploySteps.CheckoutSCM('repo-here')如果它被定义为非静态方法,则可以使用以下方式调用它myLib.com.company.DeploySteps.new(...).CheckoutSCM('repo-here')。然而在这两种情况下DeploySteps类将无法访问步骤 API,因此即使是简单的echo不管用。一种传统的解决方法是提供this的实例Jenkinsfile作为参数(例如,CheckoutSCM(this, 'repo-here'))然后被分配给steps函数内的参数(可以命名为任何名称)。然后,您将调用steps参数,例如steps.echo '...'.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Jenkinsfile 中的共享库导入类 的相关文章

  • 如何从 jenkins 的现有项目生成 .hpi 插件

    我正在尝试使用 jenkins 的性能插件 但最新版本存在一些问题 如链接中所述 https issues jenkins ci org browse JENKINS 27100 https issues jenkins ci org br
  • 詹金斯钩子不工作 - 詹金斯位桶

    您好 我正在使用 jenkins 和 bitbucket 当我向 bitbucket 存储库提交任何内容时 我想触发 jenkins 中的构建 在詹金斯 我创建了一个名为test 1 在配置部分Build Triggers我勾选的部分Tri
  • 如何使用 jenkins pipeline 共享库定义全局变量或常量?

    虽然我能够定义方法 但使用 Jenkins 共享库定义变量似乎是迄今为止尚未解决的任务 I added vars True groovy有了这个身体 def call return true 现在在 Jenkinsfile 中 我尝试测试它
  • Jenkins 管道作业无法在 UI 中完成

    目前的问题是詹金斯管道作业确实运行并正常完成 但在 UI 中 该工作会一直保留 直到我们通过 UI 中止他 这种情况并不常见 大概只占 5 的工作岗位 这可能是詹金斯错误 重新加载配置问题或只是节点上的流量太大 我真的不确定 由于所有 有问
  • 从 Ansible 中的文件结果中提取文件名

    我正在尝试使用 Ansible 的结果find模块 它返回在特定文件夹中找到的文件列表 问题是 当我迭代结果时 我没有文件名 我只有它们的完整路径 包括名称 有没有一种简单的方法来使用find result item下面提供file nam
  • 如何通过运行构建队列重新启动 Jenkins?

    我们的 Jenkins 执行大量集成测试 詹金斯运行的时间越长 测试所需的时间就越长 因此 我们每天晚上通过 cronjob 重新启动 Jenkins 服务器 同时 构建队列太长而无法完成 当前正在运行的作业被取消并失败 那太丑了 我找到了
  • 在 docker run 中发布 8080:80 和 8080:8080 有什么区别?

    我正在尝试运行詹金斯容器 我使用 docker run restart always name myjenkins p 8080 80 jenkins 但无法访问 jenkinshttp 本地主机 8080 http localhost 8
  • git jenkins 中未找到存储库

    我正在使用 jenkins 2 64 并安装了最新的插件 我试图在 jenkins 中设置 git 存储库并给出凭据 但给出错误无法连接存储库 状态代码为 128 Cloning repository https github com so
  • Jenkins - 配置 Jenkins 以轮询 SCM 中的更改

    我正在与 jenkins 合作 当 svn 存储库发生更改时 我想运行 Maven 目标 我附上了一张我当前配置的图片 我知道每 5 分钟检查一次存储库是疯狂的 我想只有当有新的变化时才运行它 但我找不到方法 无论如何 它不会检查存储库 我
  • 仅运行相应源代码已更改的单元测试?

    我正在 Jenkins CI 服务器中运行单元测试和 Selenium 测试 众所周知 在大型项目中测试需要很长时间才能运行 Java 是否有一个工具 框架只能触发其源代码已更改的测试 这是因为并非每次对 SCM 的提交都会影响源代码的所有
  • 在 Jenkins 内运行构建时,我收到“java/lang/OutOfMemoryError”

    2020 02 25 10 11 24 986 0000 id 79 信息hudson model AsyncPeriodicWork lambda doRun 0 开始maven repo cleanup 2020 02 25 10 11
  • Xvfb 插件可在 Jenkins 上同时运行多个作业实例

    我在 Jenkins 有一份工作 负责运行用 Selenium 编写的 UI 测试 该作业可以同时运行它的多个实例 我在尝试使用 Xvfb Xvfb插件 https wiki jenkins ci org display JENKINS X
  • Jenkins v2.212:创建扩展解析器类时出错:找不到类

    将 Jenkins 升级到 v2 212 并安装许多可用的插件更新后 某些作业开始失败并出现以下错误 12 43 35 WS CLEANUP Deleting project workspace 12 43 35 WS CLEANUP De
  • Jenkins 并行管道中的顺序阶段

    我在 Jenkins 中有一个动态脚本化管道 它有许多并行阶段 但在每个阶段内都有多个串行步骤 我已经浪费了好几天的时间试图让它工作 无论我尝试什么 所有串行子阶段都集中到一个阶段 这是我现在所拥有的 node stage Parallel
  • Jacoco 代码覆盖率在 Jenkins 上显示覆盖率为 0%

    我已阅读了类似问题的大部分答案 但没有一个适合回答我的问题 我的 pom 文件中的配置文件如下所示
  • Jenkins 上的 XCode 项目陷入“codesign”

    我使用 Jenkins 与 XCode 插件进行持续集成 有一个 Jenkins 坚持的项目 usr bin codesign force sign 接下来是旋转器 永远旋转 我以前从未见过这个 以前有人见过这个吗 是配置文件问题还是证书问
  • 在 Jenkins 中执行批处理文件

    我有一个简单的批处理文件 我想要从 Jenkins 调用 运行 执行该文件 Jenkins 中有同样的插件吗 如何从 Jenkins 执行批处理文件 如果有相同的教程或文档 无需为此添加新插件 在Jenkins 选择您的工作名称并转到配置部
  • 如何将文件参数传递给詹金斯管道中的另一个构建作业?

    如何将当前工作区中的文件作为参数传递给构建作业 例如 build job other project parameters class FileParameterValue 真是一场噩梦 没有文档 查看了詹金斯代码等 尝试了一切 最后发现这
  • 詹金斯上的登录类型选择有什么区别?

    我之前已经在一些机器上通过 war 文件和作为 Windows 服务安装的网页安装了 jenkins 现在我尝试通过 msi 文件将其安装在另一台计算机上 但我遇到了一个问题 在安装步骤中 有一个步骤询问我 登录类型 这给了我 2 个选择
  • 与字符串比较在 Jenkins 管道中不起作用

    知道为什么IF ELSE下面的作品 def checkPrValidity wordCountStr sh returnStdout true script git diff ignore space at eol target branc

随机推荐