Jenkins 配置部署

简介

Jenkins 是一个开源的、提供友好操作界面的持续集成 (CI) 工具,起源于 Hudson(Hudson 是商用的),主要用于持续、自动的构建 / 测试软件项目、监控外部任务的运行。Jenkins 用 Java 语言编写,可在 Tomcat 等流行的 servlet 容器中运行,也可独立运行。通常与版本管理工具 (SCM)、构建工具结合使用;常用的版本管理系统有 SVN、GIT,构建工具有 Maven、Ant、Gradle。其具备以下特点:

  • 易于安装:不需要安装、不需要数据库,只需通过 java -jar jenkins.war 或部署到一个 servlet 容器中。
  • 易于配置:所有的配置都可能通过 Jenkins 提供的 web 界面完成,当然如果你喜欢,也可以通过手动修改 xml 文件进行配置。
  • 消息通知及测试报告:能够生成各类测试报告并通过消息通知机制(Email 等)进行报告,包括单元测试、覆盖率测试、静态分析等。
  • 分布式构建:Jenkins 支持多个 Slave 节点的动态挂载,完成分布式构建。
  • 资源动态调度:Jenkins 的容器资源通过 Kubernetes 动态调度,动态扩容收缩。
  • 插件支持:Jenkins 支持上千种插件,可以进行扩展,也可以根据需求近定制开发。

安装部署

以 CentOS 环境安装部署为例,详细介绍 Jenkins 安装部署整体过程和常用设置。

准备工作

环境准备

如果使用 Jenkins.war 包的形式进行安装,需要提前准备以下环境。

Java 环境准备
去官网下载 JDK

http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html

安装
  • 将下载得到的 jdk-8u161-linux-x64.rpm 包保存到 Linux 主机
# rpm -ivh jdk-8u161-linux-x64.rpm

环境变量
# vim ~/.bashrc

在文件的末尾添加以下行

export JAVA_HOME=/usr/java/jdk1.8.0_161
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$CLASSPATH

使环境配置生效

# source ~/.bashrc
测试 Java 环境
# java -version

  查看是否正常显示版本信息,若显示则安装成功

Tomcat 环境准备
下载 Tomcat

地址: http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz

# wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz
安装 Tomcat
# tar zxvf apache-tomcat-8.5.32.tar.gz
# mv apache-tomcat-8.5.32 /usr/local/
配置 Tomcat 环境
# vim ~/.bashrc

在文件的末尾添加以下行

export CATALINA_BASE=/usr/local/apache-tomcat-8.5.32
export TOMCAT_HOME=/usr/local/apache-tomcat-8.5.32
export CATALINA_HOME=/usr/local/apache-tomcat-8.5.32
export PATH=$PATH:$CATALINA_HOME/bin:$CATALINA_HOME/lib

使环境配置生效

# source ~/.bashrc
启动 Tomcat 服务
# startup.sh

测试 Tomcat

打开浏览器,在地址栏中输入 http://IP:8080 回车,如果看到 Tomcat 自带的一个 JSP 页面,说明你的 Tomcat 已搭建成功

安装部署

下载 war 文件

# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

安装 Jenkins

将下载后的 war 包放到 /usr/local/apache-tomcat-8.5.32/webapps/ 目录下,启动 tomcat 即可, 或者用命令 java -jar jenkins.war

测试

打开浏览器输入 http://IP:8080/jenkins 回车即可看到 jenkin 初始配置界面,按照提示进行设置。

常用设置

邮件设置

Jenkins-> 系统管理 -> 系统设置,弹出如下图所示:

  • SMTP 服务器:为邮箱服务地址。
    • QQ: smtp.qq.com
    • 163: smtp.163.com
  • 用户默认后缀:可以自动识别,只需填写用户即可。
  • 其他配置为 Jenkins 邮箱默认用户及采用的认证方式。
Job 设置

在需要邮件通知的 Job 设置里面增加” 构建后操作步骤” -> 选择 E-mail Notification。

扩展插件设置

但是如果你群发的收件人列表比较多,或者每次通知的人不一样,比如每次只想通知导致构建失败的那个人(即最后一次上传代码的人),那么简单的 E-mail Notification 就不能满足要求,需要使用 Email extension plugin 插件。

  • SMTP server – 设置 SMTP 服务器地址

  • Default user E-mail suffix – 设置用户默认邮件后缀

  • Default Content Type – 默认内容类型 (Plain Text HTML)

  • Default Subject – 默认邮件主题

  • Default Content – 默认邮件内容,可以设置模板

  • Default Triggers – 触发器

  • 全局配置
    根据实际情况勾选需要触发邮件通知的事件。点击上图右下角 Default Trigger,弹出如下触发项:

  • 项目配置
    进入到具体的项目配置界面点击” 配置,在配置界面点击” 增加构建后操作步骤”,选择”Editable Email Notification”。

