前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >三种方法解决 Jenkins 声明式流水线 Exception: Method code too large !

三种方法解决 Jenkins 声明式流水线 Exception: Method code too large !

作者头像
Peter Shen
发布于 2020-06-12 07:44:14
发布于 2020-06-12 07:44:14
4.5K00
代码可运行
举报
文章被收录于专栏:持续集成持续集成
运行总次数:0
代码可运行

这是我第二次在使用 Jenkins 声明式流水线的时候遇到了这个问题,第一次遇到这个问题的时候是在一个 Pipeline 里大概写到 600 多行时候遇到如下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during class generation: Method code too large!

java.lang.RuntimeException: Method code too large!
    at groovyjarjarasm.asm.MethodWriter.a(Unknown Source)
    [...]

当时我也使用了 Jenkins Shared Libraries,但那时候的代码组织的并不是很好,有不少步骤还没来得及单独抽离出来作为单独的方法。为了解决这个问题,经过一番重构,我将原来的 600 多行的 Pipeline 变成了现在的 300 多行,很不巧,随着继续添加功能,最近又遇到了这个问题。

出现这个问题的原因是 Jenkins 将整个声明性管道放入单个方法中,并且在一定大小下,JVM 因 java.lang .RuntimeException 失败:方法代码太大!看来我还是有什么方法超过了 64k。

Jenkins JIRA 上已经有了该问题的单子,但目前为止还是尚未解决。针对这个问题目前有三种方案,但他们都有各自的利弊。

1.将步骤放到管道外的方法中

自2017年中以来,你可以在管道的末尾声明一个方法,然后在声明性管道中调用它即可。这样,我们可以达到与共享库相同的效果,但是避免了维护开销。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pipeline {
    agent any
    stages {
        stage('Test') {
            steps {
                whateverFunction()
            }
        }
    }
}

void whateverFunction() {
    sh 'ls /'
}

优点

缺点

没有额外的维护费用

这个解决方案不知道会不会一直有效

所有的功能都反映在Jenkinsfile中

有的方法在多个Jenkinsfile里用到时,这种方法还是会写很多重复的代码

2.从声明式迁移到脚本式管道

最后,我们可以迁移到脚本化的管道。有了它,我们就有了所有的自由。但是也就会失去我们最初决定使用声明式管道的原因。

优点

缺点

完全没有限制

需要比较大的重构

更容易出错

可能需要更多的代码来实现相同的功能

3.使用Shared Libraries

我当前使用的就是 Jenkins Shared Libraries,有一个共享库来执行一些复杂的步骤。共享库目前看来使用的非常广泛,尤其是在维护一些比较大型的、复杂的项目里用的很多。

最终我的解决办法是进一步缩减 Pipeline 里的代码,这里我也用到 方法1 的解决方案,将一些步骤提到 Pipeline {} 括号的外面,尤其是那些重复调用的步骤。

优点

缺点

减少了大量重复的代码

任何一个修改都会影响到所有的引用,要测试好了再将变更放到引用分支里

可以分块使用

不熟悉的话很难理解一个步骤到底是做什么的

生成的Jenkinsfile将易于阅读

结论

方法1:对于单一的 Repository 的集成,可以快速实现,大多数人上手会很快。

方法2:脚本化提供了很少的限制,适合熟悉 Java,Groovy 的高级用户和有更复杂需求的人使用。

