Jenkins持续集成平台搭建

Jenkins 部署

创建Jenkins运行目录
1
2
3
4
5
6
# Jenkins主目录
mkdir /opt/Jenkins/Home
# Jenkins缓存位置
mkdir /opt/Jenkins/tmp
# 脚本存放位置
mkdir /opt/Jenkins/script
设置jenkins主目录

第一种方法是使用WEB容器工具设置JENKINS_HOME环境参数。

1
2
3
打开tomcat的bin目录,编辑catalina.sh文件。
# OS specific support. $var _must_ be set to either true or false.上面添加:export JENKINS_HOME=""
在引号中填入你的路径。

第二种是在环境变量中设置JENKINS_HOME

1
2
3
4
5
# 编辑对应用户的终端的环境变量设置文件
# 编辑profile文件:
vim ~/.bashrc
# 在最后加入:
export JENKINS_HOME="/home/souche/jenkins/Home"
下载jenkins.war

下载地址
把下载的war包放入/opt/Jenkins目录下

编写启动脚本
1
2
3
4
5
6
7
8
/usr/bin/java -Dfile.encoding=UTF-8 \
-XX:PermSize=256m -XX:MaxPermSize=512m -Xms256m -Xmx512m \
-Djava.io.tmpdir=/opt/Jenkins/tmp \
-jar /opt/Jenkins/jenkins.war \
--httpListenAddress=127.0.0.1 \
--httpPort=8080 \
>> /opt/Jenkins/nohup.out \
2>&1 &
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 设置编码格式
-Dfile.encoding=UTF-8
# 设置内存占用
-XX:PermSize=256m -XX:MaxPermSize=512m -Xms256m -Xmx512m
# 指定Jenkins运行缓存位置
-Djava.io.tmpdir=/opt/Jenkins/tmp
# 指定执行的war包
-jar /opt/Jenkins/jenkins.war
# 指定本地IP,可能是127.0.0.1,也可能是内网对应的IP
--httpListenAddress=127.0.0.1
# 指定本地端口
--httpPort=8080
# 指定Jenkins运行日志输出位置
>> /opt/Jenkins/nohup.out
# 设置进程在后台运行
2>&1 &

新建脚本文件存放脚本startJenkins.sh,放到script目录下。
执行脚本

1
2
3
4
# 赋予可执行权限
chmod a+x startJenkins.sh
# 执行脚本,启动Jenkins
./startJenkins.sh
Jenkins主目录介绍
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# jenkins主配置文件
-rw-r--r-- 1 taoyi wheel 1.6K 8 16 01:43 config.xml
-rw-r--r-- 1 taoyi wheel 159B 8 16 01:43 hudson.model.UpdateCenter.xml
-rw------- 1 taoyi wheel 1.7K 8 16 01:27 identity.key.enc
-rw-r--r-- 1 taoyi wheel 94B 8 16 01:27 jenkins.CLI.xml
-rw-r--r-- 1 taoyi wheel 4B 8 16 01:43 jenkins.install.InstallUtil.lastExecVersion
-rw-r--r-- 1 taoyi wheel 4B 8 16 01:30 jenkins.install.UpgradeWizard.state
# 包含所有的项目,包含所有项目对应的配置文件,包括挂到slave中的项目的配置文件
drwxr-xr-x 4 taoyi wheel 136B 8 16 09:35 jobs
drwxr-xr-x 4 taoyi wheel 136B 8 16 01:29 logs
-rw-r--r-- 1 taoyi wheel 907B 8 16 01:43 nodeMonitors.xml
# 所有的slave节点配置文件
drwxr-xr-x 2 taoyi wheel 68B 8 16 01:27 nodes
# Jenkins插件
drwxr-xr-x 2 taoyi wheel 68B 8 16 01:27 plugins
-rw-r--r-- 1 taoyi wheel 64B 8 16 01:27 secret.key
-rw-r--r-- 1 taoyi wheel 0B 8 16 01:27 secret.key.not-so-secret
drwx------ 15 taoyi wheel 510B 8 16 01:44 secrets
drwxr-xr-x 5 taoyi wheel 170B 8 16 01:27 updates
drwxr-xr-x 3 taoyi wheel 102B 8 16 01:27 userContent
# 在Jenkins中添加的所有用户都会在这个目录下新建文件夹管理,每个用户都会有一个config.xml配置文件
drwxr-xr-x 4 taoyi wheel 136B 8 16 01:40 users
drwxr-xr-x 25 taoyi wheel 850B 8 16 01:27 war
# 挂在本机下的所有项目的工作空间
drwxr-xr-x 3 taoyi wheel 102B 8 16 01:44 workspace

简单操作jenkins状态

关闭jenkins:http://localhost:8080/exit
重启jenkins:http://localhost:8080/restart
重新加载配置信息:http://localhost:8080/reload

问题总结

Jenkins console输出乱码

/etc/profile中添加export JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8"
Jenkins系统管理里,添加环境变量KeyLANGValueen_US.UTF-8(如果系统默认的已经是en_US.UTF-8,就不用设置了)

jenkins中的WORKSPACE中的HTML文件无法打开

报错如下:

1
2
3
Verify that you have JavaScript enabled in your browser.
Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
Check are there messages in your browser's JavaScript error log. Please report the problem if you suspect you have encountered a bug.

解决方法:在系统管理-脚本命令行中执行如下脚本

1
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","sandbox allow-scripts; default-src 'none'; img-src 'self' data: ; style-src 'self' 'unsafe-inline' data: ; script-src 'self' 'unsafe-inline' 'unsafe-eval' ;")

