Jenkins 运行任务时遇到 FATAL:Unable to produce a script file 报错(已解决)
关键词:Jenkins、Unable to produce a script file、UnmappableCharacterException、IOException: Failed to create a temp file on
若移动端访问不佳,请使用 –> GithubPage 版
0x00 问题描述
由于使用的 Jenkins 存在安全漏洞(详见 Jenkins Security Advisory 2023-03-08),需要升级到已解决安全漏洞的新版本,更新后运行任务时出现了报错:FATAL: Unable to produce a script file
详细的报错日志如下:
# 拉取代码的 Commit 信息
16:21:35 Commit message: "feat: ????"
# 堆栈信息
16:21:35 FATAL: Unable to produce a script file
16:21:35 java.nio.charset.UnmappableCharacterException: Input length = 1
16:21:35 at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:275)
16:21:35 at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:306)
16:21:35 at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:281)
16:21:35 at java.base/sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
16:21:35 at java.base/java.io.OutputStreamWriter.write(OutputStreamWriter.java:208)
16:21:35 at java.base/java.io.BufferedWriter.flushBuffer(BufferedWriter.java:120)
16:21:35 at java.base/java.io.BufferedWriter.close(BufferedWriter.java:268)
16:21:35 at hudson.FilePath$CreateTextTempFile.invoke(FilePath.java:1658)
16:21:35 at hudson.FilePath$CreateTextTempFile.invoke(FilePath.java:1628)
16:21:35 at hudson.FilePath.act(FilePath.java:1198)
16:21:35 at hudson.FilePath.act(FilePath.java:1181)
16:21:35 at hudson.FilePath.createTextTempFile(FilePath.java:1622)
16:21:35 Caused: java.io.IOException: Failed to create a temp file on /var/jenkins_home/workspace/xxx
16:21:35 at hudson.FilePath.createTextTempFile(FilePath.java:1624)
16:21:35 at hudson.tasks.CommandInterpreter.createScriptFile(CommandInterpreter.java:202)
16:21:35 at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:120)
16:21:35 at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:92)
16:21:35 at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
16:21:35 at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:818)
16:21:35 at hudson.model.Build$BuildExecution.build(Build.java:199)
16:21:35 at hudson.model.Build$BuildExecution.doRun(Build.java:164)
16:21:35 at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:526)
16:21:35 at hudson.model.Run.execute(Run.java:1900)
16:21:35 at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:44)
16:21:35 at hudson.model.ResourceController.execute(ResourceController.java:101)
16:21:35 at hudson.model.Executor.run(Executor.java:442)
16:21:35 Build step 'Execute shell' marked build as failure
0x01 定位原因
根本原因隐藏在日志信息里:
首先,可以看到
Commit message: "feat: ????"
中的中文内容变成了乱码????
。从堆栈信息里
java.nio.charset.UnmappableCharacterException: Input length = 1
可知,这是个和字符集相关的报错信息:
这个错误是由于Java运行时无法将一个输入的字符映射为所需要的字符集(通常是Unicode)而引起的。可能会发生这种情况:
输入的文本包含了一个你使用的字符集无法映射的字符。
如果文本在不同的平台上被创建和传输,则可能会发生此错误,因为每个平台使用的默认字符集可能不同。
为了解决这个错误,你可以尝试以下方法:
- 检查你的字符集: 在你的代码中,确保你所使用的字符集和输入文本的字符集匹配。
- 检查文本: 检查输入文本中是否有在使用字符集时无法映射的字符或符号。
- 指定字符集: 明确指定字符集,尤其是在不同平台之间传输文本时。最好使用标准字符集,例如UTF-8或ISO-8859-1等。
如果以上解决方法都无效,你可能需要查看代码以确定是否有其他问题。
0x02 解决方案
既然是字符集(文件编码)相关的问题,解决方案有 2 个思路:
- 去掉 Jenkins Job 里脚本和指令中的中文等字符
- 让 Jenkins 的运行环境支持 UTF-8 编码,以正常处理和展示中文内容
方案一:移除无法正常处理和显示的中文内容
进入 Jenkins Job 的配置中,定位报错的步骤卡到哪一个环节,查看脚本和指令是否使用了中文内容(注释也算)。
在我的 Job 配置是 Build Steps - 执行 shell
的 shell 脚本中,对指令做了中文注释,移除调中文内容,保存并重新执行一下 Job 的运行任务,发现可以正常完成构建任务了。
方案二:让 Jenkins 支持中文
让 Jenkins 正确处理和展示中文,有 2 个方法,可以根据自身情况进行设置:
- 设置机器的 LANG=”C.UTF-8”
- ENKINS_JAVA_OPTS 或者 JAVA_OPTS 的值增加
-Dfile.encoding=UTF8
的内容
这里推荐修改 LANG 的值来支持中文:
由于我使用 Docker 方式安装的 Jenkins,所以只需要在创建 container 时设置 -e LANG="C.UTF-8"
即可;如何你使用 portainer 或者 Docker Compose,可自行查找设置、修改环境变量的方法。
对于 ENKINS_JAVA_OPTS 或者 JAVA_OPTS 的值增加 -Dfile.encoding=UTF8
的内容:
注意一点,ENKINS_JAVA_OPTS 只影响 Jenkins 程序;JAVA_OPTS 则会影响所有本机器下所有基于 Java 运行的程序。
至于修改方式,参考上面修改 LANG 的过程。
最后,对修改是否生效进行检查:
设置完毕并重启 Jenkins 后,如果你是管理员,进入 Dashboard-系统管理-系统信息-环境变量
查看下当前 Jenkins 的环境变量:
检查 LANG 的值,查看下是否为 C.UTF-8 ;
或者,查看 JENKINS_JAVA_OPTS 或者 JAVA_OPTS 的值里是否有
-Dfile.encoding=UTF8
;最后,运行一下之前 Job 的构建任务,看看能否正常显示中文和正常完成构建。
其他方案
网上也有一些别的方案,如果报错信息中没有 java.nio.charset.UnmappableCharacterException: Input length = 1
的信息,可能就不是编码问题。可以尝试:
- 重启 Jenkins
- 可能磁盘空间不足,可尝试删除
/tmp/
缓存目录下的文件 - 可能目录权限不正确,尝试把 Job 的 workspace 所在目录修改为 jenkins 能够读写的用户权限
0x03 总结
定位问题的过程中,首先检索报错信息中的 Unable to produce a script file,有很多资料都没有说明为什么要使用文章里的解决方案,仅仅是做个记录,没有深入追溯原因,走了不少弯路。
之后,结合 Commit 信息乱码,检索报错信息中的 java.nio.charset.UnmappableCharacterException: Input length = 1,终于找到核心原因:文件编码问题。之后一路查官方文档等,找到了合适的解决方案。
资料:
- Jenkins 的 Docker 安装文档
- Jenkins 安装文档
如果有什么建议或者问题可以随时联系我,共同探讨学习:
- Github: likfe
- CSDN:他叫自己Mr.张
- 掘金:cafeting
- 微博:cafeting
Jenkins 运行任务时遇到 FATAL:Unable to produce a script file 报错(已解决)相关推荐
- 【038】使用git commit命令时遇到 fatal: Unable to create index.lock File exists 错误的解决办法
一.问题描述 使用git commit 命令提交代码,遇到下面的错误: $ git commit -m 'Test' fatal: Unable to create 'D:/MyProject/.gi ...
- jenkins 下Unable to produce a script file错误解决
背景: os是使用服务器上的jenkins 编译的,由于项目比较多,时间久了导致内存不足.导致编译失败. 执行了一次 sudo rm /tmp/* 结果导致所有的项目编译出错 FATAL: Unab ...
- git clone出现fatal: unable to checkout working tree报错的解决办法
[原文链接]git clone出现fatal: unable to checkout working tree报错的解决办法 文章目录 问题:当使用git clone 出现fatal: unable ...
- Github报错fatal unable to access No such file or directory
之前有安装过github旧版,一直正常,后来更新了新版,但是git pull的时候如有如下报错: fatal: unable to access 'https://github.com/eefocus ...
- 12 c for. oracle rac,【案例】Oracle RAC FOR AIX搭建执行root.sh时两次报错的解决办法
天萃荷净 运维DBA反映在aix 5.3 ml6安装10.2.0.1 rac报错0509-036 Cannot load program crsctl.bin because of the follo ...
- Android移动开发-AndroidStudio调试安装时出现“Error running app: Default Activity Not Found”报错的解决方案
如果在AndroidStudio调试安装程序时,如果程序中没有Activity的代码文件的话可能会在程序部署到手机或虚拟机上时碰到"Error running app: Default Ac ...
- linux mysql scripts_linux安装mysql时执行scripts/mysql_install_db报错如何解决?
展开全部 linux安装mysql时执行scripts/mysql_install_db报错这样解决: 1.检查下当前目录是什636f707932313133353236313431303231363 ...
- 安装haxm时遇到的三种报错及解决措施
安装Android Studio时遇到这样的报错,花了一整天才解决掉,基本翻遍了CSDN上的所有相关文章,步骤如下: 检查错误原因参考文章1 这一步需要我们找到haxm的安装日志,路径在c盘里,具体如 ...
- Eclipse新建jsp页面时,第一行会报错的解决方式
Eclipse新建jsp页面时,第一行会报错的解决方式分析: 先介绍下JSP技术的发展:当CGI程序出现一段时间后,CGI程序存在一些缺点:编写困难,对用户请求的响应时间较长,以进程方式运行导致性能受 ...
最新文章
- 听说这是准备下班的时候,测试又提bug过来的表情
- richedit line insertion error什么意思_大连 LINE 是怎样的一个公司?
- iOS 崩溃日志在线符号化实践
- Vs快捷键设置(可搭配Vim使用)
- 汇总:MySQL 8.0 运维便捷命令
- 新手网页设计提高设计水平的法宝,临摹练习!
- C++学习008-delete与delete[]的差别
- WAP1.x协议栈浅析-WSP协议
- js实现分页并请求ajax,js实现ajax分页完整实例
- mysql类exadata功能_EXADATA智能扫描
- Revit二次开发-设置视图范围无限制
- python-比较两份word文档
- React Native微信分享
- kanzi案例Coin
- 微信小程序开发实训记录(一)
- linux安装软件源有问题,opensuse软件安装源问题
- 用google map实现周边搜索功能
- html修改后页面不更新
- 未来应用陈鸿:被微信封掉公众号后怎么办?——给微信创业者的10点真诚建议
- i7处理器好吗_i5和i7区别有多大,性能差距大吗?i5-9400F和i7-9700F的区别对比
热门文章
- 字体样式,文本样式,背景样式,边框样式,线性渐变,伪类选择器,css权重
- 使用ContentProvider读取短信,备份短信
- Mac 电脑需不需要每天关机?
- python生成字符画_python生成动态字符画
- 计算机输入法无法启动,Win7系统开机后输入法总是消失如何解决
- L2-027 名人堂与代金券 (25分)
- linux实验一helloworld,实验一:写一个hello world小程序
- 山泽Typec扩展坞M.2移动固态硬盘盒拓展 - 我的硬件配置
- CO13 订单取消确认报错:“在为订单XXXX 确定实际成本中出错”处理分析
- 362-git的远程仓库操作