workspace - Jenkins 管道 : Re-use workspace when loading an external Jenkins pipeline script

标签 workspace jenkins-workflow jenkins-pipeline

我有以下用例:

  1. 检查/拉取某个 Git 修订版,使用编写的管道脚本
    (我需要这个,因为我动态检索修订版)

  2. 从该修订版中,加载位于先前 check out 文件中的 Jenkins 管道文件

  3. 此文件将依赖于同一 checkout 修订版中的文件
    (因此,来自相同工作区)

问题:加载的 Jenkins 管道文件在 工作区中执行。但它是空的。我需要该文件在相同的旧 工作区中执行。

我想,也许是因为围绕着 node,因为 node 关键字创建了工作区,如文档中所述。但是,当我尝试将它加载到 node外部时,Jenkins 不允许这样做,因为“离开了沙箱”。

注意:jenkins-pipeline-file 被找到并真正被执行。问题是执行过程中。


请看示例代码:

内联管道脚本

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'
}

文件: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
}

最佳答案

一种解决方法是 described here .

  1. 你必须使用 {...}() caller script
  2. 末尾的大括号
  3. 您必须重写调用的脚本以返回闭包(lambda)
    {-> /* former code */ }

这样,您就不会“放弃”对执行脚本的程序流控制。相反,您使用它返回的闭包并“自己调用它”。这会阻止 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') {
    // .....
  }
}

关于workspace - Jenkins 管道 : Re-use workspace when loading an external Jenkins pipeline script,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37209440/

相关文章:

带有转义字符的 Jenkins 管道多行外壳

groovy escape 双引号 $

Jenkins Workflow 构建新工作

Linux截取特定工作区的屏幕截图

java - mdimport 是什么以及在哪里

visual-studio-code - 如何轻松地将 Visual Studio Code 工作区移动到新位置?

groovy - 有哪些技术可以避免使用 Jenkins 工作流 Groovy 脚本进行脚本审批?

jenkins - 如何在完成一组其他作业后触发 Jenkins 作业?

git - Jenkinsfile,获取PR中所有修改过的文件

MATLAB:有关输出参数的脚本与函数