jenkins持续化集成的学习

学习jenkins,并简单配置博客发布

2016-02-21 | 阅读

Jenkins简介

Jenkins是基于Java开发的持续集成工具.持续化集成CIContinuous Integration是由一系列的最佳实践构成,包括源代码的版本控制,自动化构建,自动化测试,代码审查,自动发行和部署,持续反馈等等.

Jenkins需要tomcat,安装很方便,下载war包,放在tomcat的webapps文件夹下,重启tomcat,就安装好了.

也可以直接安装jenkins程序 :

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install jenkins

通过rpm安装之后,jenkins的配置文件为 /etc/sysconfig/jenkins.修改端口号:

JENKINS_PORT="8081"

直接安装的jenkins,会创建一个新的用户jenkins,而这个用户的目录位于/var/lib/jenkins,然后在这个路径来设置公私钥进行安全的访问.

安装后,使用service来管理jenkins服务.

安装Jenkins遇到最大的问题是墙.

配置DNS

sudo vim /etc/resolv.conf

#添加DNS服务器:
nameserver 223.5.5.5
nameserver 223.6.6.6

#测试DNS:
dig www.taobao.com +short

用户管理

jenkins-Configure Global Sercurity中设置允许用户注册,并使用安全矩阵.

然后注册的第一个用户具有权限Administer,然后使用这第一个用户登录后,赋予全部权限,并使匿名用户没有权限,这样jenkins就安全许多,新注册的用户是没有任何权限,需要管理员来审核才能有权限做任何事情的.

注册页面

添加并配置git插件

首先在插件中选择添加Git plugin,添加完成后,在系统管理中配置git的路径.

然后在具体任务的管理中,在源码管理中选择git,填写git地址URL,默认选择的分支就是master.

项目代码管理

Credentials中设置登录信息.

登录鉴别

为了安全,建议对git 的访问不要使用账号密码,而是使用ssh的公私钥来登录.下面选择Private Key文件路径.

这样就可以使用git来下载文件了.

使用git下载内容到工作目录workspace时,会出现异常,原因是上次checkout的内容没有删除,直接再次checkout,所以在源码管理时,选择Additional Behaviours - clean after checkout.

Jenkins 安装离线插件

插件管理 - 高级 ,直接选择上传.hpi文件的插件即可,安装后重启.

构建shell的编写.

由于执行shell的用户为jenkins,没有系统root用户所安装的所有软件的路径和配置,即各种PATH设置,所以执行SHELL经常会出问题,如使用rubyrvm时.

所以使用#!/bin/bash -l,来获取登录用户

其中#!表示该段shell要使用的shell程序.-l表示login shell,来获取环境变量,并设置.

关于JENKINS和XCODE的参数化构建.

使用Jenkins构建时,传递参数来配置环境等设置的实现.

Xcode-Building Setting-LLVM - Preprocessing-Preprocessor Macros中设置要传递的参数,这些参数都是以宏的形式传入,所以可以进行一些宏的设定.

Jenkins-Xcode-Advanced Xcode build options-Custom xcodebuild arguments中传递需要设置的参数.

举例,在Xcode中设置宏Debug = 0,然后如果Jenkins中不传该参数,则Debug为0,如果传递参数如Debug = 1,则Debug修改为1.

jenkins分布式构建,节点设置

使用jenkins时,发现有时候需要管理员权限,所以顺便学习一下关于jenkins的节点配置,以让jenkins的主干直接链接用于root权限的cluster来进行打包.

