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

如何从Jenkins文件中调用Groovy脚本?

洪研
2023-03-14

我正在尝试将Jenkinsfile中的内容分离到groovy脚本中进行制作。但它无法调用这些脚本:下面是代码:

#!/usr/bin/env groovy

node('test-node'){

  stage('Checkout') {
    echo "${BRANCH_NAME} ${env.BRANCH_NAME}"
    scm Checkout

  }

  stage('Build-all-targets-in-parallel'){

    def workspace = pwd()
    echo workspace
    parallel(
      'first-parallel-target' :
       {
         // Load the file 'file1.groovy' from the current directory, into a variable called "externalMethod".
         //callScriptOne()
         def externalMethod = load("file1.groovy")
         // Call the method we defined in file1.
          externalMethod.firstTest()
       },
       'second-parallel-target' :
      {
         //callScriptTwo()
         def externalMethod = load("file2.groovy")
         // Call the method we defined in file1.
         externalMethod.testTwo()
        }
    )
  }
  stage('Cleanup workspace'){
    deleteDir()
  }
}

文件groovy公司

#!groovy

def firstTest(){

  node('test-node'){
    
    stage('build'){
      echo "Second stage"
    }
    
    stage('Cleanup workspace'){
      deleteDir()
    }
  }
}

看起来Jenkinsfile能够调用file1.groovy但总是给我一个错误:

java.lang.NullPointerException: Cannot invoke method firstTest() on null object

共有2个答案

索瀚海
2023-03-14

如果要在Jenkinsfile中从外部文件中获得可用的方法,需要执行以下操作

在文件1中。groovy,返回对方法的引用

def firstTest() {
    // stuff here
}

def testTwo() {
    //more stuff here
}
...

return [
    firstTest: this.&firstTest,
    testTwo: this.&testTwo
]

编辑

评估似乎不需要

def externalMethod = evaluate readFile("file1.groovy")

def externalMethod = evaluate readTrusted("file1.groovy")

如@Olia所述

def externalMethod = load("file1.groovy")

应该有用

以下是关于readTrusted的参考。请注意,不允许任何参数替换(进行轻量级签出)

从轻量级签出:

如果选中,请尝试直接从SCM获取管道脚本内容,而不执行完全签出。这种模式的优点是效率高;但是,您不会得到任何基于SCM的变更日志或轮询。(如果在生成期间使用签出scm,这将填充变更日志并初始化轮询。)在这种模式下,构建参数也不会被替换到SCM配置中。只有选定的SCM插件支持此模式。

至少这对我有用

奚才良
2023-03-14

看起来您在正在加载的脚本中没有返回

return this

请在此处检查:https://jenkins.io/doc/pipeline/steps/workflow-cps/#load-evaluate-a-groovy-source-file-into-the-pipeline-script

因此,被调用的加载文件的结构如下:

def exampleMethod() {
    //do something
}

def otherExampleMethod() {
    //do something else
}
return this

这样你就不应该得到空对象

 类似资料:
  • 问题内容: 我正在尝试将内容从Jenkinsfile中分离出来,以制作一个时髦的脚本。但是它无法调用这些脚本:这是代码: file.groovy 看起来Jenkinsfile能够调用file1.groovy但总是给我一个错误: 问题答案: 如果要从外部文件中获取可用的方法,则需要执行以下操作 在您的中,返回对方法的引用 编辑 似乎不是必需的 要么 正如@Olia所提到的 应该管用 这是有关的参考。

  • 问题内容: 我想使用Groovy插件添加一个Build步骤来读取文件并根据文件内容触发构建失败。 如何在groovy插件中注入工作区文件路径? 问题答案: 根据您的评论,使用 Text-finder 插件会更好。 它允许在文件以及控制台中搜索正则表达式,然后设置构建或找到构建。 对于Groovy,可以使用以下命令来访问环境变量:

  • 我想在詹金斯中强制执行以下场景: 我有工作A和工作B 我想在执行作业B时禁用作业A,在执行作业B后,我想再次启用作业A。 为了启用/禁用作业A,我使用了Groovy插件:Groovy插件 Groovy插件提供了两种可能性:执行Groovy脚本和执行系统Groovy脚本。 在开始执行作业B时,我添加了以下代码片段: 执行工作B后: 当我运行作业B时,它失败了,出现以下异常: 当我运行作业B时,它失败

  • 我知道我可以通过Jenkins RTC插件使用scm轮询,我只是想知道是否有一个如何通过管道插件的groovy脚本做到这一点的例子? 例如: 类似于上面的内容,但不是git,而是将rtc toolkit与prod url一起使用,并指定一个流或一个工作区。。。在任何地方都找不到示例,也不确定如何通过api实现它(或者如果可能的话?)

  • 我想从groovy管道检查是否收集了特定的文件(工件)。 如何访问文物列表? 请注意,我正在寻找一种不意味着修改收集工件的代码的解决方案。这是因为这段代码在多个地方,我只需要在最后做些事情,而不是在任何可能的存档工件调用中(可以隐藏很深)。