如何使用 Pipeline 引用 Jenkinsfile 目录?

2024-03-27

我有一个 groovy 文件,我想从 Jenkinsfile 运行。

ie. load script.groovy

但是,如果该文件与 Jenkinsfile 存储在同一目录中,我不确定如何引用该文件。我正在从 git 加载 Jenkinsfile。我注意到它创建了一个名为的文件夹workspace@script。它不会将其放置在工作区目录中。我可以对文件夹进行硬编码,但我不确定这方面的规则,并且再次检查代码似乎有点多余。

java.io.FileNotFoundException: /opt/jenkins_home/jobs/my_job/workspace/script.groovy (No such file or directory)

默认情况下,它从工作区加载,而不是workspace@script

我正在尝试将 BuildFlow 脚本转换为管道(工作流)脚本。但我发现,这并不像复制粘贴那么容易。

詹金斯文件

node {

//get parameters from Job
def builds = builds.tokenize(",")
def ip_address_node = ip_address_node.trim()
def port_node = port_node.trim()
def branch = branch.trim()
def workspace = pwd()

stage 'Checking out code from esb repository'
git branch: branch, url: 'ssh://git@giturl/integration_bus.git'

load '../workspace@script/esb_deploybar_pipeline/deploy_esb.groovy'

}

deploy_esb.groovy(这是来自旧的构建流程,尝试在管道中运行)

import groovy.transform.ToString
import groovy.transform.EqualsAndHashCode
@EqualsAndHashCode
@ToString
class BarDeploy {
    String barFile
    String app
    String integrationServer
}


//parse csv
def csvItemsApps = new HashSet<BarDeploy>();
def csvItemsLibs = new HashSet<BarDeploy>();
def deploymentMapFile = new File(workspace + "/ESB_Deployment_Map.csv")
def isFirstLine = true

stage 'Parsing ESB Deployment CSV'
deploymentMapFile.withReader { reader ->
    while(line = reader.readLine()) {
        if(isFirstLine)
        {
          isFirstLine = false
          continue
        }

        csvLine = line.split(",")
        app = csvLine[0]
        intServer = csvLine[1]

        def barDeploy = new BarDeploy()
        barDeploy.app = app
        barDeploy.integrationServer = intServer
        csvItemsApps.add(barDeploy)


        //get shared libs
        if(csvLine.length > 2 && csvLine[2] != null)
        {
            def sharedLibs = csvLine[2].split(";")
            sharedLibs.each { libString ->
                if(!libString.isAllWhitespace())
                {
                    def lib = new BarDeploy()
                    lib.app = libString
                    lib.integrationServer = intServer
                    csvItemsLibs.add(lib)
                }
            };
        }
    }
};

//get list of bar files to deploy from html and consolidate bar files to deploy with apps in csv 
for (int i = 0; i < builds.size(); i+=3)
{
    if(builds[i].equals("false"))
    {
        //Don't deploy bar if checkbox isn't selected
        continue
    }

    foundInCSV = false

    appToDeploy = builds[i + 1]
    barFileToDeploy = builds[i + 2]

    iterator = csvItemsApps.iterator()
    while (iterator.hasNext())
    {
        barDeploy = iterator.next()
        if(appToDeploy.equalsIgnoreCase(barDeploy.app))
        {
            barDeploy.barFile = barFileToDeploy
            foundInCSV = true
        }
    }

    iterator = csvItemsLibs.iterator()
    while (iterator.hasNext())
    {
        barDeploy = iterator.next()
        if(appToDeploy.equalsIgnoreCase(barDeploy.app))
        {
            barDeploy.barFile = barFileToDeploy
            foundInCSV = true
        }
    }

    if(foundInCSV == false)
    {
        throw new RuntimeException("App: " + appToDeploy + " not found in ESB_Deployment_Map.csv. Please add CSV Entry.")
    }
}


//Do deploy, deploy shared libs first
deployCSVItemsInParallel(ip_address_node,port_node,branch,env_key,csvItemsLibs)
deployCSVItemsInParallel(ip_address_node,port_node,branch,env_key,csvItemsApps)


