Jenkins Pipelines:加载外部 Jenkins 管道脚本时重用工作区

2024-03-11

我有以下用例:

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

  2. 从该修订版本中,加载位于之前签出的文件中的 Jenkins-pipeline-file

  3. 该文件将依赖于同一签出版本的文件
    (因此,从same工作区)

问题:加载的 Jenkins-pipeline-file 在new工作区。但它是空的。我需要该文件在same old工作区。

我想,也许是因为周围的环境吧node,因为node关键字创建工作区,如文档中所述。但是当我尝试加载它时outside the node,詹金斯以“离开沙箱”为由不允许这样做。

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


请看示例代码:

内嵌管道脚本

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

文件:进一步脚本逻辑.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
}

一种解决方法是此处描述 https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md#triggering-manual-loading.

  1. 你必须使用{...}()末尾的大括号调用者脚本
  2. 你必须重写称为脚本返回一个闭包(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

文件:进一步脚本逻辑.jenkins

{->   // <--- CHANGE 2
  node('master') {
    // .....
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jenkins Pipelines:加载外部 Jenkins 管道脚本时重用工作区 的相关文章

随机推荐

  • Vue.js 如何设置 :id 前缀字符串?

    class tab title v on click tab v for tabTitle index in tabTitleList id index 我在 vue 社区中找到了这个示例 但在我的情况下 我希望我的 id 有一个前缀 而不
  • 如何让 css3 border-image 在 IE9 中工作?

    我正在使用 border image 它适用于除 IE 之外的所有浏览器 对于 IE 版本 7 和 8 我有 css3pie 它可以正常工作 但我一直没能找到任何插件让它在 IE9 中工作 有没有办法可以破解它 使其在 IE9 中也能工作
  • 自定义后退指示图像和 iOS 11

    我在我的应用程序中使用自定义后退按钮 这个自定义后退按钮是全局设置的 如下所示 UINavigationBar appearance backIndicatorImage UIImage named Back withRenderingMo
  • Flutter - 如何更改 AppBar 高度并对齐标题垂直中心?

    我需要更改我的 flutter 应用程序中的应用栏高度 我使用这段代码 Widget build BuildContext context return Scaffold appBar PreferredSize preferredSize
  • 了解 scipy.optimize.basinhopping 的输出

    我正在使用 scipy optimize basinhopping 来最小化函数 这是我得到的 Out 96 nfev 162178 minimization failures 2501 fun 4 4702905615653705 x a
  • 当我尝试通过“http://localhost/xampp/htdocs/index.html”打开 HTML 文件时,它说无法连接到 localhost

    我已经安装了 XAMPP 有一个htdocs文件夹及其内部index html文件 当我尝试通过浏览器打开它时http localhost xampp htdocs index html它说 无法连接到本地主机 怎么了 代替 http lo
  • 将Java游戏转换为Applet;无法加载图片

    所以我用 Java 做了一个相当大的游戏 我打算把它放在我的网站上 所以我把它搞乱了 把它变成了一个小程序 它启动并运行得很好 唯一的问题是它不会加载任何图片 这是我目前正在做的方式 请记住 这是一个 JPanel 扩展类 我在小程序类中创
  • Ruby 中的 class << self 习惯用法

    什么是class lt lt self do in Ruby 首先 class lt lt foo语法打开foo的单例类 eigenclass 这允许您专门化在该特定对象上调用的方法的行为 a foo class lt lt a def i
  • Python Gtk.Entry 占位符文本

    我有一个登录窗口 有两个 gtk Entry 对象 一个用于用户名 一个用于密码 我如何向条目添加一些幽灵文本 因此条目中写有 用户名 但如果您单击内部 文本就会消失 从 Gtk 3 2 开始 可以设置占位符文本 http develope
  • IPython shell 的换行问题

    如果我在 IPython 中运行了很长的一行 并尝试调用它 使用向上箭头 或在当前行的开头处退格 则它显示不正确 全部挤成一行 例如 在下面的会话中我写了很长的一行 1 输入了一个有点空白的行 2 然后向上箭头两次以获得print网上声明
  • 如何隐藏system()输出

    我正在 Windows XP 上工作 我可以通过调用自动执行 ssh 会话的 TCL 脚本 通过浏览器成功运行 system 命令 我还从脚本返回一个值 但是我的问题是脚本将整个 ssh 会话转储到浏览器中 我的 php 脚本如下所示 la
  • 下拉列表问题

    我遇到一个问题 IE 6 7 中的下拉列表的行为如下 可以看到下拉的width宽度不够 无法在不扩展整个下拉列表的情况下显示整个文本 但是在 Firefox 中 没有问题 因为它expands the width因此 这是我们在 IE 6
  • 使用 NetworkStream.BeginRead 和 NetworkStream.EndRead 实现超时

    我编写了以下函数来实现超时功能NetworkStream的异步读取函数 BeginRead and EndRead 在我注释掉该行之前它工作正常Trace WriteLine bytesRead bytesRead Why private
  • Chartjs:如何删除特定标签

    我有一个包含这些数据和选项的条形图 var data labels periodnames datasets yAxisID bar stacked data rcash backgroundColor FFCE56 label yAxis
  • 如何将 JTextPane 中的文本和 JComponent 垂直居中?

    目前看起来是这样 该怎么做才能看起来如此 下面是我的代码 JFrame f new JFrame JTextPane textPane new JTextPane JTextField component new JTextField co
  • 将会话 ID 作为 url 参数传递的危害

    所以我刚刚注意到互联网银行网站之一正在将会话 ID 作为 url 参数传递 见下图 我以前没有在任何地方看到 在 url 中 在本例中它位于 private 之后 1 这个 有什么用 2 为什么互联网银行 需要成为互联网上最安全的地方 将会
  • 如何使用 Watir-WebDriver 将文本发送到 CKEditor WYSIWYG 编辑器框

    我有一个 watir webdriver 脚本 它使用下面的代码设置 CKEditor 框 但这仅适用于 Mac OSX 上的 Firefox 当我专注于屏幕时 例如 如果我集中注意力并让此脚本在后台运行 则不会输入文本 但不会引发异常或错
  • onAnimationEnd() 被调用两次

    从 23 更新构建 sdk 27 后 在调用下面的代码时遇到了 onAnimationEnd 触发两次的问题 onAnimationStart 仅调用一次 并且 onAnimationRepeat 未按预期调用 现在 在应用程序中 当用户按
  • 使用beautifulsoup和python提取标签信息

    假设我有一些像
  • Jenkins Pipelines:加载外部 Jenkins 管道脚本时重用工作区

    我有以下用例 使用编写的管道脚本签出 拉取某个 Git 修订版 我需要这个 因为我动态检索修订版 从该修订版本中 加载位于之前签出的文件中的 Jenkins pipeline file 该文件将依赖于同一签出版本的文件 因此 从same工作