当前位置: 首页 > 面试题库 >

Jenkins Pipeline:闭包是否不应该在并行内部和外部解析变量?

爱茂勋
2023-03-14
问题内容

我在尝试在Jenkins管道脚本中执行代码时遇到一些令人困惑的行为。闭包内部的值带有一些意外值。我已经看到了对局部变量技巧的引用,该技巧据说可以解决此问题,但是它对我不起作用。

简化示例:创建3个作业’a’,’b’,’c’,以打印其参数-
传入并复制到本地。首先并行执行作业;然后在外部并行执行以比较结果。之所以定义“说”,是因为println在我的Jenkins中提供了访问html" target="_blank">异常(我不是管理员)。

def say(s) {println(s)} // println gives exception inside create_jobs

def create_jobs() {
  def map = [:]                // needed for parallel
  def jobrunfn = { jobid ->    // return a closure that prints hello from job
    def pid = "$jobid"
    return {
      def xsay = { s -> say("[$pid] $s") }
      xsay "HELLO from $pid"
    }
  }

  map['a'] = jobrunfn('a')
  map['b'] = jobrunfn('b')
  map['c'] = jobrunfn('c')
  return map
}

def jobs = create_jobs()
parallel(jobs)              // for Jenkins pipeline only - not groovy interp
for (j in jobs) { jobs[j.key]() }   // groovy interp - parallel not available

输出-在并行中,“ pid”有时为“ c”,应为“ a”或“ b”:

[Pipeline] parallel
[Pipeline] [a] { (Branch: a)
[Pipeline] [b] { (Branch: b)
[Pipeline] [c] { (Branch: c)
[Pipeline] [a] echo
[a] [a] HELLO from c
[Pipeline] [a] }
[Pipeline] [b] echo
[b] [b] HELLO from c
[Pipeline] [b] }
[Pipeline] [c] echo
[c] [c] HELLO from c
[Pipeline] [c] }
[Pipeline] // parallel

[Pipeline] echo
[a] HELLO from a
[Pipeline] echo
[b] HELLO from b
[Pipeline] echo
[c] HELLO from c
[Pipeline] End of Pipeline
Finished: SUCCESS

该参数始终是传入的最后一个值(不知道为什么,但是它是一致的,并且我知道您需要局部变量技巧。)

但是,局部变量技巧在并行内部无法始终如一地工作:即使局部变量有时也为“ c”(对于嵌套的“ say”来说,它正确,但主体错误)。在并行之外,它得到预期的“
a”和“ b”。

我误会了吗

Linux上的Jenkins 2.32.2,管道:Grooby 2.27


问题答案:

这是管道的错误。看票。



 类似资料:
  • 闭包是 JavaScript 一个强大的特性:当函数离开了创建它的位置,仍然可以获取到该位置上存在的所有变量。 本文主要解释闭包的工作方式以及我们为什么要对于变量的无意识共享多加小心。 1、闭包 我们从一个闭包的例子开始吧: function incrementorFactory(start, step) { return function () { // (*) sta

  • 问题内容: 当我基于C ++知识使用Java时,我喜欢使用以下方式初始化变量。 一段时间后,我改变了习惯 我碰到了其他源代码,有些使用1st约定,有些使用2nd约定。 我可以知道大家都推荐哪种惯例,为什么? 问题答案: 我发现第二种样式(一口气声明和初始化)更出色。原因: 一目了然,该变量是如何初始化的。通常,在读取程序并遇到变量时,首先会去声明它(在IDE中通常是自动的)。使用样式2,你会立即看

  • 本地风险值背后的想法是最终的,而领域不是。

  • 问题内容: 我有一个div元素,并且在该div中,我们在p元素之间有文本。 我想添加一个标题。它应该放在p的内部还是外部? 哪个更好: 要么 问题答案: 无法将heading元素放置在HTML标记的元素内,不仅是形式上的,而且因为浏览器在遇到标题时会隐式终止一个打开的元素。所以这个问题是没有意义的:一个在特定上下文中不存在的元素在那个上下文中不能有任何意义(语义)。 您可以使用元素,也可以使用HT

  • 我正在寻找一种方法,在一个微服务中有一个用于公共访问的应用编程接口,另一个用于其他私有服务的内部应用编程接口。 当然,这在不同的URL中是可能的。但看起来好像合并了swagger/open api描述页面。 公共和私有API应该有一个单独的招摇页面。来自互联网的人不能看到内部API描述。只有公共的。 有想法吗?

  • 直到今天,我才知道java有堆,堆是由JVM创建的。此外,这个内存是由操作系统分配给JVM实例的,即堆驻留在JVM实例中。 这表明,JVM和堆相距甚远。 所以,我现在很困惑,有谁能让我知道,我以前是错的还是我不能理解这幅画?