解决 Jenkins Artifactory Plugin 在 AIX 上传制品失败的问题


本文对于同样在 AIX 遇到这个问题的人会非常有帮助。不要被标题无聊到,解决问题的过程值得参考。


分享一个花了两天时间才解决的一个问题:使用 Jenkins Artifactory 插件上传制品到 https 协议的企业级的 Artifactory 失败。该问题只在 AIX 平台上出现的,其他 Windows,Linux, Unix 均正常。

前言
最近计划将之前使用的 Artifactory OSS(开源版)迁移到 Aritifactory Enterprise(企业版)上。为什么要做迁移?这里有一个 Artifactory 对比的矩阵图 https://www.jfrog.com/confluence/display/JFROG/Artifactory+Comparison+Matrix

简单来说,开源版缺少与 CI 工具集成时常用的 REST API 功能,比如以下常用功能

  • 设置保留策略(Retention)。设置上传的制品保留几天等,达到定期清理的目的。
  • 提升(Promote)。通过自动化测试的制品会被提升到 stage(待测试)仓库,通过手工测试的提升到 release(发布)仓库。
  • 设置属性(set properties)。对于通过不同阶段的制品通过 CI 集成进行属性的设置。
    正好公司已经有企业版了,那就开始迁移吧。本以为会很顺利的完成,没想到唯独在 IBM 的 AIX 出现上传制品失败的问题。


环境信息

Jenkins ver. 2.176.3
Artifactory Plugin 3.6.2
Enterprise Artifactory 6.9.060900900
AIX 7.1 && java version 1.8.0

以下是去掉了无相关的信息的错误日志。


[consumer_0] Deploying artifact: https://artifactory.company.com/artifactory/...
Error occurred for request GET /artifactory/api/system/version HTTP/1.1: A system call received a parameter that is not valid. (Read failed).
Error occurred for request PUT /artifactory/... HTTP/1.1: A system call received a parameter that is not valid. (Read failed).
Error occurred for request PUT /artifactory/... HTTP/1.1: A system call received a parameter that is not valid. (Read failed).
 Caused by: java.net.SocketException: A system call received a parameter that is not valid. (Read failed)
  at java.net.SocketInputStream.socketRead(SocketInputStream.java:127)
  at java.net.SocketInputStream.read(SocketInputStream.java:182)
  at java.net.SocketInputStream.read(SocketInputStream.java:152)
  at com.ibm.jsse2.a.a(a.java:227)
  ... ...
  at com.ibm.jsse2.as.startHandshake(as.java:454)
  ... ...
Failed uploading artifacts by spec

很奇怪会出现上述问题,从开源版的 Artifactory 迁移到企业版的 Artifactory,它们之间最直接的区别是使用了不同的传输协议,前者是 http 后者是 https。


HTTPS 其实是有两部分组成:HTTP + SSL/TLS,也就是在 HTTP 上又加了一层处理加密信息的模块,因此更安全。


本以为 Google 一下就能找到此类问题的解决办法,可惜这个问题在其他平台都没有,只有 AIX 上才有,肯定这个 AIX 有什么“过人之处”和其他 Linux/Unix 不一样。

用 curl 替代
由于上述问题重现在需要重新构建,比较花时间,就先试试直接用 curl 命令来调用 Artifactory REST API 看看结果。

做了以下测试,查看 Artifactory 的版本


curl  https://artifactory.company.com/artifactory/api/system/version
curl: (35) Unknown SSL protocol error in connection to artifactory.company.com:443

