Jenkins Introduction

Jenkins是一款开源的跨平台的可扩展的持续集成(Continuous Integration)工具。作为目前使用最广泛,用户量最大的CI工具,无论是在GUI操作上,插件生态系统管理,稳定性、可靠性、功能性以及扩展性等方面都表现得较为出色,而且简单易学,入门上手快,当然Jenkins的优势还有很多,之前的项目上都一直在使用Jenkins,对于大多项目来说是完全满足条件的。这里以Jenkins 2.x为例演示如何安装、配置和使用Jenkins。
下图摘自官网,展示了持续交付场景下应用示例一般流程。

Jenkins Installation

Jenkins由Java编写的开源产品,支持跨平台,安装也非常方便,可以到Jenkins官网下载需要的版本并安装。

以下大致列举出几种常用的安装和使用方式,在安装之前请确保已经安装了Java运行环境。

War包安装方式

可以直接下载自带Jetty的*.war包并运行,非常方便,比较推荐使用,Jenkins默认会运行在8080端口。

1
2
curl -O http://ftp.tsukuba.wide.ad.jp/software/jenkins/war-stable/2.7.1/jenkins.war
java -jar jenkins.war

也可以下载最新版本的jenkins.war

Docker镜像方式

可以直接下载Docker镜像来使用,无需进行安装,但需要有docker环境。

1
2
docker pull jenkinsci/jenkins
docker run -p 8080:8080 -p 50000:50000 -v /your/home:/var/jenkins_home jenkins

其中/your/home需要替换为你的主机路径,用于保存Jenkins的Workspace数据,更多细节可以参阅GitHub jenkinsci

Ansible安装方式

另外,还可以通过Ansible自动化脚本安装,在另一篇博客Ansible实践篇中也有涉及。首先需要下载jenkins role到本地,假设下载到了/usr/local/etc/ansible/roles/目录下。

1
ansible-galaxy install geerlingguy.jenkins

然后编写playbook来实现自动化批量安装,假设创建一个playbook名为setup_jenkins.yml,其中ci-serverinventory文件中的Group或Host。

1
2
3
4
5
6
---
- hosts: ci-server
become_method: sudo
become: yes
roles:
- /usr/local/etc/ansible/roles/geerlingguy.jenkins

最后运行命令执行安装,稍等片刻后可访问主机的8080端口:

1
ansible-playbook -i inventory setup_jenkins.yml

如果需要设置Java版本可以在安装之前修改geerlingguy.java中默认的java_packages。更多说明可以参见ansible-role-jenkinsansible-role-java

除了上述安装方式外,也可根据具体的操作系统进行安装,以下给出常用的操作系统下的安装方式。

在RedHat/CentOS中安装

通常有两种安装方式:1. 添加Package Repository后使用yum进行安装和升级;2. 直接下载*.rpm进行安装。

方式一:添加Package仓库安装

1
2
3
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import http://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins

方式二:下载*.rpm进行安装
目前最新版本是2.7.1-1.1.noarch,若需要指定安装版本,可到http://pkg.jenkins-ci.org/redhat-stable/查看并下载安装。

1
2
curl -O http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.7.1-1.1.noarch.rpm
sudo rpm -ivh jenkins-2.7.1-1.1.noarch.rpm

在Ubuntu/Debian中安装

通常也有两种安装方式:1. 添加Debian Package Repository进行安装和升级;2. 通过直接下载*.deb进行安装。

方式一:添加Package仓库安装

1
2
3
4
wget -q -O - http://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
deb http://pkg.jenkins.io/debian-stable binary/
sudo apt-get update
sudo apt-get install jenkins

方式二:下载*.deb进行安装
目前最新版本是2.7.1_all,也可以到http://pkg.jenkins-ci.org/debian-stable/查看并下载指定版本。

1
2
curl -O http://pkg.jenkins-ci.org/debian-stable/binary/jenkins_2.7.1_all.deb
sudo dpkg -i jenkins_2.7.1_all.deb

在Mac或Windows下安装

对于Mac OS和Windows,直接下载对应安装包根据提示安装即可:Mac OS安装包Windows安装包

Jenkins Setup

当安装完Jenkins 2.x后,访问http://localhost:8080默认会进入到登录页面。输入默认用户名admin和密码admin

登录成功后,Jenkins首先会提示安装推荐插件或自选插件,直接点击Install suggested plugins安装默认推荐的插件即可,当然随后也可以在Plugin管理中再选择安装需要的插件。

