当前位置: 首页 > 知识库问答 >
问题:

Jenkins:在向共享库函数添加插件DSL函数时,没有这样的DSL方法

松亦
2023-03-14

我们正在使用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导入。

有什么想法吗?

共有1个答案

连坚白
2023-03-14

此作业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,如果通过软