我们正在使用JCasC使用如下定义的jenkins共享库:
controller:
JCasC:
configScripts:
jenkins-casc-unclassified: |
unclassified:
globalLibraries:
libraries:
- defaultVersion: "master"
implicit: true
name: "com.company.jenkins"
retriever:
modernSCM:
scm:
github:
configuredByUrl: true
credentialsId: "..."
id: "..."
repoOwner: "Company"
repository: "Company_CICD"
repositoryUrl: "https://github.com/company/Company_CICD.git"
traits:
- gitHubBranchDiscovery:
strategyId: 1
- gitHubPullRequestDiscovery:
strategyId: 1
- gitHubForkDiscovery:
strategyId: 1
trust: "gitHubTrustPermissions"
我们为Kubernetes插件制作了一个方便的函数,它允许我们大大缩短代码。然而,在尝试仅消除2行时,我们遇到了一个奇怪的错误,我们希望澄清:
java.lang.NoSuchMethodError: No such DSL method 'getPodTemplate'
奇怪的是,在不改变导入或函数名称的情况下,它会显示出来。
例如,这是有效的:
// src/com/company/jenkins/Util.groovy
package com.onscale.jenkins
def getPodTemplate(String label, List<String> containers, List<String> volumes, String yaml) {
containers = containers.collect {
value -> return getContainerTemplate(value)
}
volumes = volumes.collect {
value -> return getVolume(value)
}
return [
label: label,
yaml: yaml,
containers: containers,
volumes: volumes
]
}
// Jenkinsfile
def util = new com.onscale.jenkins.Util()
podTemplate (
util.getPodTemplate(
'jenkinsbuild', // Label
['jnlp', 'docker', 'kubectl'], // Containers
['host-path'], // Volumes
podSpec
)
)
但这并不是:
// src/com/company/jenkins/Util.groovy
package com.onscale.jenkins
def getPodTemplate(String label, List<String> containers, List<String> volumes, String yaml) {
containers = containers.collect {
value -> return getContainerTemplate(value)
}
volumes = volumes.collect {
value -> return getVolume(value)
}
return podTemplate(
label: label,
yaml: yaml,
containers: containers,
volumes: volumes
)
}
// Jenkinsfile
def util = new com.onscale.jenkins.Util()
util.getPodTemplate(
'jenkinsbuild', // Label
['jnlp', 'docker', 'kubectl'], // Containers
['host-path'], // Volumes
podSpec
)
两者之间的所有更改是getPodTemplate是否返回podTemplate。
我们到处找了找。这个堆栈溢出让我们感到困惑,因为我们没有使用var/函数。groovy
创建共享库的方法(我不确定每种“类型”的共享库的名称),我们使用“new”和globalLibrary导入。
有什么想法吗?
此作业DSL错误似乎发生在函数未编译时。在这种情况下,函数不会编译,因为groovy可以在没有括号的情况下调用函数。
示例:
def foo(name, closure) {println name; println closure()}
可以通过以下所有方式调用。
foo(“asdf”,{return “asdf”})
foo “asdf” {return “asdf”}
foo(“asdf”) {return “asdf”}
有圆括号也没有圆括号
然而,这:
foo(“asdf”)
将抛出错误MissingMethodException
,因为foo需要2个参数。而我最初认为它会返回一个部分。
因此,当我们返回没有闭包的podTemplate作为最后一个参数时,我们实际上破坏了该方法的编译,因此我们得到了一个DSL错误,因为共享库无法编译。
解决方案是添加一个闭包final参数,并将其作为最后一个参数传递给podTemplate
我试图创建一个詹金斯管道通过詹金斯文件与共享库。我通过Web UI创建了一个作业来获取Jenkinsfile,它工作正常。然而,詹金斯似乎无法识别共享库内容。下面是Jenkinsfile和共享库内容以及控制台错误。我仔细检查了Jenkins常规配置(其中设置了共享库scm)和Pipeline插件安装。不知道还能去哪里。 共享库内容 詹金斯档案内容 日志错误
我在Jenkins管道中使用下面的Groovy脚本来调用自由风格的作业,但它最终出现了“没有这样的DSL方法‘构建’”错误。
问题内容: 我在Jenkins管道中使用JSON函数并获取。我正在使用Jenkins 2.85。 任何想法如何解决这个问题? 问题答案: 使用管道实用程序步骤插件可以使用该功能。 没有此插件,您将无法使用此功能。 有关更多信息,请检查:步骤
问题内容: 我正在尝试为詹金斯创建我的第一个Groovy脚本: 在这里查看https://jenkins.io/doc/book/pipeline/之后,我创建了这个: 但是,我得到: 我想念什么? 另外,如何在不以纯文本形式编写密码的情况下将我的凭据传递到Git存储库? 问题答案: 你感到困惑和混合使用,完全的差异在这里看到。但简短的故事: 声明性管道 是管道DSL的新扩展(基本上是只有一步的管
我已经安装了所有的管道插件, 但我仍在得到 我漏了什么插件吗?
问题内容: 我正在Linux上构建C ++可执行文件。可执行文件链接到一些Boost库中。 这是我尝试运行二进制文件时的输出: 然后,我在二进制文件上运行ldd来检查依赖关系: 我不确定为什么找不到liboos_system.sl.1.45.0 SO。我今天早些时候成功构建了它。谁能解释? 问题答案: 找不到该库。 默认情况下会在中查找库,并在中指定目录。 通常,系统库(例如boost,如果通过软