【发布时间】:2020-07-19 22:35:09
【问题描述】:
我正在为 Jenkins 创建自己的全局库,我有 hosted on github,为了简化一些常规任务,我想添加一个返回 GIT 标记的函数。
因此我创建了这样的东西:
class Myclass{
static String getGitTag() {
return "${sh(returnStdout: true, script: 'git tag --sort version:refname | tail -1').trim()}"
}
}
...导致此错误:
没有方法签名:静态 com.stevnsvig.jenkins.release.ReleaseUtil.sh()
所以我有两个问题:
- 导入
sh()库的解决方案是 Jenkins 的 groovy 显然已经导入的吗? (如果是的话如何) - 这里的最佳做法是什么?我想知道为什么当您使用声明性管道时没有
GIT_TAG全局变量,并且(在我看来)这样的事情应该很容易。
编辑#1:
static String getGitTag() {
stdout = script.sh(script: "git tag --sort version:refname | tail -1", returnStdout: true)
return stdout.trim()
}
产生类似的错误:
没有方法签名:静态 com.stevnsvig.jenkins.release.ReleaseUtil.sh() 适用于参数类型:(java.util.LinkedHashMap) 值:[[returnStdout:true, script:git tag --sort版本:参考名 |尾 -1]]
编辑#2:
static String getGitTag() {
def stdout = "git tag --sort version:refname | tail -1".execute()
return stdout.in.text
}
完成,但输出为空白。使用pwd 运行相同的命令会返回/,这表明环境未设置,这是有道理的,因为在 Jenkins 下运行的所有命令都旨在在管道下运行
编辑#3:
我去寻找进口。在 github 上偶然发现了 Jenkins CI 项目并开始搜索许多存储库。 Found a promising one... 并在 /vars 中放入一个名为 pwd.groovy 的文件,内容如下:
import org.jenkinsci.plugins.workflow.steps.durable_task.ShellStep
static String getPWD() {
def ret = ShellStep.sh(returnStdout: true, script: "git tag --sort version:refname | tail -1").trim()
echo "currently in ${ret}"
}
我得到的错误是相同的变体。我想既然是插件,定义就不一样了……
hudson.remoting.ProxyException: groovy.lang.MissingMethodException: 没有方法签名:静态 org.jenkinsci.plugins.workflow.steps.durable_task.ShellStep.sh() 适用 ...
【问题讨论】:
-
请分享您的项目文件夹和文件结构以及定义
getGitTag()的文件的源代码 -
@yong 顶部的链接a global library for Jenkins链接到所有源
-
您确实需要导入 Pipeline Steps 库以在您的课程中定义
sh。此外,您的所有三个尝试都有各种问题,但第二个最接近正确,因此请在导入后继续该尝试。 -
另外,您可以将此方法定义为全局 var 而不是全局库类成员,然后您可以完全避免导入问题。这种方法似乎非常简单,足以证明它是一个全局变量。
-
@MattSchuchard 不幸的是运气不佳......
标签: jenkins groovy jenkins-pipeline jenkins-shared-libraries