可以在 “Advanced Settings” 中针对该项目进行个性化的配置。可以针对该项目定义该项目通知的收件人列表、主题、内容、附件等。

任务创建

构建项目类型

点击 Jenkins 首页” 创建一个新任务” 的链接,弹出如下图所示页面。

Jenkins 提供了六种类型的任务。

  • 构建一个自由风格的软件项目
    这是 Jenkins 的主要功能。Jenkins 会结合任何 SCM 和任何构建系统来构建你的项目,甚至可以构建软件以外的系统。

  • Pipeline (流水线)
    Orchestrates long-running activities that can span multiple build slaves. Suitable for building pipelines (formerly known as workflows) and/or organizing complex activities that do not easily fit in free-style job type. – 很难用一两句话说清 Pipeline, 参考,后面另起一文来介绍。

  • 构建一个多配置项目
    适用于多配置项目,例如多环境测试、平台指定构建,等等。

  • GitHub Organization
    Scans a GitHub organization (or user account) for all repositories matching some defined markers. – 这个主要针对由 Github 托管的项目。

  • Multibranch Pipeline (多分支流水线)
    Creates a set of Pipeline projects according to detected branches in one SCM repository. 根据一个 SCM 存储库中检测到的分支创建一组 Pipeline 项目。

  • 文件夹
    创建一个可以嵌套存储的容器。利用它可以进行分组。 视图仅仅是一个过滤器,而文件夹则是一个独立的命名空间, 因此你可以有多个相同名称的的内容,只要它们在不同的文件 夹里即可。

这里选择第一个:构建一个自由风格的软件项目, 输入项目名称:python test project ,点击” 确定” 按钮。

构建 Windows 测试任务

假设,有一个 Python 编写的测试脚本 py_tests.py ,其绝对路径为 /root/py_tests.py,内容如下:

print "Hello world"

在 Linux 下怎么执行这个测试用例,打开终端

[root@centos-7 ~]# cd
[root@centos-7 ~]# ll py_tests.py
-rw-r--r--. 1 root root 20 8月  16 16:07 py_tests.py
[root@centos-7 ~]# python py_tests.py
Hello world
[root@centos-7 ~]#

下面回到 Jenkins 的配置过程中

添加项目的描述:Python 测试项目,打印 Hello world。

剩下的选项都不要管,拖到页面底部,构建 选项。

选择执行shell 选项,执行 Linux shell 命令。

如上图,输入你在 Linux 终端下所输的命令 python /root/py_tests.py。 点击保存

一个极简的,基于 Linux 系统的 Python 脚本测试持续集成项目就创建完成了。

节点添加

Jenkins 有个很强大的功能:分布式构建 (在 Jenkins 的配置中叫做节点),分布式构建能够让同一套代码在不同的环境 (如:Windows 和 Linux 系统) 中编译、测试等。而且 Jenkins 构建的代码和产物最后自动拷贝到主节点。

注意:如果节点主机上不存在 JDK,Jenkins 会去自动下载。

建议:所有 Unix 或者 Windows 机器的环境路径统一 (如:JDK、Ant、Maven),好处是便于管理、不容易出现奇葩问题。

新建节点

系统管理 → 管理节点 → 新建节点 (左上角),如下图所示:

  节点名称:建议使用字母、数字或字母和数字的组合。最好见名知意。不建议使用标点符号和中文 (中文命名没有问题,但 Job 中无法引用)。

配置节点
  • Name (名称):节点名称
  • Description (描述):节点描述,支持中文
  • 并发构建数:最大同时构建数量 (根据机器的性能定,单颗四核 cpu 建议不要超过 5) - 必须为数字
  • 远程工作目录:节点的根目录 (注意:如果目录不存在,会自动创建目录。你必须对该目录有读写权限,不然会报错)
  • 标签:标记 (又叫做标签) 用来对多节点分组,标记之间用空格分隔。例如’refression java6’将会把一个节点标记上’regression’和’java6’.

例来说,如果你有多个 Linux 系统的构建节点并且你的 Job 也需要在 Linux 系统上运行,那么你可以配置所有的 Linux 系统节点都标记为’windows’, 然后把 Job 也标记为’Linux’. 这样的话你的 Job 就不会运行在除了 Linux 节点以外的其它节点之上了.
Linux 用法:尽可能的使用这个节点 / 只允许运行绑定到这台机器的 Job (根据你的需求,二选一)

  • 启动方式:
    • Linux 节点:推荐 – Launch slave agents via SSH, 在 Unix (包括 Linux) 机器上通过 SSH 通道连接节点 (适用于 Unix 和 Linux)
    • Host (主机):节点主机的 ip 地址
    • Credentials:凭据 (如果为空或者不可选择,请在系统管理→Manage Credentials 中配置。Manage Credentials 的配置非常简单,这里就不在描述了。Manage Credentials 配置完成后,需刷新节点配置页面才会显示。)

节点连接

