我有一个 Jenkins 管道脚本,其中加载了一个外部 Groovy 脚本,其中包含一些执行构建的函数。
这些函数应该是普通的常规函数,因为如果有人在本地计算机上的某个地方运行构建,我也想在 Jenkins 之外使用它们。
在这些函数中,我需要执行 shell 命令并评估结果。这在 groovy 调用类似函数时效果很好
def SomeFunction() {
def result = "Some shell command".execute().text
}
但是,这种执行方法在管道脚本中不起作用。
我不能使用“bat/sh”,因为这只是管道脚本,而且我希望我的函数也能在普通的 groovy 中工作。
我该如何解决这个问题?
您不应该将 Jenkins Pipeline Groovy 视为常规 Groovy 代码。所有 Pipeline Groovy(截至目前)始终在 Jenkins master 上执行。.execute()
永远不会在您期望的地方执行,Jenkins 脚本安全限制会阻止您,Jenkins 上的 CPS 转换 Groovy 引擎都是不期望能够在管道代码中使用完整 Groovy 语言的原因。
这里有一个来自 Google 网上论坛的相关帖子 https://groups.google.com/d/msg/jenkinsci-users/TtaIXm8OUl0/aNfY_6SNAAAJ斯蒂芬·康诺利:
管道是NOT groovy.
它是一个构建在 Groovy 之上的 CPS 引擎...它可能看起来像 Groovy,甚至有时会像 Groovy 一样行走和嘎嘎叫,但是如果您接受它,您的生活将会无限美好NOT Groovy.
如果您想编写惯用的 Groovy,那么全局共享库就是您应该去的地方,即使在那里您也可能会遇到问题,除非您真正理解 CPS 的魔力及其全部含义。
使用管道作为最终的编排粘合层,您的生活会变得更加轻松
我建议您阅读整个线程,因为它应该表明您不应将 Pipeline 代码视为普通的 Groovy 代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)