# 打开 -v 模式,输出更多信息
bash-4.3$ curl -v  https://artifactory.company.com/artifactory/api/system/version
*   Trying 10.18.12.95...
* Connected to artifactory.company.com (10.18.12.95) port 443 (#0)
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* NPN, negotiated HTTP1.1
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS alert, Server hello (2):
* Unknown SSL protocol error in connection to artifactory.company.com:443
* Closing connection 0
curl: (35) Unknown SSL protocol error in connection to artifactory.company.com:443

果然也出错了,curl 也不行,可能就是执行 curl 命令的时候没有找到指定证书,查了 curl 的 help,有 --cacert 参数可以指定 cacert.pem 文件。


bash-4.3$ curl --cacert /var/ssl/cacert.pem https://artifactory.company.com/artifactory/api/system/version
{
  "version" : "6.9.0",
  "revision" : "60900900",
  "addons" : [ "build", "docker", "vagrant", "replication", "filestore", "plugins", "gems", "composer", "npm", "bower", "git-lfs", "nuget", "debian", "opkg", "rpm", "cocoapods", "conan", "vcs", "pypi", "release-bundle", "replicator", "keys", "chef", "cran", "go", "helm", "rest", "conda", "license", "puppet", "ldap", "sso", "layouts", "properties", "search", "filtered-resources", "p2", "watch", "webstart", "support", "xray" ],
  "license" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

试了下成功了。

到这里问题已经解决了,只要使用 curl 调用 Artifactory REST API 就能完成上传操作了。但我用的 Jenkins Artifactory Plugin,如果使用 curl 我需要把之前的代码重新再实现一遍,然后再测试,就为了 AIX 一个平台的问题,实在是“懒”的重新开始。本着这样懒惰的性格,还得继续解决 Jenkins 调用 agent 去执行上传失败的问题。

最终解决
设置 SSL_CERT_FILE 环境变量
想试试用上述的办法来解决 Jenkins 的问题。如果能有一个环境变量能设置指定 cacert.pem 文件的路径,那样在 Jenkins 调用 agent 执行上传时候就能找到证书,可能就能解决这个问题了。果然是有这样的环境变量的 SSL_CERT_FILE,设置如下


set SSL_CERT_FILE=/var/ssl/cacert.pem

设置好环境变量之后,通过 curl 调用,再不需要使用 --cacert 参数了。这下看起来有戏了,带着喜悦的心情把这个环境变量加到 agent 机器上,设置如下:

解决 Jenkins Artifactory Plugin 在 AIX 上传制品失败的问题

或者可以修改 agent 机器上的 /etc/environment 文件。

结果经测试错误信息依旧,看来 Jenkins 执行的 remote.jar 进行上传时跟本地配置环境没有关联,看来需要从执行 remote.jar 着手,把相应的设置或是环境变量在启动 remote.jar 时传进去。


Jenkins 管理 agent 的原理是通过在 agent 上启动一个 remote.jar 实现的


启动 remote.jar 时设置环境变量
java 的 -D 参数可以完成这一点。

进行了大量的搜索和尝试,最终在 IBM 的官方找到了这篇文档 https://www.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.security.component.80.doc/security-component/jsse2Docs/matchsslcontext_tls.html

文档大意是,IBM SDK 系统属性 com.ibm.jsse2.overrideDefaultTLS=[true|false] 有 true 和 false 两个值,如果想要与 Oracle SSLContext.getInstance("TLS") 的行为相匹配,请将此属性设置为 true,默认值为 false。

下表显示了系统属性对 SSLContext.getInstance("TLS") 的影响

解决 Jenkins Artifactory Plugin 在 AIX 上传制品失败的问题

绝大多数的 Java 应用都是使用 Oracle 的 JDK 来开发的,这里要与 Oracle 的行为保持一致;另外 IBM 的 SDK 默认协议只有 TLS V1.0,而上面的 log 可以看到使用的 TLSv1.2 协议,因此需要将属性设置为 true。

最终在 Jenkins 的 agent 配置里将 JVM Options 区域加上这句 -Dcom.ibm.jsse2.overrideDefaultTLS=true,断开连接,重新启动 agent,再次执行 Pipeline,成功的把 AIX 上的制品上传到 Artifactory 上了,问题解决了。

总结
遇到问题并解决问题是一件非常爽的事,从中也学到了很多之前不曾了解过的知识,解决问题的过程比 Google 随便查查更让人印象深刻,再遇到类似问题可能就会举一反三了。

另外,凡事如果觉得自己在短时间内没有头绪、自己搞不定的时候尽快寻求有经验的同事的帮助。感谢帮助我的同事们,没有他们的帮助和指导就不能这么快的解决问题。

原文地址:https://blog.51cto.com/15127514/2658382

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


基础环境、流程图1)流程图jenkinspipeline发布应用2)、jenkins上安装kubectl#主节点上查看kubectl位置[root@k8s01~]#whichkubectl/usr/bin/kubectl#将k8s节点的kubectl文件cp至jenkinsscp10.0.0.101:/usr/bin/kubectl.cp./kubectl/usr/local/bin/kubectl
本节是建立在流水线入门内容的基础上,而且,应当被当作一个参考。对于在实际示例中如何使用流水线语法的更多信息,请参阅本章在流水线插件的2.5版本中的使用Jenkinsfile部分,流水线支持两种离散的语法,具体如下对于每种的优缺点,参见语法比较。正如本章开始讨论的,流水线最
Linuxcentos7安装Jenkins(jenkins-2.227-1.1.noarch.rpm)时遇到问题:1.出现问题1:安装jenkins一直失败,提示Nosuchfileordirectory[helen@linuxprobeJenkins]$sudorpm-ivhjenkins-2.227-1.1.noarch.rpmPreparing...####################
作为一个拥有很多账号的当代美少女,忘记用户名密码什么的是再正常不过的事了。“忘记密码”这一功能给我真的带来了很大的福音啊。但是最近重新使用Jenkins时,看到需要输入用户名密码,顿时脑子一片空白。经过一系列的查找,终于解决了问题,害,只有把方法记下来才是王道,以后妈妈再
Jenkins、GitLab和Maven(Nexus)完成自动构建迈向持续集成持续集成,毋庸置疑的是这是两部分要求,一个是持续一个是集成,那么持续和集成到底表示了什么要求和含义呢?其中的集成比较容易理解就是指开发人员将自己开发的代码不断地交付给全部系统的代码,在Git仓的概念之下也就是不断地
 下载文档https://www.jenkins.io/zh/download/  Debian下载1.下载安装keyhttps://pkg.jenkins.io/debian-stable/jenkins.io.key  
