在实际开发中,项目功能迭代、需求变更等都会进行项目的重新部署,而每次版本发布重复性的工作,在很大程度上浪费了我们的时间与精力,自动化运维应运而生。
Jenkins 概述与环境搭建
官网对 Jenkins 的介绍为:
The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project.
翻译过来意思就是:
开源自动化服务的领导者,依靠大量的插件完成项目的构建、推送并且可以自动化任何项目。
怎么样?是不是听起来就觉得挺牛逼的,事实是 Jenkins 真的做到了如其介绍一样。下面就让我带着大家一起来啃一啃 Jenkins。
安装 Jenkins
安装 Jenkins 常见的方式主要有两种,Docker 和 war 包的形式。两种方式各有千秋,我都演示一下如何操作使用。为小伙伴们在后续的工作中提供更多的选择。
通过 Docker 安装 Jenkins
通过 Docker 安装 Jenkins 只要求本机有 Docker 环境即可,服务迁移和安装也非常方便。我本次持续集成的 Jenkins 操作也是基于 Docker 搭建,还有一个就是后面的 Java、Python 服务等都是基于 Docker 运行,因此如果 Docker 基础差的同学,建议补充学习一些 Docker 基础知识将会更好的吸收本文的内容。
1. 拉取镜像
官方镜像拉取方式:
docker pull jenkins
由于官方拉取镜像速度一般较慢,我这里将官方的镜像拉取了一份放在我的阿里云镜像仓库,按需自取即可。
docker pull registry.cn-hangzhou.aliyuncs.com/moxinqian/official_jenkins
2. 运行容器
docker run --name jenkins -d --restart=always -v /home/jenkins_home:/var/jenkins_home -p50000:50000 -p8080:8080 -u 0 registry.cn-hangzhou.aliyuncs.com/moxinqian/official_jenkins
Jenkins 官方的 Docker 容器运行没有指定 -u
,这里的目的是将 Docker 容器以 root 用户运行,防止出现权限不足报错的情况。
容器启动成功后,访问主机域名 + 指定的端口,我这里用的是 8080 端口,出现如图所示的界面表示安装成功:
通过 war 包安装 Jenkins
通过 war 包安装的 Jenkins 有一个好处是可以用到 Jenkins 主机的运行环境。以 Java 项目为例,假设在你的项目中用到 JNI 调用本地 dll 库的操作,并且在打包 Jenkins 会执行相关的单元测试,那么就需要将 Jenkins 安装在 Windows 主机上,虽然 Docker 启动的 Jenkins 也能做到,但是还是比较折腾的。下面我们来具体看一下如何通过 war 包安装 Jenkins。
官网下载 war 包,如图所示:
下载 war 包后,命令 java -jar jenkins.war
即可启动。如果要后台运行则运行 nohup java -jar jenkin.war &
。除了这种运行方式外,也可以下载 Tomcat 容器将 war 包放到 Tomcat webapps 目录运行。
解锁 Jenkins
Jenkins 安装成功后,和大部分软件外,需要进行一个激活操作,这就是本节要讲的解锁 Jenkins。
首次登陆
首次登陆 Jenkins 用 token 方式登录,token 所在目录在启动后访问的前台界面和启动日志中都可以看到,Docker 方式启动可以通过命令 docker logs myjenkins
(容器名称根据自己的实际情况修改)查看或到对应挂载目录下查看。如图:
输入 token 后进入插件配置界面。
跳过首页插件安装
由于使用默认安装插件的方式速度很慢,而且大多数会下载失败,可以通过在 Jenkins 更换插件镜像方式解决,但是我觉得那个速度也快不来多少。因此我这里讲解另外一种实用的操作:跳过系统插件安装步骤,选择通过自定义上传方式安装。下面来看具体的操作流程。
解锁 Jenkins 后进入插件安装,在插件安装界面有两个推荐方案,即安装推荐插件和自定义选择插件安装,我们这一步需要跳过插件安装,所以选择后者,如图:
进入插件界面后选择无,然后点击下一步,如图:
跳过插件安装步骤后,进入到管理员配置界面,如图:
输入自己设置的账号和密码后即可完成 Jenkins 的基础配置,完成后进入 Jenkins 后台,如图所示:
注意这个时候 Jenkins 还不能用,因为插件还没有安装。正如 Jenkins 官网的介绍一样,需要大量的插件协作完成构建、发布等。
上传插件并安装
紧接着上一节,继续来讲解如何自定义安装插件。这一节我们先认识一下 Jenkins 为我们推荐的的插件有哪些,然后在根据实际需求下载对应的插件。
了解 Jenkins 推荐的插件
在前面插件安装页面,Jenkins 推荐了一些常用的共计 20 个插件,那么都有哪些呢?我给大家整理一下如下表所示,更多的插件小伙伴们感兴趣可以去官网查看链接。
插件名称 | 插件类型 | 插件描述信息 | |
---|---|---|---|
1 | Folders | 构建管理 | 这个插件允许用户创建“文件夹”来组织作业。用户可以定义自定义分类法(例如,按项目类型、组织类型)。文件夹是可嵌套的,您可以在文件夹中定义视图。 |
2 | OWASP Markup Formatter | 构建管理 | 使用OWASP Java HTML Sanitizer ,可以在项目描述等中输入安全的HTML标记。 |
3 | Build Timeout | 构建设置 | 在指定的时间没有构建完毕,自动终止构建。 |
4 | Credentials Binding | 构建设置 | 允许将凭证绑定到环境变量,以便从其他生成步骤使用。 |
6 | Timestamper | 构建设置 | 将时间戳添加到控制台输出 |
7 | Workspace Cleanup | 构建设置 | 工作区清理插件,此插件在构建完成后删除项目工作区。 |
8 | Ant | 打包构建工具 | 通过 Ant 打包源代码 |
9 | Gradle | 打包构建工具 | 通过 Gradle 打包源代码 |
10 | Pipeline | 管道 | 一套插件,可让您协调自动化,简单或复杂。有关详细信息,请参阅使用Jenkins的管道代码。 |
11 | GitHub Branch Source | 管道 | Github分支源代码插件管理工具,根据Github的用户或组织创建构建项目 |
12 | Pipeline: GitHub Groovy Libraries | 管道 | GitHub Groovy库,允许从GitHub动态加载Pipeline Grrovy库。 |
13 | Pipeline: Stage View | 管道 | 管道阶段视图插件 |
14 | Git | 源代码管理 | 在Jenkins中集成了源代码管理工具 |
15 | SSH Build Agents | 分布式构建 | 启动 ssh 代码,多台主机完成分布式构建 |
16 | Matrix Authorization Strategy | 用户和安全管理 | 提供基于矩阵的安全授权策略(全局和每个项目)。 |
17 | PAM Authentication | 用户和安全管理 | 向Jenkins添加Unix可插拔身份验证模块(PAM)支持 |
18 | LDAP | 用户和安全管理 | 向Jenkins添加LDAP身份验证 |
19 | Email Extension | 消息推送 | Jenkins 邮件通知的加强版,可以配置邮件模板等 |
20 | Mailer | 消息推送 | 通过邮件通知构建结果 |
下载和安装插件
了解了 Jenkins 的推荐插件后,紧接着我们来安装插件。
1. 下载插件
保证 Jenkins 能够运行,只需要部分插件即可,并非官方推荐的都要安装,上面的插件中只有一部分是我们需要安装的,Id 和上图对应,如下表所示:
插件名称 | 插件类型 | 插件描述信息 | |
---|---|---|---|
1 | Folders | 构建管理 | 这个插件允许用户创建“文件夹”来组织作业。用户可以定义自定义分类法(例如,按项目类型、组织类型)。文件夹是可嵌套的,您可以在文件夹中定义视图。详情 |
2 | OWASP Markup Formatter | 构建管理 | 使用OWASP Java HTML Sanitizer ,可以在项目描述等中输入安全的HTML标记。详情 |
3 | Build Timeout | 构建设置 | 在指定的时间没有构建完毕,自动终止构建。详情 |
4 | Credentials Binding | 构建设置 | 允许将凭证绑定到环境变量,以便从其他生成步骤使用。详情 |
6 | Timestamper | 构建设置 | 将时间戳添加到控制台输出。详情 |
7 | Workspace Cleanup | 构建设置 | 工作区清理插件,此插件在构建完成后删除项目工作区。详情 |
14 | Git | 源代码管理 | 在Jenkins中集成了源代码管理工具详情 |
17 | PAM Authentication | 用户和安全管理 | 向Jenkins添加Unix可插拔身份验证模块(PAM)支持详情 |
18 | LDAP | 用户和安全管理 | 向Jenkins添加LDAP身份验证详情 |
19 | Email Extension | 消息推送 | Jenkins 邮件通知的加强版,可以配置邮件模板等详情 |
上面的每个插件我都在描述后面附带了详情链接,直接点击跳转到对应的插件页面下载即可,同时可以获取更多关于该插件的详细信息。
例如我以第一个插件 Folders 为例,下载按钮如图所示:
点击该按钮后,跳转到对应的插件版本页面,如图所示:
建议是下载最新版本的,因为所有的插件都下载最新的,可以防止插件不兼容的问题。按照该操作,我们依次将上述推荐的插件下载。如图所示:
2. 安装插件
进入 Jenkins 后台,进入 Manage Jenkins 》 Manage Plugins 》 Advanced 》 Upload Plugin,依次上传前面我们下载的插件,如图所示:
这里我演示一个插件,后面的照着上即可,如图:
到这里 Jenkins 的基础插件就安装完毕了。
我在上传插件过程中,插件 Credentials Binding 上传报错,报错信息如下
提示我们 Trilead API Plugin 需要升级,我们去插件中心找到该插件,下载最新的插件安装即可(如果提示已安装则去已安装插件列表卸载后重新安装),如图:
如果在插件安装过程中,出现安装失败报错 IO 异常的情况,建议重启 Jenkins 再次上传,根据我个人经验而言,多试几次基本都能可以解决。
Jenkins 时区设置
Jenkins 默认使用的是 GMT 时间,与我们误差了 8 小时,设置时区方法 Manage Jenkins 》 Script Console,输入命令
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
如图:
Jenkins 重启
很多时候我们在安装了插件需要重启才能生效,我这里推荐一个非常简单的方式,就是访问 IP + 端口/restart,例如我的 IP 是 192.168.1.18,那么我访问 192.168.1.18:8080/restart 即可。
Java 项目发布常见搭配
在前面我们花了大量的篇幅介绍 Jenkins 及其环境配置,这一节我们正式开始使用 Jenkins。这里主要讲解的是 Java 的自动化构建,常见 Java 持续集成组合:Jenkins + Spring Boot + Maven + Git + Docker + 代码仓库(GitHub/Gitee 等)。
基于此我们需要准备如下内容:
- Spring Boot 项目一个并托管在代码管理仓库
- Maven 环境配置
- 目标服务器一台,这就是我们项目最终发布的服务器
下面我们就来依次准备上述环境。
前期准备工作
俗话说的好,工欲善其事必先利其器,在构建项目时前将项目所要用的环境都准备好好,后续步骤将会畅通无阻。
Spring Boot 项目准备
我这里为了演示为主,这个 Spring Boot 是一个很简单的测试项目,里面只包含了一个返回“hello world”接口,如图所示:
项目结构介绍:
Jenkins Maven 环境配置
SpringB oot 项目基于 Maven 构建,需要在 Jenkins 配置 Maven 环境。
1. Maven 插件安装
由于该项目是基于 Maven 构建的,Jenkins 需要下载 Maven 的 Jenkins 插件,插件地址,如图:
下载并安装该插件。安装成功的标志是在创建新的构建项目时会多一个 Maven 选项,如图所示:
2. Jenkins 配置 Maven
除了安装 Maven 插件外,还需要在 Jenkins 后台全局管理配置 Maven 路径。配置路径为 Maven Jenkins 》 Global Tool Configuration 》Maven。如图:
如果勾选 Insatll automaticallly
则会在构建时检查并自动下载。但是很多时候我们会在 maven 的 settings.xml 中自定义镜像私服地址或依赖包下载路径,且自动下载 maven 包速度很慢,因此我这里选择手动上传的方式安装。在 Jenkins Docker 启动时,映射了宿主 /home/Jenkins_home
镜像目录,因此只需将 maven 安装包下载并解压至该映射目录即可。
下面我们通过命令 docker exec -it myjenkins bash
进入 Jenkins 容器内部查看 Maven 的路径,如图所示:
在 Jenkins 配置该路径:
目标服务器
目标服务器是我们项目最终发布的服务器。
1. 服务器准备以及环境搭建
目标服务器需要满足如下三个条件:
- 目标服务器一定要保证 Jenkins 所在的服务器能够 ping 通。
- 为了方便演示我在本机再安装一台 Ubuntu 虚拟机当做目标服务器,同时要保证该服务器能够被 SSH 登录。(为这里目标服务器 IP:192.168.17)
- 由于最终部署的项目在该服务器上以 Docker 的形式运行,因此该目标服务还需要安装 Docker。
2. Jenkins 配置目标服务器
安装插件 publish-over-ssh 使 Jenkins 能够远程其他服务器,下载并安装后,进入目录 Manage Jenkins 》 Configure System 》Publish over SSH,配置目标服务器。如图:
点击 Add 添加服务器,如图:
配置中有一项参数是 Remote Directory,该参数的意思是,Jenkins 默认拷贝到目标服务器的文件会将该目录作为根目录,如果目标服务器没有该目录则需要手动议创建。配置完毕后,点击最下方的 Test Configuration 测试能够连接成功,如图:
记得点击 save 后保存。
构建架构概述
常见的有两种方式:
1. Jenkins 服务器完成构建任务,将构建产物发送到目标服务器,再由目标服务器 build Docker 镜像,并打包容器和启动服务。
- 优点:过程简单,不用再单独搭建 Docker 镜像中心。
- 缺点:每次的构建的镜像无法跟踪版本,目标服务器承担了太多任务。
2. 在 Jenkins 服务器生成 Docker 镜像,并将 Docker 镜像 Push 到镜像中心,目标服务器负拉取镜像并启动服务。
- 优点:每次的的镜像都有版本记录,方便进行镜像版本的回滚。
- 缺点:单独搭建镜像中心,增加运维的负担。
我这里采用的第一种方式,因为我这里采用 Docker 的方式安装的 Jenkins,Docker 容器内部再创建 Docker 镜像比较麻烦。第二种方式主要的问题在于搭建镜像中心,其实两者本质差别不大,第二种方式小伙们可以拿来作为练手。我的文章《Docker 快速入门与实战》对搭建镜像中心有详细教程。
开始构建项目
在前面我们已经将前期工作都准备好了,那么现在我们就正式开启项目的构建。
新建构建项目
点击 New Item 创建项目,如图:
自动化项目流水线设置
项目创建成功后,我们来到了构建设置的界面,我将该流水线做一个说明并演示本项目中是如何使用每个流水线步骤的。
General
构建的一些基础设置,如描述信息等。
Source Code Management
在这里配置我们的代码仓库地址并指定分支和添加访问凭证(就是访问该仓库的哦账号和密码),插件很良心,在你觉得任何有疑问的地方都可以点击旁边的问号获取更多帮助。如图所示: