jenkins发布应用时,对linux动态库的加载,有别于直接使用ssh连接到服务端的发布方式。原因还不是很明确,jenkins也是通过SSH的方式,使用与直接使用ssh登录服务发布应用时,使用同样的用户名,因此不可能是权限上的问题。我的猜想可能jenkins通过SSH链接的方式,可能直接跳过了某些bash相关初始化,因为从事后反证加载默认的动态库没有问题,只是在加载附加目录下的动态库时才出现无法正确加载动态库,有待进一步验证,但直接使用ssh连接并发布应用,可以正常加载附加目录下的动态库。
解决办法:把放在特殊位置的动态库拷贝到上述默认目录比如/lib(64)/下即可。
问题延伸:其实问题的解决是很容易的,但发现问题的过程有必要重提一下,因为本人的应用是一个java application(不需要中间件服务器如tomcat),使用jenkins发布并运行application,与直接发布效果一样,没有任何异常信息。但其中有一个功能点在jenkins下失效了,此功能点是java调用外部程序OpenOffice Server。
未发现问题时的源码片段:
pro = Runtime.getRuntime().exec(command.toString());
buffer = new BufferedReader(new InputStreamReader(pro.getInputStream()));
while(buffer.readLine()!=null);
int rtstate = pro.waitFor();
return rtstate;
发现返回的rtstate是127,一头雾水了,一开始以为只要rtstate>=0都是正确的状态,但正确是只有rtstate为0是,才算正常调用并执行了外部程序。那127只是个错误代号,如何查看其详细报错信息呢?看以下源码片段:
pro = Runtime.getRuntime().exec(command.toString());
buffer = new BufferedReader(new InputStreamReader(pro.getInputStream()));
while(buffer.readLine()!=null);
int rtstate = pro.waitFor();
if(rtstate!=0){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i=-1;
while((i=pro.getErrorStream().read())!=-1){
baos.write(i);
}
/** 粗糙的把出错打出来,有空进一步自定义Exception **/
System.out.println(baos.toString());
baos.close();
}
return rtstate;
加上这一段专门捕获错误信息后,很清楚的把错误输出到控制台:找不到xxx.so!,回到本文的开头,第一次看到这个错误信息真是意想不到,jenkins的发布还能引起这样的问题。
分享到:
相关推荐
1. **系统要求**:Jenkins 可运行于多种操作系统,包括 Windows、Linux 和 MacOS 等。确保你的系统满足最低硬件和软件需求。 2. **安装**:通过官方网站下载对应操作系统的安装包,按照指示进行安装。对于 Linux ...
- **动态加载库(Dynamically Loading Libraries)。** 允许在运行时加载额外的库,为Pipeline提供更多的功能。 - **库版本和检索方法。** 定义如何管理和检索共享库的版本。 - **编写库。** 创建自定义的Pipeline...
- 添加动态参数,例如从 Git 获取分支列表。 ```groovy def getTags = "git ls-remote -h git@gitlab.ihaozhuo.com:Java_Service/YJK-Java.git".execute() getTags.text.readLines().collect{ it.split()[1]....
通过对`node-jenkins-api`库的研究,我们可以发现它不仅提供了与Jenkins API交互的功能,还通过一系列标准化的配置文件确保了项目的可维护性和可扩展性。这些配置文件不仅有助于提高开发效率,还能保证代码质量和...
7. **嵌入式Linux发行版**:如 BusyBox 和 Buildroot 是流行的工具,用于构建最小化的嵌入式Linux系统,包含基础的命令行工具和必要的库。 8. **电源管理**:在嵌入式设备中,电源管理是关键,包括动态电压频率调整...
阿里云Linux一键安装Web环境是针对想要快速在Linux服务器上部署Web服务的用户设计的工具。这个资源可能包含了一系列自动化脚本,旨在简化在Linux系统(可能是基于Debian或CentOS的发行版)上安装Apache、Nginx、PHP...
《ClearCase for Linux安装攻略详解》 在Linux环境中部署IBM Rational ClearCase,一款强大的版本控制系统,对于软件开发团队而言至关重要。本文将详细阐述ClearCase在Linux系统中的安装过程,帮助你顺利搭建起协同...
3. **强大的仪表板构建器**:用户可以自定义面板,通过拖放操作添加图表,调整大小,设置时间范围,以及使用模板变量实现动态筛选。 4. **实时更新与警报**:Grafana可以实时刷新数据,当指标达到预设阈值时,可以...
在Linux环境下进行C和C++编程是许多软件开发者的基础技能,因为Linux系统提供了丰富的开源工具、库和开发环境。本文将深入探讨Linux下C和C++编程的关键知识点,包括环境搭建、编译链接、调试技巧以及相关的编程实践...
10. **单元测试和持续集成**: 了解如何在Linux环境中设置和运行单元测试,以及配置持续集成(CI)工具,如Jenkins或Travis CI,可以确保代码的质量和稳定性。 在实际应用中,你可能还需要掌握Git版本控制,使用如VS...
1. **用户界面**:JavaScript能够创建响应式和动态的用户界面,允许用户轻松地浏览、搜索、添加和删除电子书。利用AJAX(Asynchronous JavaScript and XML)技术,可以实现实时更新,无需刷新页面。 2. **文件处理*...
`add_executable`用于创建可执行程序,而`add_library`则用于创建静态或动态库。同时,`include_directories`帮助你指定头文件的搜索路径,`target_include_directories`则为特定目标指定头文件路径。 CMake中的...
Apache JMeter (apache-jmeter-5.4.3.zip)可用于测试静态和动态资源、Web 动态应用程序的性能。 它可用于模拟服务器、服务器组、网络或对象...通过适用于 Maven、Gradle 和 Jenkins 的第3方开源库轻松实现持续集成。
Apache JMeter (apache-jmeter-5.4.3.tgz)可用于测试静态和动态资源、Web 动态应用程序的性能。 它可用于模拟服务器、服务器组、网络或对象...通过适用于 Maven、Gradle 和 Jenkins 的第3方开源库轻松实现持续集成。
- **调试工具**: 在Linux环境下,gdb是最常用的调试器之一,它可以对程序进行单步执行、设置断点等操作;Valgrind则是一款优秀的内存调试工具,能够检测内存泄漏等问题;strace则用于跟踪系统调用,帮助开发者理解...
Ubuntu是一款基于Debian的Linux发行版,因其稳定性和安全性而被广泛用于服务器环境。安装Ubuntu服务器时,通常会选择最小化安装,仅包含基本系统工具,随后根据需求添加其他服务和软件。 “pi_server”可能是一个...
同时,该库可能也兼容流行的持续集成/持续部署(CI/CD)工具,如Jenkins、GitLab CI或Travis CI,以自动化服务配置的版本控制和部署流程。 总的来说,“service-configuration-lib-2.1.0”是一个专注于服务配置管理...
本文主要讲解了云计算之阿里云的偏架构运维,涵盖了API网关、Docker Compose、Jenkins、GitHub Pages、Hexo、Linux操作系统、Webpack编译原理、commitlint、perttier+eslint+husky、前端安全性问题、前端架构工作、...