等待常用的一些插件安装完成后就可以开始创建自己的Job了。

Jenkins Jobs

Jenkins Job是很重要的概念,定义了在什么样的情况下执行什么样的任务,以及执行后的操作。

创建一个Job

首先来创建一个Jenkins的Job,点击create new jobsNew Item来创建一个Job。

然后在Enter an item name下输入Job的名称,比如:“melon-build”,并选择Freestyle project,最后点击OK保存。

Source Code Management 源代码管理

可以指定下载源代码的仓库路径,目前Git是最为流行的VCS,指定Repositories URL,这里以GitHub托管的项目为例,拉取的Branch为*/master。这里的项目仓库为公开仓库,因此直接用HTTP方式即可,如果是私有项目需要添加授权信息。另外特别注意,需要确保Server安装了Git,否则在pull代码时会因找不到命令而失败。

Build Triggers 构建触发器

构建触发条件Jenkins提供了多种方式,根据项目需要可以设置不同的触发方式,通常采用Poll SCM方式,通过设置Schedule来控制触发条件,Schedule采用的是基于Cron语法,但Jenkins对其进行了略微调整,比如设置H/5 * * * *表示每5分钟检查一次代码仓库是否有新的code changes,如果有就pull并执行tasks。可以通过点击问号按钮来获得更多帮助信息,或参考Cron WikiCronTrigger Tutorial

Build 构建和任务

假设项目构建工具采用的是目前相对比较流行的开源自动化构建工具Gradle,选择Use Gradle Wrapper,添加项目执行的Tasks即可,图中示例最终将执行gradlew clean build操作。需要注意的是,如果build依赖特定版本的运行环境,请确保在build机器上安装了对应版本的运行环境,如Java 8等。

当然,除了Gradle外还可以选择Maven、Ant等方式。当然,如果有一些复杂的自动化工作也可以选择Shell脚本完成,根据项目需要定义。

Post-build Actions 构建后置行为

Post-build Actions定义了在完成当前Job的Build任务后接下来需要执行的一系列操作的关系。比如设置在正常完成Build后,进一步获取测试报告和Artifacts,发送Email通知,或触发后续Downstream的一个或多个Jobs,以及部署应用到服务器等。Post-build actions有很多种类型和触发条件,通过下拉列表可以选择,如下图:

其中Build other projects表示将自动触发后续Job,Build other projects(manual step)表示定义了后续Job,但需要手动点击按钮触发,通常针对部署到High Environments的Job。另外还有一个Trigger parameterized build on other projects选项定义了同时触发后续的多个Jobs,比如在build完成后同时触发Integration Test、Acceptance Test以及Sonar等。Jenkins也提供了Deployment相关的插件,总之,Jenkins的插件生态系统管理得很好,需要的功能都可以通过Plugins实现。

下图中定义melon-build完成后会同时触发执行integration-testacceptance-testsonar,执行顺序的关系可以被配置在Pipeline View中以可视化的方式展现出来,稍候会在Pipeline View中提及。另外,还可以在Build Trigger->Add Parameters中选择参数传递策略。

至此,针对第一个melon-build的Job设置完成,可以点击SaveApply保存了,默认会保存在/var/lib/jenkins/jobs/路径下。

Custom Workspace 自定义工作区

另外,如果当前Job要重用已经有的Workspace代码,可以选择Tab页General->Advanced->Use custom workspace,然后填写Directory,比如填写为jobs/melon-build/workspace/

GeneralTab下有很多可选项,如果需要传入特定参数可以勾选This project is parameterized并配置相应参数,这在配置Post-build Actions->Trigger parameterized build on other projects时会很有用。另外,根据项目情况也可以勾选更多的选项,比如:

  • Execute concurrent builds if necessary
  • Restrict where this project can be run
  • Block build when upstream project is building
  • Block build when downstream project is building

Test Report 测试报告

另外,针对测试报告,若基于Jacoco,可直接选择Record JaCoCo coverage report,当build完成后可自动生成报告。也可以尝试配置Publish JUnit test result report中的Test report XMLs

Deployment 部署

部署有多种方式,可以通过Build中执行部署脚本,或者在Post-build actions中选择相应的Step,比如针对War包部署可以选择Deploy war/ear to a container

Jenkins View