流水线建设从Jenkins部署开始Jenkins是一个独立的开源自动化服务器,可以用来自动化,例如构建、测试和部署软件等各种任务,是一个实现CI(持续集成)的很好的工具。Jenkins可以通过本地系统包、Docker安装,甚至可以在安装Java运行时环境的机器上独立运行。JenkCI/CD的概念谈到持
原因:这种情况是SSHServer中的RemoteDirectory路径不存在。解决方法:重新输入目标服务器中存在的路径。      
什么是持续集成持续集成(Continuousintegration,简称CI)指的是,频繁地(一天多次)将代码集成到主干。持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。通过持续集成,团
Tomcat安装:1.下载Tomcat包:http:/omcat.apache.org/并解压2.启动:双击bin\startup.bat文件浏览器访问:http://localhost:8080/3.Tomcat配置登录:打开confomcat-users.xml文件添加如下代码:<rolerolename="manager-gui"/><userusername="admin"password=&q
文章目录jenkinscron笔记简介H符号(hash的简写)别名例子jenkinscron笔记简介jenkinscron遵循普通cron的语法,略有不同,每行包含五个字段可以使用Tab和空行分割分钟小时日月周0-590-231-311-120-7(0和7都表示周日)可以使用以下操作符为一个字段指定多个值(按照
1.nginx的配置location/jenkinsno{indexindex.htmlindex.htm;proxy_passhttp://127.0.0.1:8081;proxy_connect_timeout3000s;proxy_send_timeout3000s;proxy_read_timeout3000s;prox
1、下载安装插件下载地址:http://files.jetbrains.org.cn/aliyun-oss.hpi在Jenkins中安装插件,请到ManageJenkins->Advanced->Upload,上传插件(.hpi文件)安装完毕后请重新启动Jenkins2、搜索安装jenkins插件安装3、安装完成以后配置阿里云oss账号oss这边设置:(账号的权限也要
首先将构建历史清除Jenkins构建历史删除与重置然后进入Jenkins服务器工作目录oot/.jenkinstar-czvfjobs.tarjobs 将jobs打包将job.tar文件复制到新Jenkins服务器相同目录下解压tar包 tar-zxvfjob.tar登录新JenkinsJenkins-系统管理-读取配置,只有点击了读取配置,原
一、动态生成Slave1.1、简介之前我们都是在物理机或者虚拟机上部署jenkins,但是这种部署方式会有一些难点,如下:主Master发生单点故障时,整个流程都不可用了每个Slave的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导致管理起来非常不方便,维护起来也是
from jenkins import Jenkins# 判断job是否运行结束def build():    job = 'branch-deploy-wap'    params = {        'server_ip': '10.160.30.XXX',        'server_username': 'root',        'server_userpass&#
背景client端执行webUI自动化测试时依赖操作系统上安装了对应的浏览器,并且浏览器与驱动要进行版本的对应——而selenium是可以部署集群,通过远程的方式执行对应的自动化用例,方便高效。原理1、通过代码可知,自动化运行的主类接收了任务id,获取到任务信息后根据任务类型判断进行接口
背景工具选择架构设计及技术实现参数设计断言持续集成测试集编写总结  一、背景1.目前公司发展比较迅速,还处于不停堆业务阶段,所以迭代比较频繁,导致人工回归的成本越来越大2.在有限的测试资源情况下,开发自测的需求占比不低,后端频繁发布容易心里没底
本地pycharm打开项目,运行自动化项目下载项目代码,并用pycharm打开项目gitclonehttps://gitee.com/iread9527/iInterface_python.git进入iInterface_python目录下,cdiInterface_python使用pip3install-rrequirements.txt命令,安装python项目依赖的第三方库使
Jenkins邮件设置一、简介最近有朋友问Jenkins邮件设置的问题,想起来当时也是碰到不少坑,网上看了很多博客说的解决办法根本没有用。最后我解决了这个问题,在此记录一下,希望能够帮助到在网上搜了半天仍然徒劳无功的朋友们,我懂那种失败了一次又一次的感觉,希望能帮到大家。二、配置步