def deploy(ip_address_node,port_node,branch,deployItem,env_key)
{
    def integrationServer = deployItem.integrationServer
    def app = deployItem.app
    def barFile = deployItem.barFile

    if(barFile == null)
    {
        return;
    }

    println("Triggering Build -> ESB App = " + app +  ", Branch = " 
            + branch + ", Barfile: " + barFile + ", Integration Server = " + integrationServer + ", IP Address: " + ip_address_node 
            + ", Port: " + port_node + ", Env_Key: " + env_key)

    build_closure = { ->
        build("esb_deploybar", 
                      ip_address_node: ip_address_node, port_node: port_node,
                      integrationServer: integrationServer, branch: branch, app: app, barFile: barFile, env_key: env_key)
    }

    return build_closure
}

def deployCSVItemsInParallel(ip_address_node,port_node,branch,env_key,csvItems)
{
    def build_closures = []
    iterator = csvItems.iterator()
    while (iterator.hasNext())
    {
      barDeploy = iterator.next()
      def build_closure = deploy(ip_address_node,port_node,branch,barDeploy,env_key)

      if(build_closure != null)
      {
          build_closures.add(build_closure)
      }
    }

    if(build_closures?.size() > 0)
    {
         parallel(build_closures)
    }
}

有一种情况我还没有看到有人提到过。当作业应该在 Jenkins 上运行时,这是如何加载 Groovy 脚本的代理/从属,而不是在master.

由于master是从SCM检查Jenkins pipeline项目的人,Groovy 脚本只能在 master 的文件系统中找到。所以虽然这会起作用:

node {       
    def workspace = pwd() 
    def Bar = load "${workspace}@script/Bar.groovy"
    Bar.doSomething()
}

这只是一个令人高兴的巧合,因为从 SCM 克隆管道的节点与尝试在其中加载 groovy 脚本的节点是同一节点。但是,只需添加要执行的不同代理的名称:

node("agent1"){
    def workspace = pwd() 
    def Bar = load "${workspace}@script/Bar.groovy"
    Bar.doSomething()
}

将会失败,导致:

java.io.IOException: java.io.FileNotFoundException: /Jenkins/workspace/Foo_Job@script/Bar.groovy (No such file or directory)

这是因为这条路径:

/Jenkins/workspace/Foo_Job@script/

仅存在于主詹金斯盒子上。不在盒子里运行agent1.

因此,如果您遇到此问题,请确保将 groovy 脚本从 master 加载到全局声明的变量中,以便代理可以使用它们:

def Bar
node {       
    def workspace = pwd() 
    if(isUnix()){
        Bar = load "${workspace}@script/Bar.groovy"
    }
    else{
        Bar = load("..\\workspace@script\\Bar.groovy")
    }
}
node("agent1"){
    Bar.doSomething()
}

Note: The variable用于在节点之间传递模块必须声明outside the node blocks.

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

如何使用 Pipeline 引用 Jenkinsfile 目录? 的相关文章