Jenkins提供了多种视图,如Pipeline View、List View、My View等,目的是为了更好地归类和展示所关注的信息,通常会创建Pipeline View来增强Pipeline可视化效果。首先在Jenkins主页点击Dashboad标题栏最右边的+号,然后输入View Name并选择Build Pipeline View

然后配置Pipeline View,特别注意需要在Layout中选择Initial Job,并且该Job已经配置好Downstream Jobs,然后设定显示的Builds数量和刷新频率等。

配置完成后保存,可以到刚创建的View中查看,可以根据项目需要定义Pipeline Flow,正确配置Job的执行顺序和依赖关系即可。
直接Build情况的Pipeline View示例(仅供参考):

存在参数化情况的Pipeline View示例(仅供参考):

通常会用颜色来表示Job的状态:绿色代表Pass,黄色代表Building或Unstable,蓝色代表N/A未操作,红色代表Fail。如果需要查看某次Build的Log,可以点击Build编号(或在Build History查看)查看左边栏中的Console Output

除此之外,还可通过安装插件实现Monitor View,这样可以通过TV显示出当前Build的状态了:

Manage Jenkins 管理

Jenkins Plugins 插件管理

Jenkins的插件生态系统管理得很好,通常需要在Workspace中安装很多的插件来实现需要的功能。可以通过Manage Jenkins->Manage Plugins进入到插件管理页面,可以执行安装、升级、删除插件等操作,通常需要重启Jenkins服务来生效你的修改。

以下补充罗列一些常用的插件:

Manage Nodes 管理节点

Jenkins提供了集群的能力,允许加入多个Nodes,一台Master对应多个Nodes,Master通常负责Job的Schedule和资源协调,Node通常是执行Master发放的Job并返回结果,这种模型也称Master/Slave模型。
当项目的Build/Deploy较多时,可以并行地执行Job任务,减少等待时间,另外,还可以根据Job依赖的环境来指定对应操作系统和构建环境的节点机器。在Manage Jenkins->Manage Nodes页面可以管理节点,首先来创建一个节点New Node,填写相应的Remote root directoryLabels信息,这里Launch method选择SSH方式,指定Host和Credentials,当然也可以选择其他的登录授权方式。

特别注意:请确保master上的key可以访问指定的node,并且jenkins拥有使用该key的权限,以及jenkins用户能够对Remote root directory进行读写操作。

创建完成后可以启动并查看Node状态以及系统信息等:

若需指定某个Job在指定的节点上运行,请在Job配置中修改General->Restrict where this project can be run

Jenkins CLI 命令行模式

Jenkins提供了一个内置的命令行接口,允许通过一些脚本命令远程访问Jenkins功能,这对于自动化的任务和批量操作等非常有利。

首先需要下载jenkins-cli.jar,假设你的Jenkins地址是jenkins.xxx.net:8080,可以访问以下地址下载:

1
http://jenkins.xxx.com:8080/jnlpJars/jenkins-cli.jar

然后可以通过命令行查看帮助,命令为:

1
java -jar jenkins-cli.jar -s http://jenkins.xxx.net:8080/ help

当然也可以通过界面查看每个命令的使用帮助,在Manage Jenkins->Jenkins CLI页面查看到所有Available的命令。

如何需要了解更多,可以参考Jenkins CLI Wiki

其他配置管理

Jenkins除了对插件和节点进行管理,还有系统管理、安全管理、权限配置、命令行工具、用户管理等。在主页选择Manage Jenkins进入到Jenkins管理页面,可以选择相应的功能进行配置,每项功能进入后都会有相关的说明,相对也比较简单易懂,这里就不再一一列举了。另外,Jenkins的默认配置文件路径为/var/lib/jenkins/config.xml,修改文件后可重启生效,可通过访问/restart路径或者在Server上执行命令sudo service jenkins restart

Pipeline as Code

Jenkins 2.x推出了Jenkinsfile来实现将pipeline定义为代码形式目标,即Pipeline as Code,特别是在集群管理时提升了效率,但会存在一个缺点,问题在于这可能造成在GUI上进行了修改而未修改Jenkinsfile的不一致性,而且无法追踪到这样的修改,所以,如果没有特别的需求,请谨慎选择使用。有兴趣的同学可以研究一下,另外Jenkins CLI也可以尝试一下。

The End

总得来说,Jenkins在常规的项目中使用是不错的选择,强烈推荐使用。另外,后续有时间会写一些关于GoCD,Travis CI以及Concourse CI的简单使用教程,敬请期待。


References