jenkins的使用 - 迁
使用
1 基础
2 部署流程
现状说明:
A系统依赖B系统
C系统依赖B系统
D系统依赖A和C系统
由于我们的环境pom.xml里面的依赖包升级后也不升版本号, 理由是:
- 如果B升级了,那A和C都要升级,如果B仅仅是bugfix那就有点得不偿失
- 如果B升级了,并且更新了maven库,那么A满足了升级需求,C则不需要升级,那怎么办呢? 我们采用builds.sh的方式,即offline的模式更新maven库
- 如果B升级了,仅仅A跟着升级,那么D怎么办,D的依赖里面要写new-A和C,这样D也要重新发布,因为我们是多个产品环境都用同一套代码,所以这样玩比较麻烦
解决办法:
- 现在预想着将核心版本和接口版本分开,如果接口版本升级了,那么所有的依赖包也去升级,如果仅仅升级本程序的核心版本那就不用升级
- 开发一个管理平台,将所有项目依赖都注册上去,这样有改动就自动通知其他依赖
一个比较好的CI/CD流程:
3 添加svn版本选择
选择 Active Choices Parameter插件
def dirs = ['trunk/'] // defaults to trunk def command = ['svn', 'ls', 'http://huored.gicp.net:8088/svn/aisport.core.base/tags'] def proc = command.execute() proc.in.eachLine { dirs.add('tags/' + it) } command = ['svn', 'ls', 'http://huored.gicp.net:8088/svn/aisport.core.base/branches'] proc = command.execute() proc.in.eachLine { dirs.add('branches/' + it) } dirs
groovy本身无法提取Jenkins的环境变量,但是有个办法可以正则获取:
def dirs = ['trunk/'] // defaults to trunk def build = Thread.currentThread().toString() // /job/Docker-deploy/job/cms.core.base/ ==> cms.core.base def regexp= ".+?/job/.*/job/([^/]+)/.*" def match = build =~ regexp def jobName = match[0][1] svn_url='http://xxxxxxxxx:8088/svn/'+jobName+'/branches' def command = ['svn', 'ls', svn_url] def proc = command.execute() proc.in.eachLine { dirs.add('branches/' + it) } dirs
注意 Revision_Type就是可以被系统引用的变量名
比如在后面的源码管理中使用
4 动态添加node节点
Jenkins驱动底层的saltstack进行项目更新,需要从cmdb提取主机信息,主机则注册在salt中
def hosts = [] def getURL = "http://88fucheng.jumpserver/japi/assets/getHostByService/?service=account.base&fmt=jenkins" def command = "curl $getURL" def proc = command.execute() proc.waitFor() proc.in.eachLine { hosts.add("$it:selected") } # 默认全选 hosts
5 rancher 插件
6 jenkins中的变量传递
在同一个job内,两个shell脚本的参数传递,可以使用:
export A=value
这样在后面的shell中直接调用 $A
当变量需要在Acitve Choice Parameter 这样的插件中调用时,需要使用全局环境变量,需要引用inject environment variables 插件
echo "IMG_NAME=${IMG_NAME}" > /tmp/${JOB_BASE_NAME}.propertiest
在shell中把变量打印到文件
这时候rancher插件就可以正常使用 ${IMG_NAME} 变量了
7 saltstack插件使用
使用 salt api接口对接,但是一直报JSONencode的问题
8 编译隔离和执行器
会产生一个 ${JENKINS_HOME}/maven-repositories/${EXECUTOR_NUMBER}/ 的目录,将临时文件和依赖下载到里面
注意一下,如果有密码管理,那么需要在全局里面配置密码文件
# cat .m2/settings-security.xml <settingsSecurity> <relocation>/opt/software/maven/conf/settings-security.xml</relocation> </settingsSecurity>
9 job 回调通知
故障处理
现象:
当build和collection data时 CPU非常高,但是io和内存都正常。随后就看了java的线程情况,貌似Computer.thread CPU非常高。
在这个过程中,同僚发现一个jenkins的issue: https://issues.jenkins-ci.org/browse/JENKINS-52150?focusedCommentId=345858&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-345858
现象跟我们的有点像,于是查看了jenkins版本也在范围内(from 2.89.4 to 2.121.2)。
原因是:
看样子是 fingerprint这个目录的问题咯,上去确认下,还真有这个可能。
方法1 直接remove掉这个目录
那fingerprint到底有什么用呢?
可能跟Notification plugin有关系,因为之前没有启用过notification功能
方法2 使用添加启动参数
-Dhudson.util.AtomicFileWriter.DISABLE_FORCED_FLUSH=true