我可以将类实例声明为全局实例,如下所示:
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模板的从属
这是不可能的,因为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管道检查是否收集了特定的文件(工件)。 如何访问文物列表? 请注意,我正在寻找一种不意味着修改收集工件的代码的解决方案。这是因为这段代码在多个地方,我只需要在最后做些事情,而不是在任何可能的存档工件调用中(可以隐藏很深)。