Jenkins流水线:在加载外部Jenkins流水线脚本时重复使用工作区

3
我有以下的使用案例:
  1. 使用编写好的管道脚本检出/拉取特定的Git版本
    (我需要这个,因为我动态地检索版本)

  2. 从该版本中加载一个Jenkins管道文件,该文件位于之前检出的文件中

  3. 该文件将依赖于来自相同检出版本的文件
    (因此,来自同一工作区)

问题:加载的Jenkins管道文件在一个新的工作区中执行。但是它是空的。我需要该文件在同一旧的工作区中执行。
我认为,可能是由于周围的node,因为node关键字会创建工作区,如文档中所述。但是当我尝试在外部加载它时,Jenkins不允许这样做,因为这样会“离开沙盒”。
注意:Jenkins管道文件被找到并真正执行了。问题在执行期间。
请查看示例代码:

内联管道脚本

node('master') {
  def latestBuildableRevision = readFile '/my/LATEST-BUILDABLE-REVISION.txt'

  checkout poll:false,
   scm:[$class:'GitSCM', branches:[[name:latestBuildableRevision]],
   doGenerateSubmoduleConfigurations:false,
   extensions:[[$class: 'CleanBeforeCheckout']], submoduleCfg:[],
    userRemoteConfigs:[[credentialsId:'...', url:'...']]]

  load 'further-script-logic.jenkins'
}

File: further-script-logic.jenkins

node('master') {
   // make use of certain files
   // assumption: pwd() is the *same* workspace which were checked-out before
   // problem: it's not, it's a new empty workspace
}
1个回答

2
一种解决方法在这里描述:点击此处
  1. 您必须在调用脚本的末尾使用{...}()括号
  2. 您必须重写被调用的脚本以返回一个闭包(lambda)
    {-> /* 原来的代码 */ }
这样,您就不会将程序流程的控制权交给执行的脚本。相反,您使用其返回的闭包并“自己调用它”。这可以防止Jenkins创建更多的工作空间。
遗憾的是,我不知道这种解决方案是否允许在调用脚本和/或被调用脚本中声明多个节点。
我已经将这些更改合并到您的示例代码中。
寻找标有"<--- CHANGE"的行。 内联管道脚本
node('master') {
  def latestBuildableRevision = readFile '/my/LATEST-BUILDABLE-REVISION.txt'

  checkout poll:false,
   scm:[$class:'GitSCM', branches:[[name:latestBuildableRevision]],
   doGenerateSubmoduleConfigurations:false,
   extensions:[[$class: 'CleanBeforeCheckout']], submoduleCfg:[],
    userRemoteConfigs:[[credentialsId:'...', url:'...']]]

  load 'further-script-logic.jenkins'
}()   // <--- CHANGE 1

文件:further-script-logic.jenkins
{->   // <--- CHANGE 2
  node('master') {
    // .....
  }
}

太好了!而且,被调用脚本中的多个节点确实起作用! :) - Iviator
1
这个"功能"非常难以发现...我很高兴找到了它,但需要更好地记录下来。如果您问我,每个管道生成多个执行器有点荒谬,几乎是有缺陷的。这需要一个复选框功能"链接脚本执行"或类似的东西。 - niken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接