以 Launch slave agents via SSH 为例,选择 Manually trusted key Verification Strategy,然后点击最下面的保存。

Jenkins -> 系统管理 -> 系统设置,设置 SSH Server

  • Name: 这个可以随意写
  • Hostname: 远程主机的 IP 地址
  • Username: 远程主机登录的用户名
  • Remote Directory: 远程目录

如图设置好信息后,点击下面的保存

Jenkins -> 系统管理 -> 管理节点,点击刚刚配置好的节点,上线节点

回到节点列表后发现节点就已经成功上线了

角色权限

由于 jenkins 默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,本文将使用 Role Strategy Plugin,介绍页面:https://wiki.jenkins-ci.org/display/JENKINS/Role+Strategy+Plugin。

配置插件

安装插件后,进入系统设置页面,配置如下:

配置权限

在系统管理页面点击 Manage and Assign Roles 进入角色管理页面

进入之后

  • 管理角色(Manage Roles)
    选择该项可以创建全局角色、项目角色,并可以为角色分配权限。

; 如上图,分别创建了 admin、anonymous 两个全局角色,Online Program、test 两个项目角色。

  项目角色与全局角色的区别就是,项目角色只能管理项目,没有管理 jenkins 的权限配置。

  添加项目角色时,需要指定匹配项目的模式,如上图中的 Pattern,官方文档介绍该选项支持正则表达式,如”Roger-.” 表示所有以 Roger - 开头的项目,(?i)roger-.* 表示以 roger - 开头的项目并且不区分大小写,如以 ABC 开头的项目可以配置为”ABC|ABC.*”,也可以使用”abc|bcd|efg” 直接匹配多个项目。

  • 创建用户
    在分配角色之前需要先创建用户。
    在系统管理页面,点击管理用户:

  点击新建使用者可以创建新用户,点击用户 ID 或名称都可以修改用户信息。

  选择 Assign Roles 可以为用户分配所属角色,可以分配全局角色和项目角色。

  如上图,将不同的用户分别分配给不同的角色,这样用户就可以具有角色所拥有的权限。

运行与维护

Jenkins 升级

  • 说明:Jenkins 迭代更新很频繁,一般 1 周更新一次,半年一个大版本。
  • 升级:下载新的 war 包,替换旧的 war 包,重启即可。下载地址为 http://mirrors.jenkins-ci.org/。

PS:升级前,请测试该版本和你本地数据的兼容性。如何测试:将 JENKINS_HOME 拷贝一份到新的机器,用新版的程序启动。测试对应的插件和配置。

Jenkins 迁移和备份

首先找到 JENKINS_HOME,一般在用户根目录下.jenkins 目录,因为 Jenkins 的所有的数据都是以文件的形式存放在 JENKINS_HOME 目录中。所以不管是迁移还是备份,只需要操作 JENKINS_HOME 就行了。

  • 迁移:建议将 JENKINS_HOME 打包后再拷贝,Windows 上可以用 zip,rar 等,Linux 上有 zip,tar 等。然后将打包的文件解压到新的 JENKINS_HOME 目录就行了。

  • 备份:如果是临时备份,整个压缩文件就行了。

  • 恢复:恢复的时候需要先停止 jenkins。

移动,删除或修改 jobs

对于移动或删除 jobs,只需要简单地移动或删除 $JENKINS_HOME/jobs 目录。
对于修改 jobs 的名字,只需要简单地修改 $JENKINS_HOME/jobs 下对应 job 的文件夹的名字。
对于不经常使用的 job,只需要对 $JENKINS_HOME/jobs 下对应的 jobs 的目录 zip 或 tar 后存储到其他的地方。

Jenkins 启动时的命令行参数

--httpPort=$HTTP_PORT 用来设置 jenkins 运行时的 web 端口。
--httpsPort=$HTTP_PORT 表示使用 https 协议。
~~~~–httpListenAddress=$HTTP_HOST 用来指定 jenkins 监听的 ip 范围,默认为所有的 ip 都可以访问此 jenkins server。

修改 jenkins 的 timezone

如果 jenkins 所在的 server 的 timezone 不同于用户的 timezone,这时候需要修改 jenkins 的 timezone,需要在 jenkins 启动的时候增加下列参数 - Dorg.apache.commons.jelly.tags.fmt.timeZone=TZ。

查看 jenkins 的系统信息

以在 jenkins 的管理页面下的系统信息中,查看所有的 jenkins 的信息,例如 jenkins 的启动配置,所依赖的系统的环境变量,所安装的 plugins。

Jenkins 中执行 batch 和 Python

Jenkins 的 job -> build 支持 Ant,maven,windows batch 和 Shell, 但是我们知道 python,perl,ruby 等脚本其实也是 shell 脚本,所以这里的 Shell 可以扩展为 python,perl,ruby 等。如图

Jenkins 整合 LDAP 以及 CAS 单点登录

参考另外一篇博客
Jenkins 整合 LDAP 以及 CAS 单点登录