分布式构建能够让一套代码在不同的环境去编译 测试,但最终结果构建的结果还是会返回给master节点,然后由master节点来负责发布什么的…这里可能不是. 在系统设置-管理节点-新建节点中:

  • 节点名称:字面意思
  • Dumb Slave : 新建一个节点
  • 描述 : 字面意思,节点的描述
  • # of executors : 最大同时构建数量,基本根据CPU数来设置
  • 远程工作目录 : 节点的工作目录,需要有文件权限,否则会报错hudson.util.IOException2: Failed to copy xxxx
  • 标签 : 对节点进行分组,标签之间用空格分隔.标签与每个job的标签对应
  • 用法 : 尽可能的使用这个节点:常用默认的设置. 只允许运行绑定到这台机器的job : 通过设置来绑定job.
  • 启动方法 : 连接到节点的方式,有四种 :

    • Launch slave agents on Unix machines via SSH : 通过SSH通道来连接节点.
    • Launch slave agents via Java Web Start : 通过Jave web start连接节点,可以用这种方式连接windows服务器.
    • Launch slave via execution of command on the Master : 通过主节点控制台命令直接连接节点
    • Let Jenkins control this windows slave as a Windows service : 将Jenkins节点添加到windows服务中.
  • Availability : slave连接模式:

    • Keep this slave on-line as much as possible : 尽可能保持连接
    • Take this slave on-line according to a schedule: 根据时刻表保持在线
    • Take this slave on-line when in demand and off-line when idle : 根据需求自动连接和断线,我使用的这种方式,配置两个参数 : In demand delay,有任务时进行连接前的等待时间;Idle delay,无任务后断开连接前的等待时间.
  • Node Properties : 属性设置

    • Environment variables : 配置环境变量,可以在脚本中直接引用
    • Tool Locations : 工具的目录.如JDK目录,Ant目录,Maven目录等.

然后就可以进行连接了.

通过Deploy plugin来部署项目

顺便学习一下tomcat如何设置管理员账号,在tomcat的tomcat-users.xml文件中,添加用户,赋予一堆权限:

<user username="hello" password="world" roles="admin,manager,manager-script,manager-gui"/>

然后添加Deploy plugin插件,在项目配置中添加构建后步骤,Deploy war/ear to a container,然后主要配置项有:

  • WAR/EAR files : 部署的文件,根目录显示是workspace路径
  • Context path : 部署的访问路径,如果为空,则默认是war包的名称.
  • Container : 选择web容器,这里我选择tomcat,然后对于tomcat的配置:

    • manager user name : 用户名称,如上设置
    • Mananger password : 密码
    • Tomcat URL : 目标tomcat地址,”http://localhost:8080”,显然这里不可能远程部署到服务器,只能部署到本地服务器,也不会有人把tomcat的管理网站放出了,一切为了安全.

所以说,由于这个安全问题,企业级的生产部署,肯定不会是这样的,应该在编译服务器打包好应用后,通过公钥验证登录生产服务器,然后直接ftp或者其他方式来上传新包,然后重新加载项目。

Jenkins中报错 137

ERROR: Maven JVM terminated unexpectedly with exit code 137.

具体原因是因为内存不足,可以是 JVM内存不足,也可能机器内存不足.

先尝试修改JVM的最大堆,在profile中添加属性:

# -Xms 为初始堆大小, Xmx为最大堆大小
export _JAVA_OPTIONS="-Xmx500m"

使用Publish over SSH 插件发布网站

下载并安装Publish over SSH插件,安装后,在设置中配置ssh的服务器连接:

Remote Directory表示jenkins登录目标服务器后所在的根目录,然后密码证书选项,选择使用密码或证书,如果是使用RSA公私钥验证的,然后在path to key上指出路径,如/var/lib/jenkins/.ssh/id_rsa,这里指出的路径是私钥的路径.

配置测试后,就可以使用这个插件来进行发布了.

设置要发布的文件,以及目标路径,这个blog路径是在生成服务器下的Remote路径下面的,也就是最终上传到生产服务器的文件路径为/var/jenkinsTmp/blog.

Exec command要执行的脚本或者命令,可以添加参数,我这里只有一个简单的脚本,毕竟这次发布的是一个jekyll的静态网站.

#!/bin/bash -l

cd /var/jenkinsTmp/blog
rm -rf  _site
rm -rf /usr/local/nginx/html/Blog/_site
echo "删除 本地blog"
tar zxvf _site.tar.gz
echo "解压"
cp -R _site /usr/local/nginx/html/Blog
rm _site.tar.gz
echo "发布完成 "

执行sh时所在的路径是jenkins的用户目录,所以要cd到指定目录,然后在进行操作.Publish over SSH的基本使用配置就介绍到这里.

jenkins升级

# 查看jenkins地址
ps aux | grep jenkins

/etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=8081 --ajp13Port=8009 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20

可以看到war文件位于/usr/lib/jenkins/jenkins.war , 则我们暂停jenkins :

service jenkins stop 

然后下载新包替换一下 .war文件即可。