本文将介绍在 centos 系统上完整搭建并运行 Jenkins 持续集成的实现细节,主要分以下几个步骤来介绍:
rpm -qa | grep jdk
,显示结果如右(不同版本会显示 java 版本不同):java-1.6.0-openjdk-1.6.0.0-1.45.1.11.1.el6.i686
yum -y remove java-1.6.0-openjdk-1.6.0.0-1.45.1.11.1.el6.i686
;wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u40-b26/jdk-8u40-linux-x64.tar.gz
,jdk 的具体下载地址可根据版本和系统需要去官网自行选择,此处为 centos 64 位系统 1.8 版本的 jdk;mkdir /usr/java
,将文件解压到/usr/java目录下,tar -zxvf jdk-8u40-linux-x64.tar.gz -C /usr/java
配置 java 环境变量
打开 profile 文件,vi /etc/profile
,末尾加上如下环境变量:
export JAVA_HOME=/usr/java/jdk1.8.0_40
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
使 profile 文件生效,source /etc/profile
创建软链接,在/usr/bin目录下创建新的 java 工具的软链接(Jenkins 服务启动需要在 /usr/bin 下有 java 命令行工具): ln -s /usr/java/jdk1.8.0_40/bin/java /usr/bin/java
安装 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
使 Jenkins 能够以服务方式启动
sudo service jenkins start/stop/restart
sudo chkconfig jenkins on
启动 Jenkins
输入指令 sudo service jenkins start
,如果出现类似如下的报错:
Starting Jenkins bash: /usr/bin/java: 没有那个文件或目录
或者
Starting Jenkins Jenkins requires Java7 or later, but you are running 1.5.0 from /usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre
则说明 jenkins 没有找到 java 安装目录,若此时已经卸载了 openjdk,安装了新版本的全 java 包,则可以通过修改 init.d 中配置文件解决,方法如下:
vi /etc/init.d/jenkins
找到candidates,修改如下,将你安装的java 所在路径写到第一个候选位置(最前面)即可,或建立/usr/bin/java软连接连接到新安装的 java,将/usr/bin/java写到最前。
candidates="
/usr/bin/java
/usr/java/jdk1.8.0_40/bin/java
/etc/alternatives/java
/usr/lib/jvm/java-1.6.0/bin/java
/usr/lib/jvm/jre-1.6.0/bin/java
/usr/lib/jvm/java-1.7.0/bin/java
/usr/lib/jvm/jre-1.7.0/bin/java
/usr/lib/jvm/java-1.8.0/bin/java
/usr/lib/jvm/jre-1.8.0/bin/java
"
更改 Jenkins 的默认执行用户,确保拥有后续构建中部分指令需要的高级权限。
vi /etc/sysconfig/jenkins
,修改JENKINS_USER的值,将 JENKINS_USRE="jenkins"改成 JENKINS_USER="root",执行用户更改为root用户修改目录的相应权限
sudo chown -R root /var/log/jenkins
sudo chgrp -R root /var/log/jenkins
sudo chown -R root /var/lib/jenkins
sudo chgrp -R root /var/lib/jenkins
sudo chown -R root /var/cache/jenkins
sudo chgrp -R root /var/cache/jenkins
安装部分 Jenkins 插件
在 nginx 配置目录/etc/nginx/conf.d 目录下新建配置文件 jenkins.conf,配置文件内容如下
server {
listen 80;
server_name jenkins.yourhost.com;
#access_log /var/log/jenkins.access.log main;
#error_log /var/log/jenkins.error.log ;
client_max_body_size 60M;
client_body_buffer_size 512k;
location / {
port_in_redirect on;
proxy_pass http://127.0.0.1:8080$request_uri;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
修改/etc/hosts,在末尾新增一行 :
127.0.0.1 jenkins.yourhost.com
重启 nginx,/usr/sbin/nginx -s reload
,即可以地址 jenkins.yourhost.com
访问 Jenkins 主页
插件名 | 说明 |
---|---|
Git plugin | jenkins 的 git 集成工具,拉取源代码 |
GitBuckit plugin | jenkins 的 gitbuckit 集成工具,拉取源代码(提供 gitbucket 的 webhook 配置,使 gitbucket 可以通过提交代码触发 build,webhook 地址为 http://[jenkins_host]/gitbucket-webhook/, 将其写入项目远程仓库的 settings->service hooks 里即可) |
Cobertura Plugin | 显示代码测试覆盖率报表,如 java 、python 等 |
Violations Plugin | 用来展示 Python 静态代码审查报表,支持 pylint、jslint 等 |
Email Extension Plugin | Jenkins 自定义邮件插件 。 |
Junit Plugin | 用来展示生成的单元测试报表,支持一切单测框架,如 junit、nosetests 等 |
Maven Integration plugin | maven 项目管理工具。一些 maven 代码质量管理命令:mvn sonar:sonar(单测结果,覆盖率)、findbugs:findbugs(静态代码检查) 、checkstyles:checkstyles(编写规范,潜在问题) |
Description Setter Plugin | 为每次 build 设置说明文字。通过正则表达式来匹配 log 里每行的输出,将符合正则表达式的部分显示在说明中。 |
Email Extension Plugin 的设置参考
Default Subject:
构建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!
Default Content:
<hr/>
(本邮件是程序自动下发的,请勿回复!)<br/><hr/>
项目名称:$PROJECT_NAME<br/><hr/>
构建编号:$BUILD_NUMBER<br/><hr/>
git版本号:${GIT_REVISION}<br/><hr/>
构建状态:$BUILD_STATUS<br/><hr/>
触发原因:${CAUSE}<br/><hr/>
构建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console</a><br/><hr/>
构建地址:<a href="$BUILD_URL">$BUILD_URL</a><br/><hr/>
失败单测:${FAILED_TESTS} <br/><hr/>
变更集:${JELLY_SCRIPT,template="html"}<br/>
<hr/>
以下图解会对 Jenkins 系统的主要设置进行说明,可参考该部分进行必要的设置。
系统常规设置。
该部分为常规设置,如下图设置即可。主目录的高级部分点开,为工作空间和构建日志的目录设置,使用默认即可。
构建环境设置,具体见下图。
简单说明:
Android 部分,Android SDK root 栏填入 android sdk 所在根目录,如 /home/work/Library/Android/sdk;
JDK 部分,若已经安装 JDK,则取消 “自动安装” 的勾选,填入 JAVA_HOME,即你的 jdk 安装根目录;
Git 部分,若已安装了 git,取消勾选 “自动安装”,在 Path to Git executable 填入 git 工具的绝对路径如/usr/bin/git 或者 git 即可(已配置好环境变量)。
该部分依然是配置各构建环境。
ANT_HOME 填入 ant 工具的根目录,已安装则取消 “自动安装” 的选项,写入 ant 工具所在根目录;
MAVEN_HOME 写入 maven 工具的根目录,需要注意的是,建议 maven 根目录放置在公共目录/opt目录下,否则 Jenkins 运行用户有可能无权限访问 maven 安装所在目录而无法识别路径,依然是已安装则取消 “自动安装” 的选项。
继续配置:
Jenkins Location,写入你的 Jenkins 访问地址。比如:http://[jenkin_host]:[8080]/;系统管理员邮件地址,必须写入邮件发送人地址,如 jenkins@example.com;
CVS 需要配置的话,则填入相应信息,如 Private Key Location: Jenkins 服务运行用户的 rsa 私钥地址,如~/.ssh/id_rsa;Private Key Password 未设置则不用填写; Known Hosts Location 写入 known_hosts 目录。
邮件收发设置
此处是之前推荐安装的邮件插件 Email Extension Plugin 的设置。
邮件收发设置,按照字段要求填写即可,SMTP server 为邮件的 smtp 服务器地址;
Default Subject:邮件默认标题,可以带 Jenkins 变量,如:构建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!
Default Content: 邮件默认内容,可以带 Jenkins 变量,如
(本邮件是程序自动下发的,请勿回复!)
项目名称:$PROJECT_NAME
构建编号:$BUILD_NUMBER
git 版本号:${GIT_REVISION}
构建状态:$BUILD_STATUS
触发原因:${CAUSE}
构建日志地址:${BUILD_URL}console
构建地址:$BUILD_URL
失败单测:${FAILED_TESTS}
变更集:${JELLY_SCRIPT,template="html"}
需注意,要点击 Default user E-mail suffix 右下方的“高级(advance)”选项,才能进行邮件发送的 smtp 服务器的详细设置,设置如下:
勾选 “use SMTP Authentication”,根据字段填入相应信息。
User Name: 发送邮件的 email
Password: 发送人 email 的登陆密码。
SMTP port: SMTP 邮件服务器的端口。
点击 “Default Triggers” ,展开邮件发送触发器配置界面,如下图所示,根据需求勾选默认的触发发送邮件的方案。
下图为默认的邮件发送选项配置,若已经配置了之前介绍的 Extended E-mail Notification 的邮件选项,则该部分可忽略。
填写字段如 Extended E-mail Notification,注意,该部分需要勾选 “使用 smtp 认证”,才能展开 smtp 配置项的填写,不可忽略。
Path to key: jenkins 服务运行用户的 rsa 私钥路径,如~/.ssh/id_rsa;
Key: 将 Jenkins 服务运行用户的私钥全部内容填入,即~/.ssh/id_rsa 内的全部内容粘贴到此框;
Passphrase:创建 ssh-keygen rsa 私钥时,未设置则不填写。
rsa 方式远程操作机器的前提是,Jenkins 所在用户的id_rsa.pub 即公钥内容已经在远程机器用户.ssh 目录下的authorized_keys文件内,请确保 Jenkins 的公钥已复制到远程机的~/.ssh/authorized_keys 文件中。
SSH Servers(下图),需要远程操作的机器的信息配置,按照字段填写远程机器名称(自定义)、host 地址、访问用户和远程机器的指定工作目录即可。
点击 “高级(advanced)” 选项,展开 SSH Servers 的详细配置信息,如下图:
勾选 Use password authentication, or use a different key,展开针对于访问该远程机器的详细配置信息。
Key :将 Jenkins 服务运行用户的私钥全部内容填入,即~/.ssh/id_rsa 内的全部内容粘贴到此框。
port :ssh 连接远程机器的端口,ssh 默认端口 22。
设置 linux 的 slave 机器环境。
创建专用的 jenkins 用户来管理 Jenkins job(可选)
创建 jenkins 用户
sudo /usr/sbin/useradd -m jenkins -d /home/jenkins
查看 jenkins 用户及组的信息:
id jenkins
显示结果:uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)
设置用户 jenkins 的密码:
sudo /usr/bin/passwd jenkins
切换到用户 jenkins 环境下,su jenkins
;
确保 slave 机器上 java 安装正确,java -version
(java home 最好放在 /opt 公共目录下);
确保 ssh 正确运行
/sbin/service --status-all | grep ssh
在 Slave 的 linux 机器上创建 public/private key pair;
进入主目录下的.ssh 目录( 没有则建立目录 mkdir .ssh ),创建 public/private key pair:
生成秘钥匙:
ssh-keygen -t rsa
一路回车,不要设置 passphrase,文件生成在.ssh 目录下,私钥文件 id_rsa,公钥文件 id_rsa.pub;
在.ssh 目录中创建文件 authorized_keys;
将公钥加入到 authorized_keys 文件中,用以 Jenkins 的 slave 配置能通过 ssh 方式连接。
cat id_rsa.pub > authorized_keys
对.ssh 目录下文件赋予权限:
chmod -R 700 .ssh
chmod 600 authorized_keys
创建 slave 节点。
配置构建环境的依赖项。
安装完毕之后,因为此 slave 机器用之前自建的名为jenkins 的用户来构建 job,所以一定要配置好全局环境变量:
更改系统配置文件:
vi /etc/profile
在文件末尾添加环境变量,如配置 maven:
export M2_HOME=/opt/apache-maven-3.3 #(你的maven所在目录), 并将该目录的bin目录添加到环境变量PATH中
export PATH=$PATH:$M2_HOME/bin
退出后生效,source /etc/profile
用 slave 机器构建 job。
maven 安装。
http://maven.apache.org/download.cgi
;/opt
公共目录下,以便任何用户能够访问到该目录,例如/opt/apache-maven-3.3
;/etc/profile
,在文件末尾增加export M2_HOME=/opt/apache-maven-3.3
(你的 maven 所在目录), 将该目录的 bin 目录添加到环境变量 PATH 中,export PATH=$PATH:$M2_HOME/bin
;source /etc/profile
;测试 maven 安装成功,mvn -v
,出现配置信息如下则说明 maven 配置成功:
Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T19:57:37+08:00)
Maven home: /Users/turinblueice/Downloads/apache-maven-3.3.3
Java version: 1.8.0_40, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.10.5", arch: "x86_64", family: "mac"
centos 下一些 python 包的安装(可能在一些 python 项目的持续集成中会用到):