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

 

 

posted @ 2018-10-22 21:22  richardzgt  阅读(448)  评论(0编辑  收藏  举报