或者在 Jenkins 中新建一个项目,添加一个Execute system Groovy script,其中添加以上脚本,然后构建该项目。

好用的Jenkins插件

Parameterized Remote Trigger Plugin 【多slave项目顺序执行】 Parameterized Trigger Plugin 【多项目顺序执行】

设置项目在某项目执行完成后,再执行当前项目
【构建触发器】-【Build after other projects are built

Build periodically【日程表】设置

设置周期性执行策略

第一个参数代表的是分钟 minute,取值 059;
第二个参数代表的是小时 hour,取值 0
23;
第三个参数代表的是天 day,取值 131;
第四个参数代表的是月 month,取值 1
12;
最后一个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。

示例:
H 8 * * 6:每周六上午8点构建一次
H * * * *:每小时构建一次
H 8 3 2 *:每年2月3号8点构建一次

Git Parameter【构建分支&Tags参数化】
Build User Vars Plugin【获取项目构建人】

插件名称:user build vars plugin

变量值表

Variable Description
BUILD_USER Full name (first name + last name)
BUILD_USER_EMAIL Email address
BUILD_USER_FIRST_NAME First name
BUILD_USER_ID Jenkins user ID
BUILD_USER_LAST_NAME Last name

在jenkins任务中使用构建变量:注意需要勾选 “Set jenkins user build variables.”

Naginator【任务失败重新构建插件】

构建后操作中选择Retry build after failureFixed delay填写每次重试的时间延迟,单位是秒。Maximum number of successive failed builds文本框中填写重试次数。

Publish Over SSH【通过ssh构建项目】
触发远程构建(例如,使用脚本)

设置身份验证令牌TOKEN_NAME,可以随意定义。

1
2
3
4
# 默认参数执行远程构建
JENKINS_URL/job/JOB_NAME/build?token=TOKEN_NAME
# 参数化形式执行远程构建
JENKINS_URL/job/JOB_NAME/buildWithParameters?token=TOKEN_NAME&params1=params1&...
Job Configuration History Plugin【记录项目的修改记录】

在项目中,点击左侧栏中的Job Config History,可以查看该项目的更改历史
Jenkins主目录下,点击左侧栏中的Job Config History,可以查看整个系统的所有修改历史

1
2
3
4
5
Show system configs only
Show job configs only
Show created jobs only
Show deleted jobs only
Show all configs

Localization: Chinese (Simplified)切换jenkins显示语言为中文

只要安装重启后,jenkins的显示语言就会自动展示为中文

Startup Triggerjenkins每次重启或者启动后自动执行任务

jenkins项目的配置中,构建触发器中,Build when job nodes start配置项中,设置Quiet period字段为默认值0,表示重启后,没有任何延迟,直接启动。

Configuration Slicing plugin批量修改所有项目的某一个配置

系统管理中,Configuration Slicing打开,可以看多很多的设置项,点击进入自己需要批量设置的项,进行设置。

常用插件汇总

Build Environment Plugin构建环境插件,可以进行构建环境比较。
Build Flow Plugin工作流插件,支持DSL脚本定义工作流
Build Graph View Pluginbuild Flow插件视图(安装后需要重新才能生效)
Build Monitor View使用心得:基于该插件可以实现dashboard功能
Build Pipeline Plugin ViewPipeline 管道流图表展示插件
Build Timestamp Plugin任务log时间戳插件,使得job log的每次输出前面都增加当时的时间
Build-timeout Pluginjob构建超时插件
BuildResultTrigger Plugin根据其他的job的成功或失败来启动此build。
Cron Column Plugin 通过定时任务例行的运行一些job
Files Found Trigger检测指定的目录,如果发现指定模式的文件则启动build。
HTTP Request Plugin使用心得:在构建前后可以通过该插件以http形式调用各种api接口实现和内部系统的联动
Job Configuration History Plugin使用心得:使job具备版本管理的能力,diff和rollback功能更是非常赞
Job Import Plugin使用心得:可以快速导入其他jenkins集群的已有job,需要认证的jenkins系统导入需要提供凭证才可以
Join Plugin这也是一个触发job的插件,亮点在于它触发job的条件是等待所有当前job的下游的job都完成才会发生。
Multijob Plugin多任务插件
Naginator Plugin任务重试插件
Parameterized Trigger Plugin这是一个扩展型的插件,使各个job连接的时候可以传递一些job相关的信息
Periodic Backup使用心得:备份是运维一个系统必须要保障的事情,该插件的恢复功能可能不可用,需要手工进行,好处在于可以定时备份
Publish Over SSH Plugin通过ssh发布文件
Rebuild Plugin重新执行插件
Status Monitor Plugin构建状态插件
ws-cleanup Pluginworkspace清理插件

Jenkins脚本

批量修改脚本的丢弃旧的构建设置项设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import jenkins.model.Jenkins
import hudson.model.Job
import jenkins.model.BuildDiscarderProperty
import hudson.tasks.LogRotator
// 遍历所有的任务
Jenkins.instance.allItems(Job).each { job ->

if ( job.isBuildable() && job.supportsLogRotator() && job.getProperty(BuildDiscarderProperty) == null) {
    println " \"${job.fullDisplayName}\" 处理中"

    job.addProperty(new BuildDiscarderProperty(new LogRotator (310310)))
    println "$job.name 已更新"
}
}
return;

/**
LogRotator 构造参数分别为:
daysToKeep:  If not -1, history is only kept up to this days.
numToKeep: If not -1, only this number of build logs are kept.
artifactDaysToKeep: If not -1 nor null, artifacts are only kept up to this days.
artifactNumToKeep: If not -1 nor null, only this number of builds have their artifacts kept.
**/