0%

Jenkins持续集成平台搭建

Jenkins 部署

创建Jenkins运行目录

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

设置jenkins主目录

  1. 使用WEB容器工具设置JENKINS_HOME环境参数。

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

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

下载jenkins.war

最新版jenkins的war包
把下载的war包放入/opt/Jenkins目录下

编写启动脚本

1
2
3
4
5
6
7
8
9
/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构建时遇到的No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

原因:maven项目执行编译时,没有找到对应的JDK。
解决方案:在Jenkins的设置中加入JDK的配置。

注意手动录入系统安装的JDK的路径,即在JAVA_HOME输入框手动输入JDK的安装路径,不勾选Install automatically

好用的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参数化】

适用于项目中配置了”源码管理”的,Git分支直接从”源码管理”中拉取的代码中获取分支信息

List Git Branches Parameter PlugIn 【构建分支&Tags参数化】plus

适用于不在项目中配置源码拉取,但是需要去获取源码的分支信息的时候

Build User Vars Plugin【获取项目构建人】

插件名称:user build vars plugin

变量值表

VariableDescription
BUILD_USERFull name (first name + last name)
BUILD_USER_EMAILEmail address
BUILD_USER_FIRST_NAMEFirst name
BUILD_USER_IDJenkins user ID
BUILD_USER_LAST_NAMELast 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打开,可以看多很多的设置项,点击进入自己需要批量设置的项,进行设置。

Post build task用于在jenkins构建完成后,继续执行所需要执行的shell脚本

Script中写入需要执行的shell命令

extra-columns 视图为List View视图的列表展示增强插件

插件离线下载地址:清华大学开源软件镜像站_Index of /jenkins/plugins/extra-columns/

It currently provides the following columns:

  • Build description
  • Build duration
  • Build parameters
  • Configure build button
  • Disable/enable Project button/icon
  • Job type
  • Last build # 最后一次构建的时间
  • Last build node
  • Last/current build console
  • Last project configuration modification
  • Periodic build trigger
  • Project description
  • SCM type
  • Agent or label restriction
  • Test result
  • User name # 最后一次构建的执行人
  • Workspace link

常用插件汇总

  • 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相关的信息
  • Persistent Parameter参数化插件,用于在下次参数化构建时,保留前一次的选择记录
  • Periodic Backup使用心得:备份是运维一个系统必须要保障的事情,该插件的恢复功能可能不可用,需要手工进行,好处在于可以定时备份
  • Publish Over SSH Plugin通过ssh发布文件
  • Rebuild Plugin重新执行插件
  • Status Monitor Plugin构建状态插件
  • ws-cleanup Pluginworkspace清理插件
  • Node and Label parameter 这个插件增加了一个新的参数类型,Node 和 Label,从而使用户通过参数可以选择项目构建运行的节点。

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.
**/