Jenkins 是一个用 Java 编写的开源的持续集成(CI)工具,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。它运行在 Servlet 容器中(例如 Apache Tomcat)。它支持软件配置管理(SCM)工具(包括 AccuRev SCM、CVS、Subversion、Git、Perforce、Clearcase 和 RTC),可以执行基于 Apache Ant 和 Apache Maven 的项目,以及任意的 Shell 脚本和 Windows 批处理命令。
1、持续集成介绍
持续集成(CI)倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证,包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。
持续集成的核心价值:
- 1、持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量
- 2、持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。换言之,任何时间点都能第一时间发现软件的集成问题,使任意时间发布可部署的软件成为了可能
- 3、持续集成还能利于软件本身的发展趋势,这点在需求不明确或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同时建立团队对开发产品的信心
持续集成的原则:
- 1、需要版本控制软件保障团队成员提交的代码不会导致集成失败。常用的版本控制软件有 Git、CVS、Subversion 等
- 2、开发人员必须及时向版本控制库中提交代码,也必须经常性地从版本控制库中更新代码到本地
- 3、需要有专门的集成服务器来执行集成构建。根据项目的具体实际,集成构建可以被软件的修改来直接触发,也可以定时启动,如每半个小时构建一次
- 4、必须保证构建的成功。如果构建失败,修复构建过程中的错误是优先级最高的工作。一旦修复,需要手动启动一次构建
持续集成系统的组成:
- 1、一个自动构建过程,包括自动编译、分发、部署和测试等
- 2、一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库
- 3、一个持续集成服务器,这里以
Jenkins
为例
2、Jenkins 部署
Jenkins
是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins
能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。
Jenkins
的部署十分简单,有三种方式。
2.1、Jar方式
首先,在 Jenkins Download 下载 Generic Java package (.war) 。
然后,运行 war 。
1 | java -jar jenkins.war --httpPort=8080 |
2.2、Tomcat容器方式
将下载的 war 包放入 tomcat webapps 目录下,或者直接替换掉 webapps 下的 ROOT 文件。
1 | unzip jenkins.war -d /path/tomcat/webapps/ROOT |
详细可参考 Jenkins wiki。
2.3、Docker方式
前提条件是已经安装了 Docker
。
1 | # 安装 jenkins |
注意:
- 1、Jenkins 启动,需要指定
JENKINS_HOME
,默认指定到${user.home}/.jenkins
。也可以自己配置JENKINS_HOME
环境变量进行更改- 2、基于
Jar方式
的部署,默认会将war
解压到${JENKINS_HOME}/war
目录下- 3、基于
Tomcat方式
的部署,可能会出现页面标签解析出错的问题(表现为 “系统配置” 页面没有 “保存” 按钮等现象)。根据官方的说法,这种现象很随机,可以先按照 issues 尝试修复,如果无法修复,建议采用Jar方式
部署- 4、基于
Docker方式
的部署,需要注意用户账号的问题,这里container
实例默认是以jenkins
用户运行,但是,Docker
本身是以root
用户的docker
组身份运行的,所以,在部署服务器上,需要将jenkins
用户加到docker
组,同时,在slave
节点需要创建一个jenkins
用户和用户组,用来与master
进行免密钥操作
3、Jenkins 配置
Jenkins
成功启动后,在浏览器输入http://yourhost:port/
,进入 Jenkins
。
首先,是解锁界面,需要输入 admin
用户的密码,该密码在首次启动时会在控制台或日志中打印出来,也可以在 ${JENKINS_HOME}/secrets/initialAdminPassword
中找到。
成功登录后,进入插件安装。这里的网络连接可能被墙,需要翻墙,否则无法安装插件。如果网络无法安装插件,可以事先在阿里云上按量申请一台低配的 ECS (这里的网络可以安装插件),用来临时安装 Jenkins
,在该服务器将所需插件都安装完成后,将 ${JENKINS_HOME}/plugins
目录下的 .jpi
文件拷贝下来,放到真实部署环境目录下即可。
然后,配置一个管理员帐号,用来替换 admin
。
最后,进入 Jenkins
的用户界面。
3.1、插件
Jenkins
的主要功能都是通过插件来完成的,所以,安装适用的插件,是使用 Jenkins
必备的条件。
在 “系统管理” -> “插件管理” 中,可以进行插件的安装、卸载等操作。
除了推荐安装的插件外,一般还需要的插件有:
插件名称 | 说明 |
---|---|
Maven Integration plugin | maven插件 |
Local plugin | 本地化插件 |
Blue Ocean | Blue Ocean插件。如果安装的是 Blue Ocean 版本 jenkins ,就不需要安装该插件 |
Publish Over SSH | 远程发布插件 |
SSH SSH | 远程执行shell命令插件。安装 Publish Over SSH 时,会自动依赖安装,如果没有安装,可以单独安装 |
其它插件,可以根据需要进行安装。
由于网络原因,在安装插件时,会出现连接超时的异常。这时,可以将 “升级站点” 的 URL 修改成网络较好的地址(配置在 “插件管理” 中的 “高级” 页面下)。
将 “https://updates.jenkins.io/update-center.json” 改成 “http://mirror.esuni.jp/jenkins/updates/update-center.json” 。
站点的网络状况可以参考这里。
3.2、节点说明
一般,一个服务需要部署在多台服务器上,为了便于理解,对服务器部署进行举例说明:
域名 | IP | 作用 |
---|---|---|
master | 192.168.1.1 | 部署 jenkins 、 maven 服务 |
slave01 | 192.168.1.2 | 业务部署服务器 |
slave02 | 192.168.1.3 | 业务部署服务器 |
scm | 192.168.1.4 | git 服务器 |
3.3、Credentials
master
向 slave
分发部署时,需要证书。证书的方式可以是:用户名 + 密码、也可以是免密钥登录等。
前提:
master
与所有slave
实现了免密钥登录。
下面以免密钥登录为例,配置 master
与所有 slave
的密钥信息:
注意:
Username
为免密钥的登录用户名ID
值是自动生成的,不用填写
3.4、节点管理
在 “系统管理” 下的 “节点管理” ,可以对所有 slave
节点进行配置。
- 名称: 为
slave
服务器的名称 - 描述: 对服务器的描述
- 并发构建数: 允许该服务器同时并发的任务数
- 远程工作目录:
slave
允许master
操作的工作目录 - 标签:
slave
服务器的标签 - 用法: 根据情况选择
- 启动方式:
slave
挂载到master
的方法,一种是在master
执行命令,一种是SSH
到slave
执行命令。这里选择第二种:Launch slave agents via SSH。不同的选择,对应不同的配置。这二种选择,“主机” 为slave
的IP
或域名,Credentials
选择配置的证书 - 可用性: 根据情况选择
所有 slave
以此类推配置。
3.5、系统设置
这里是全局的系统配置,根据需要选择性配置即可。
3.6、全局工具配置
这里是软件工具的环境配置。如:Java、Maven、Git、Gradle、Docker等,用到的就需要配置。
一般来讲,如果在系统环境变量中,已经将软件命令配置到PATH
中,可以不用再配置。但是,执行任务时,偶尔会出现命令找不到的问题,所以,建议都配置一下。
完成以上配置,就可以开始做持续集成工作了。
参考: