楔子

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

那么为什么要有 Jenkins 呢?首先我们来回顾一下以前的常规开发流程是怎么样的。

jenkins使用docker jenkins使用场景_jenkins使用docker

来了一个项目之后先进行需求分析,然后进行设计,设计完了之后编写代码,开发完毕之后再测试,测试通过最后部署。

整个流程看似没有问题,但是这只适用于功能明确、并且需求变化不大的场景。但是对现在的开发而言,功能往往是不明确的、而且需求经常变,因此传统的开发流程已经不适用了,现在提倡敏捷开发。而敏捷开发并不追求前期完美的设计、完美的编码,而是力求在很短的周期内开发出产品的核心功能,尽早发布出可用的版本,然后在后续的生产周期内,按照新需求不断迭代升级,完善产品。

说白了敏捷开发就是直接撸起袖子就开始干,然后遇见 bug 再重新改。因此这意味着会频繁地合并代码到主分支,而这一步就是持续集成(Continuous Integration,CI)。我们经常说 CI、CD,其中 CI 就是持续集成,指的就是频繁地(一天多次)将代码集成(合并)到主分支,而持续集成有两个好处:

  • 1. 快速发现错误:每完成一点更新,就集成到主分支,可以快速发现错误,定位错误也比较容易
  • 2. 防止分支大幅度偏离主分支:如果不是经常集成,主分支又在不断更新,会导致以后集成的难度变大,甚至难以集成

持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主分支之前,必须通过自动化测试,只要有一个测试用例失败,就不能集成。

所以持续集成不单单是将代码集成到主分支,还有构建、测试,只有测试通过了,才能集成到主分支,而这几步都是自动完成的。

Martin Fowler(提出敏捷开发概念的美国大叔)曾说过:" 持续集成并不能消除 bug,而是让它们非常容易发现和改正 "。

Jenkins 就是一个专门用来做持续集成的工具,可能有人觉得使用 Git 就行,虽然理论上确实如此。但是光有 Git 的话,明显没有使用专门的集成工具来的方便, 当然像 Jenkins 这种专业的 CI 工具也是需要搭配版本控制工具(Git)使用的。

持续交付、持续部署

CI 我们说完了,下面再说一下 CD,CD 指的是持续交付(Continuous Delivery)和持续部署(Continuous Deployment)。

持续交付指的是:频繁地将软件的新版本交付给质量团队或者客户,以供评审。如果评审通过,就部署到生产环境中,持续交付可以看做是持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。

持续部署可以看做是持续交付的下一步,指的是代码通过评审之后,自动部署到生产环境。持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。持续部署和持续交互的区别就是,前者是代码评审通过之后自动部署到生产环境,后者是手动部署。

jenkins使用docker jenkins使用场景_有趣的杂七杂八_02

当然我们这里的主角是 Jenkins,下面就来安装它。

安装 Jenkins

Jenkins 使用 Java 语言编写,所以我们首先要安装 Java,安装过程比较简单这里就不细说了。

jenkins使用docker jenkins使用场景_jenkins使用docker_03

然后安装 Jenkins,但是不建议去官网下载,速度会很慢,这里推荐一个清华镜像:

https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable

进入该地址之后选择相应版本的 Jenkins 即可,当然显示的都是针对 CentOS 系统。如果你是别的系统,那么就把网址结尾的 redhat-stable 去掉,然后进去选择合适的系统,这里我就以 CentOS 为例,下载地是 jenkins-2.289.2-1.1.noarch.rpm。然后直接安装:

[root@satori ~]# rpm -ivh jenkins-2.289.2-1.1.noarch.rpm

安装之后我们需要修改 Jenkins 的配置文件 /etc/sysconfig/jenkins,我们先来介绍一下里面的配置项。

  • JENKINS_HOME="/var/lib/jenkins":Jenkins 工作文件的存储目录
  • JENKINS_JAVA_CMD="":Java 可执行文件路径,默认查找 /usr/bin/java
  • JENKINS_USER="jenkins":Jenkins 启动时使用的用户,这里我们修改成 root,不然可能会有权限问题
  • JENKINS_PORT="8080":Jenkins 监听的端口,8080 太常见了,建议改成别的,这里我们改成 8008
  • JENKINS_LISTEN_ADDRESS="":Jenkins 监听的 IP,默认是 0.0.0.0,任何机器都可以访问
  • JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true":JVM 相关参数,一般不需要关心

还有几个配置项,不过不是很常用,了解一下即可。

  • JENKINS_HTTPS_PORT="":Jenkins 监听的端口(默认被禁用),针对 HTTPS 协议
  • JENKINS_HTTPS_LISTEN_ADDRESS="":Jenkins 监听的 IP(默认被禁用),针对 HTTPS 协议
  • JENKINS_HTTPS_KEYSTORE="":SSL 密钥文件的路径
  • JENKINS_HTTPS_KEYSTORE_PASSWORD="":SSL 密钥文件的密码
  • JENKINS_HTTP2_PORT="":Jenkins 监听的端口(默认被禁用),针对 HTTP2 协议
  • JENKINS_DEBUG_LEVEL="5":日志的调试级别,值越高,日志记录越详细
  • JENKINS_ENABLE_ACCESS_LOG="no":是否启用访问日志记录
  • JENKINS_HTTP2_LISTEN_ADDRESS="":Jenkins 监听的 IP(默认被禁用),针对 HTTP2 协议
  • JENKINS_HANDLER_MAX="100":Jenkins 服务的最大工作线程数量
  • JENKINS_HANDLER_IDLE="20":空闲工作线程的最大数量
  • JENKINS_EXTRA_LIB_FOLDER="":用于添加到 Jetty 类加载器的 Jar 包的所在目录
  • JENKINS_ARGS="":像 Jenkins 传递的其它参数

所以大部分配置都是不需要改的,只需要改三个:

# 指定 Java 可执行文件路径,因为默认是 /usr/bin/java,所以需要根据你当前 Java 安装路径进行修改
JENKINS_JAVA_CMD=/opt/jdk1.8.0_221/bin/java 
# 避免权限问题,如果不改的话,后面会无法启动,因为权限不足
JENKINS_USER="root" 
# 避免端口冲突,其实也可以不改,如果确定此端口不会冲突的话
JENKINS_PORT="8008"
  • 启动 Jenkins:systemctl start jenkins
  • 关闭 Jenkins:systemctl stop jenkins
  • 重启 Jenkins:systemctl restart jenkins

jenkins使用docker jenkins使用场景_jenkins使用docker_04

由于 Jenkins 是 Java 语言编写,可以输入 jps 查看 Java 启动的进程,如果出现 jenkins.war,则说明启动成功了。然后我们通过 http://ip:8008 进行查看,注意要保证端口是开放的,我这里使用的是阿里云服务器,8008 是对外开放的。

jenkins使用docker jenkins使用场景_Jenkins_05

然后会提示你解锁 Jenkins,按照提示将密码输入进去、点击继续即可。再接下来会提示你安装插件:

jenkins使用docker jenkins使用场景_重启_06

Jenkins 本身的功能是非常简单的,能做的事情比较有限,而我们日常工作所需要的功能基本上都是通过插件来完成的。这里可以点击 "安装推荐的插件",会自动将 Jenkins 推荐的插件下载下来并安装,但由于会从 Jenkins 官网上去下载,整个过程非常的慢,因此我们点击 "选择插件来安装"。

jenkins使用docker jenkins使用场景_Jenkins_07

点击 "选择插件来安装" 的话,可以自己选择要安装的插件,注意:该过程仍然是从官网上下载,因此这里我们点击上面的 "无",点击之后会将方框里面的对钩全部去掉,也就是不选择安装的插件。后续我们可以替换插件的下载地址,再进行安装。

然后点击安装,会提示你创建第一个管理员用户,按照提示随便创建一个,然后点击保存并完成即可。

点击之后会提示如下该页面:

jenkins使用docker jenkins使用场景_jenkins使用docker_08

47.94.174.89 是我服务器的公网 IP,8008 就是我们设置的端口,这里不用管,还是点击 "保存并完成" 即可。然后会提示 Jenkins 已经安装完成,我们点击 "开始使用 Jenkins"。

jenkins使用docker jenkins使用场景_重启_09

会进入到如下页面,显然此时已经可以开始正常使用了,不过在介绍使用方法之前,我们先来把插件安装上。我们说 Jenkins 本身功能很简单,但是可以通过插件来使 Jenkins 变得强大,只不过 Jenkins 默认是从官网下载,会很慢,因此我们需要将下载地址改成国内的地址。

修改 /var/lib/jenkins/updates/default.json,第一个键值对就是 "connectionCheckUrl": "http://www.google.com/",Jenkins 在下载插件之前会先检查网络连接,相当于先 ping 一下 connectionCheckUrl。显然对于国内而言,谷歌是 ping 不通的,我们需要改成 https://www.baidu.com/ 。

然后我们还要将 https://updates.jenkins.io/download 改成 http://mirrors.tuna.tsinghua.edu.cn/jenkins ,由于改的不止一处,所以使用 sed 命令进行替换即可。

sed -i s/原字符串/新字符串/g 文件名,这样即可实现全局替换,由于 url 中本身包含 /,所以需要使用 \ 进行转义。

[root@satori updates]# sed -i "s/http:\/\/www.google.com/https:\/\/www.baidu.com/g" default.json
[root@satori updates]# sed -i "s/https:\/\/updates.jenkins.io\/download/http:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g" default.json

别急,还没结束,我们还要进入到刚才的 Jenkins web 界面,点击 Manage Jenkins,然后点击 Manage Plugins。

jenkins使用docker jenkins使用场景_jenkins使用docker_10

得到如下界面,然后点击 Advanced,将页面拖到底部。

jenkins使用docker jenkins使用场景_Jenkins_11

https://updates.jenkins.io/update-center.json 换成 http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json ,然后点击 submit 即可。

重启让配置生效,我们可以通过 systemctl restart jenkins 进行重启,也可以通过 http://ip:8008/restart 进行重启,重启之后配置就生效了。

然后我们再来安装插件,还是点击 Manage Jenkins,然后点击 Manage Plugins,再点击 Available。

jenkins使用docker jenkins使用场景_jenkins使用docker_12

这些都是可用插件,可以不管三七二十一直接全部安装,也可以安装指定的插件,下面推荐几个建议(必须)安装的插件。

Localization: Chinese (Simplified),汉化插件,安装之后界面会变成中文。

SSH Credentials,可以在 Jenkins 里面存储 SSH 凭证,以及用户名、密码。这个插件是非常有必要的,因为我们要从仓库拖代码、将代码上传到仓库等等,这些是需要配置免密码登录的。

SSH,可以使用 SSH 协议远程执行命令。

Git,将 Git 集成到 Jenkins,这个无需多言。

jenkins使用docker jenkins使用场景_Jenkins_13

然后点击 Install without restart,安装完毕之后进行重启:

jenkins使用docker jenkins使用场景_Jenkins_14

重启可以通过 systemctl 和 http://ip:8008/restart 进行重启,也可以点击图中的小方框,重启之后我们再来看看界面:

jenkins使用docker jenkins使用场景_有趣的杂七杂八_15

发现大部分都变成了中文,有一部分还没有完全汉化,但是关键部分已经变成中文了。

使用 Jenkins 构建项目

进入界面,点击新建任务,然后输入任务名称(随便起一个):

jenkins使用docker jenkins使用场景_持续集成_16

输入任务名称之后还没法点击确定,我们需要点一下 "构建一个自由风格的软件项目",然后再点击确定。

此时我们就可以构建任务了,如果你不小心把当前的配置界面关闭了,那么可以再点击 Dashboard,然后就会显示创建的任务:

jenkins使用docker jenkins使用场景_重启_17

点击 task-test,之后再点击配置,之前的配置界面就又出来了。

jenkins使用docker jenkins使用场景_有趣的杂七杂八_18

由于我们是往 Git 中拖代码,所以要配置仓库地址以及用户名密码。点击系统管理,然后点击 Manage Credentials,出现如下界面:

jenkins使用docker jenkins使用场景_重启_19

然后再点击左侧的添加凭据,添加有三种方式,这里我们通过用户名密码的方式:

jenkins使用docker jenkins使用场景_Jenkins_20

未完待续,暂时不想写了。