方法3:对于企业级项目,拥有很多 Repositories,需要进行大量集成,并且想了解共享库,推荐使用此方法。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps攻城狮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Jenkins Pipeline流水线详解,建议收藏!
Jenkins 流水线(Pipeline)是一种持续集成和交付(CI/CD)工具,它以代码的方式定义整个软件开发过程中的构建、测试和部署流程。与传统的 Jenkins 项目和自由风格项目相比,Jenkins 流水线具有以下显著特点和优势:
测试开发技术
2025/06/08
420
Jenkins Pipeline流水线详解,建议收藏!
『Jenkins』深入理解Jenkins流水线:从基础到高级使用
在现代软件开发中,持续集成(CI)和持续交付(CD)是提高开发效率和软件质量的核心实践。Jenkins作为全球最受欢迎的开源自动化工具,广泛用于实现CI/CD工作流。而Jenkins流水线(Jenkins Pipeline)是实现持续集成和持续交付的核心功能之一。
数字扫地僧
2024/12/23
3570
Jenkins常见问题集锦(三)
问题12:有没有方便的方法看Jenkins上当前安装的插件列表和版本?插件管理-已安装里可以看到,但是复制下来有多余的信息,不好处理。比如多了插件简介,复制到表格里还要手动一个个删除。
DevOps持续交付
2019/08/06
1K0
Jenkins2 学习系列12 -- 创建和使用共享库
当有大量的pipeline项目构建任务,有很多代码是重复的,这时需要提取和复用共同的逻辑。 其实pipeline本质就是一个Groovy脚本,所以可以在pipeline中自定义函数,并使用Groovy语言自带的特性。 比如下面的Jenkinsfile,我们自定义了一个 createVersion 函数,并使用了内置的Date类。
mafeifan
2019/07/22
3K0
Jenkins2 学习系列12 -- 创建和使用共享库
Jenkins流水线即代码之扩展共享库
Jenkin的多分支流水线,允许Jenkinsfile与需要 Jenkins 构建的应用程序代码放在一起,然后 Jenkins 从源代码管理系统中检出 Jenkinsfile 文件作为流水线项目构建过程的一部分并接着执行你的流水线。
追马
2020/07/15
1.9K0
Jenkins流水线即代码之扩展共享库
MPL - 模块化的流水线库
尽管通过自动化部署加快了开发速度,但由于在 DevOps 方面缺少协作,我们一个客户正因此而放慢产品的上市时间。虽然他们也投入了资源来做 DevOps ,但每条生产流水线都是独立设置的,迫使团队为每个项目重新造轮子。更糟糕的是,由于没有跨团队协作,平台中的任何错误又会出现在每条新的流水线中。许多客户都有类似的问题存在,因此我们决定开发一个既能帮助现有客户,又能适应未来使用需求的通用工具。使用通用框架且标准化的 CI/CD 平台是最显而易见的选择,但这将导致缺少灵活性的单体结构(monolithic structure),最终会变得举步维艰。每个团队都需要在自己的流水线上工作,基于此,我们开发了一个方便 DevOps 流水线的每个可重用部分可供以后使用的解决方案 — Jenkins 驱动的模块化流水线库。
LinuxSuRen
2019/04/19
2.3K0
MPL - 模块化的流水线库
史诗级整理 Jenkins 流水线详解
jenkins 有 2 种流水线分为声明式流水线与脚本化流水线,脚本化流水线是 jenkins 旧版本使用的流水线脚本,新版本 Jenkins 推荐使用声明式流水线。文档只介绍声明流水线。
我的小碗汤
2023/03/19
8.1K0
史诗级整理 Jenkins 流水线详解
2.Jenkins进阶之流水线pipeline语法入门学习
Q: 什么是 Groovy 语言 答: Groovy 是 Apache 旗下的一门基于 JVM 平台的动态/敏捷编程语言,在语言的设计上它吸纳了 Python、Ruby 和 Smalltalk 语言的优秀特性,语法非常简练和优美,开发效率也非常高(编程语言的开发效率和性能是相互矛盾的,越高级的编程语言性能越差,因为意味着更多底层的封装,不过开发效率会更高,需结合使用场景做取舍)
全栈工程师修炼指南
2022/09/29
18.1K0
2.Jenkins进阶之流水线pipeline语法入门学习
使用 YAML 文件配置 Jenkins 流水线
几年前,我们的 CTO 写了一篇关于使用 Jenkins 和 Docker 为 Ruby On Rails 应用提供持续集成服务的文章。这些年,我们一直使用这个 CI 流水线解决方案,直到我们最近决定做一次升级。为什么呢?
LinuxSuRen
2019/04/19
5.1K0
使用 YAML 文件配置 Jenkins 流水线
Jenkins 共享库使用示例
如果你经常使用 Jenkins Pipeline 一定会遇到多个不同流水线中有大量重复代码的情况,很多时候为了方便我们都是直接复制粘贴到不同的管道中去的,但是长期下去这些代码的维护就会越来越麻烦。为了解决这个问题,Jenkins 中提供了共享库的概念来解决重复代码的问题,我们只需要将公共部分提取出来,然后就可以在所有的 Pipeline 中引用这些共享库下面的代码了。
我是阳明
2020/06/15
4.2K0
企业DevOps之路:Jenkins 流水线
Pipeline 即流水线,是 jenkins2.X 的新特性,是 jenkins 官方推荐使用的持续集成方案。与传统的自由风格项目不同,它是通过 jenkins DSL 编写代码来实现。相比于之前用户只能通过 Web 界面进行配置的方式来定义 Jenkins 任务,现在通过使用 jenkins DSL 和 Groovy 语言编写程序,用户可以定义流水线并执行各种任务。
BUG弄潮儿
2022/04/15
6550
企业DevOps之路:Jenkins 流水线
Jenkins 自由风格项目Freestyle project和流水线pipeline解释
本篇主要分享对于Jenkins中Freestyle Project项目和pipeline项目的一些知识分享。如果我们的Jenkins中安装了中文插件,那么它们可能会被翻译为:
zinyan.com
2023/02/24
3.9K0
Jenkins 自由风格项目Freestyle project和流水线pipeline解释
介绍 Jenkins 模板引擎
在企业范围内实施 DevSecOps 实践具有挑战性。由于组织内的不同应用程序正在使用多种编程语言、自动化测试框架和安全遵从性安全合规工具,因此每个团队构建和维护流水线变得很难。
LinuxSuRen
2019/07/10
2.8K0
3种创建Jenkins流水线的方法 - Classic UI, BlueOcean, Git
Jenkins是一个DevOps工具,可以用来自动构建、测试和交付软件代码。如果你是Jenkins的新手,本教程将帮助你理解如何使用以下方法之一创建Jenkins流水线(Pipeline):
用户1516716
2021/04/13
4.1K0
3种创建Jenkins流水线的方法 - Classic UI, BlueOcean, Git
Jenkins_流水线语法_002
parameters 指令提供了一个用户在触发流水线时应该提供的参数列表。这些用户指定参数的值可通过 params 对象提供给流水线步骤, 了解更多请参考示例。
Cyylog
2020/08/19
1.9K0
Jenkins流水线
之前采用Jenkins的自由风格构建的项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的时间,并且问题不方便定位问题。
程序猿川子
2022/08/24
7290
如何使用 Jenkins 的脚本化流水线(Pipeline)
在这篇简单的教程中,你将会学习到 Jenkins 的流水线即代码,以及如何开发流水线脚本的指导。 Jenkins 是一个开源持续集成服务器,它可以提供持续执行自动化构建和测试的能力。Jenkins 可以控制和监控多种任务,包括:拉取代码、静态代码分析、构建工程、执行单元测试、自动化或者性能测试,最后部署应用。这些任务通常是一个持续部署流水线。 流水线(Pipeline)是 Jenkins 的一套插件。流水线可以认为是执行任务的一系列阶段,它可以持续地发布你的应用。“持续”的概念是相对于你的应用环境来说的
DevOps时代
2018/04/17
8.9K0
如何使用 Jenkins 的脚本化流水线(Pipeline)
Jenkins_流水线语法_001
本节是建立在 流水线入门内容的基础上,而且,应当被当作一个参考。 对于在实际示例中如何使用流水线语法的更多信息, 请参阅本章在流水线插件的2.5版本中的 使用 Jenkinsfile部分, 流水线支持两种离散的语法,具体如下对于每种的优缺点, 参见语法比较。
Cyylog
2020/08/19
1.5K0
每个 Jenkins 用户都应该知道这三个最佳实践
在使用 Jenkins 实施了企业级的 CI/CD 工作,有如下三个最重要的实践和总结。
Peter Shen
2020/07/10
2K0
每个 Jenkins 用户都应该知道这三个最佳实践
Jenkins 声明式流水线的语法错误检查
在做 Jenkins 声明式流水线开发时常会遇到的问题是:Pipeline 看起来没有问题,当提交到代码仓库后进行 Jenkins 构建时发现原来有语法错误,然后再去修改、提交、构建,结果可能还有有其他没有注意到的语法问题。
Peter Shen
2020/06/12
3K0
Jenkins 声明式流水线的语法错误检查
推荐阅读
相关推荐
Jenkins Pipeline流水线详解,建议收藏!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验