随机推荐

  • 从重叠的日期范围中获取不同的连续日期范围

    我需要从重叠日期列表中获取彼此不重叠的日期范围列表 并获取重叠期间的硬币总和 我尝试过用谷歌搜索一个例子 但到目前为止还没有运气 我可能没有使用正确的关键词 我有一个重叠日期的列表 1 1 2018 31 1 2018 80 7 1 201
  • 有没有一种方法可以使用 JavaScript 在网页中漂亮地打印 JSON?

    在我看来 漂亮打印 JSON 是一个足够简单的任务 JavaScript 应该能够处理它 有没有人编写过 或运行过 JavaScript 函数来执行此操作 执行此操作的一个简单方法是执行 JSON stringify data null w
  • 导入 go 包时出现问题

    这是我的代码结构 addition summing sum prg go addition go go mod go mod 的内容 module addition go 1 14 sum prg go 的内容 package summin
  • 如何在 Haskell 中查找运行时的核心数量

    Haskell 是否有一种方法可以确定运行时机器上存在的 CPU 核心数量 是的 有这样的方法 来自 现实世界 Haskell 的代码 http book realworldhaskell org read concurrent and m
  • 如何在eclipse中导入Jdeveloper java项目?

    我在 Jdeveloper 中有一个 java 项目 但我想将该项目迁移到 eclipse java 项目 你知道该怎么做吗 或者我必须手动导入它吗 提前致谢 通常 如果项目是基于 Web 的项目或 java 项目 则它有其结构 您应该能够
  • 无法在 VS2015 Enterprise 中使用 Microsoft Fakes - 缺少 COR_PROFILER

    我正在尝试在 VS 2015 Enterprise 中使用 Microsoft Fakes 我什至无法运行任何测试 我没有 testsettings 或 runsettings 文件 简单的测试项目参考 Microsoft QualityT
  • 与 Objective C 相比,Swift SHA256 加密返回不同的加密字符串

    我正在将一些代码从 Objective C 迁移到 Swift 我想在 swift 中使用 SHA 256 算法用密钥加密字符串 但与 Objective C 实现的 swift 代码相比 返回不同的加密字符串 两个代码看起来相同 只是语法
  • 自定义文件格式和编解码器?

    我已经被编解码器问题弄乱了好几天了 但仍然看不到全局 这是我第一次处理音频 视频格式和编解码器 所以我真的需要一些帮助 这是工作 我正在编写几个负责编码和解码自定义 mpeg 文件的组件 在标准解 压缩过程 对于音频和视频 之上 我将实现一
  • 使用假会话测试控制器

    我想为我的控制器编写测试 Result changeAction callAction controllers routes ref Users changePassword assertThat status changeAction i
  • 将 Xtext 与 StringTemplate 代码生成器链接

    在我当前的项目中 我试图链接用 xtext 编写的 DSL 规范和用 StringTemplate 编写的代码生成器 例如 我的 DSL 规范的语法如下 我通过 xText 提供的优秀编辑器工具输入此信息 structs TempStruc
  • 如何在WinRT下并行线程中执行C++函数?

    我有一个 C 代码 它使用 beginthreadex Windows 方法在线程中执行函数 现在我想将其移植到 WinRT 组件以将其包含在 Windows Phone 应用程序中 但Windows Phone不支持 beginthrea
  • 如何在 Excel VBA 中对字符串进行 URL 编码?

    是否有内置方法可以在 Excel VBA 中对字符串进行 URL 编码 或者我是否需要手动执行此功能 不 没有任何内置内容 直到 Excel 2013 看到这个答案 https stackoverflow com a 24301379 18
  • Java COM 桥

    我有一个超低延迟程序 需要与 Windows COM 组件交互 最快的方法是什么 使用像 JACOB 这样的 COM 桥或编写本机 COM 库并使用像 ZeroMQ 这样的消息总线发送消息 如果您使用 ZeroMQ 您将处理两个进程 将消息
  • 使用 Guid 和自定义表名称以及 Asp.net Identity 1.1 Alpha 创建自定义实现

    我从不同的问题中得出结论 在我提出问题时在下面列出 我想做五件事 据我从这些问题和答案中可以看出 所有这些都可以在我的 OnModelCreating 方法中完成 Preface 我正在使用 Asp Net Identity 1 1 alp
  • 叉子和线程有什么区别?

    谁能解释一下叉子和线程之间的区别 分叉给你一个全新的进程 它是当前进程的副本 具有相同的代码段 当内存映像发生变化时 通常这是由于两个进程的不同行为 您会分离内存映像 写入时复制 但可执行代码保持不变 任务不会共享内存 除非它们使用某些内存
  • 配置 Xcode 4 工作区以在需要时构建依赖项的正确方法是什么?

    我的情况很简单 一个工作区有两个兄弟项目 一个主 iOS 应用程序和一个构建该应用程序使用的多个静态库目标的项目 以下是我配置构建的方式 将主应用程序的构建设置中的 用户标题搜索路径 指向库项目位置 通过源树 在我的应用程序的主要目标的编辑
  • 如何将json数组插入mysql数据库

    您好 我正在尝试将 json 数组插入到我的 MySQL 数据库中 我正在从我的 iPhone 传递数据 我已将数据转换为 json 格式 并且使用未插入到我的服务器中的 url 将数据传递到我的服务器 这是我的 json 数据 姓名 0
  • SKshapenode 没有响应Physicsbody

    我创建了一个SKShapeNode我已经分配了一个physicsBody到它 然而 当有接触时它不会被触发 的制作SKShapeNode code SKShapeNode gravityline SKSpriteNode lolo SKSp
  • 堆积条形图上的R ggplot标签[重复]

    这个问题在这里已经有答案了 我需要将数据放入堆栈条形图中 但是当我添加计数标签时 一些标签位于类别上方 一些标签位于类别下方 我尝试修改 geom text 函数的位置参数但无济于事 下面是一个可重现的示例 显示了该类别上方 下方 类别座位
  • 如何使用 Pipeline 引用 Jenkinsfile 目录?

    我有一个 groovy 文件 我想从 Jenkinsfile 运行 ie load script groovy 但是 如果该文件与 Jenkinsfile 存储在同一目录中 我不确定如何引用该文件 我正在从 git 加载 Jenkinsfi