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

Jenkins管道:如何从vars dir中的groovy脚本访问自定义全局变量?

孙夕
2023-03-14

我可以将类实例声明为全局实例,如下所示:

gitUtils = new GitUtils()

pipeline {
  ...
  echo "hello: " + gitUtils.doSomething()
}

但是如果管道调用“vars”目录中定义为groovy脚本的函数,gitUtils不再可见

def call() {
  def something = gitUtils.doSomething()
}

我也尝试使用@Field,但它并没有改变什么。请注意,所有管道都是在共享库中定义的(jenkinsfile项目只调用此共享库中的一个函数)。

在本例中,如何从/vars中的groovy脚本访问gitUtils?

我知道我们可以将该实例作为/vars中声明的函数的参数传递,但使用实用类的函数越多,它就越难看。您是否可以将“echo”或“sh”函数作为参数传递?不,这里是一样的。

我知道我们不能在src中定义的所有类中使用,并使用多个公共方法定义groovy脚本。在这里,我们可以想象 /vars创建一个具有许多公共方法的gitutils.groovy。但这将意味着在管道中使用“脚本”闭包来选择我们想要的方法,如下所示:

script {
  gitutils.doSomething()
}

我不要这个。我建议在/vars中为每个groovy脚本创建一个函数。因此,我们可以按步骤直接调用它们,如下所示:

 steps {
    myGroovyScriptFunction()
 }

但通过这样做,功能数量增加,功能组织不正确。这就是为什么我们的想法是在/vars中创建“大步函数”,它在更通用的函数中使用,从类的实例(更好的情况下甚至是静态的)开始。因此,我想要一个全局实例,而不是在每个groovy脚本中创建一个新实例。

上下文:声明性管道、openshift jenkins、带动态pod模板的从属

共有1个答案

胡景澄
2023-03-14

这是不可能的,因为JENKINS-42360。

在我看来,在没有脚本块的情况下使用全局步骤的最佳方法是定义GitUtils的实例,并直接在全局步骤中使用它。如果需要管道步骤上下文,可以将其传递给构造函数:

# vars/myStep.groovy

import my.packagename.GitUtils

def call() {
    GitUtils gitUtils = new GitUtils(steps) 
    ...
} 

然后您可以使用insideGitUtils中的步骤,如下所述。请记住根据文档定义GitUtils以实现可序列化。

 类似资料:
  • 我们有一个Jenkins构建,它在Jenkins1.596.2上成功运行,我们正在迁移到运行Jenkins2.60.1的新构建机器 作为构建配置的一部分,我们有一个可扩展的Choice参数,并使用系统Groovy Choice参数作为选择提供者。然后,我们使用Groovy脚本获取选择列表。 此Groovy脚本需要访问Jenkins构建环境变量之一,该变量设置在构建配置的全局属性部分(在环境变量下)

  • 问题内容: 使用Jenkins 2.x中 的Pipeline插件,如何从一个步骤中访问在阶段或节点级别某个位置定义的Groovy变量? 简单的例子: 在Jenkins输出页面上给出以下内容: 可以看到,在该步骤中将打印一个空字符串。 解决方法是通过以下方式在环境范围内定义变量 并通过打印 但是,这种滥用会破坏此任务的环境范围。 问题答案: 要使用可模板化的字符串(将变量替换为字符串),请使用双引号

  • 我正在构建一个jenkins管道,作业可以由远程触发。我需要知道哪个IP触发了作业。所以我有一个小Groovy脚本,它返回远程IP。使用EnvInject-plugin,我可以轻松地在正常的自由式作业中使用这个变量,但是我如何在管道中使用它?我不能将EnvInject-plugin与管道插件一起使用:( 这是获取IP的小脚本:

  • 我必须从我的 Groovy 脚本访问一个环境变量。我没有使用詹金斯。如何获取变量?

  • 我想在groovy脚本中定义一个类,我可以通过SoapUI中的其他groovy脚本重用该类。 我一直试图在TestSuite属性中定义我的类,但没有成功。我希望避免在JAR中定义类,因为我们在团队中工作,每个人都必须在他们的SoapUI中导入JAR才能运行我的测试。我使用SoapUI 3.6.1 以下是我的TestSuite的制作方式: 为了简化me测试,我在“Test1”中定义了一个类,我想在“

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