使用 Jenkins 持续集成你的项目

我所理解的持续集成,其实很简单 这就是一个自动化,只不过这个自动化不单单是一个脚本 而是一个基于平台支持的 高扩展 自定义强 能满足项目的各种需求。

我们为什么要考虑持续集成?

在传统的软件开发中,一般是这样的操作

上面的图涵盖了从开发到交付上线的一个过程,这里最重要的是在本地完成功能之后 如何最有效的第一时间交付进行测试?

来举个例子:

  • 编译项目

    mvn package -DskipTests
    
  • 上传到服务器

    scp target/xxx.jar root@xxx:/usr/local/server
    

    不排除使用 GUI 操作

  • 重启服务器

    sh start.sh restart
    

上面的步骤每一步看起来都很简单,但是执行的步骤多了 每一次都需要手动操作 这并不简单 而且很繁琐,那么有没有办法解决呢?

脚本小子

能考虑自动话的事,坚决不手动执行 花再多的时间去编写也值。

把上面的几个步骤放在一个 upload.sh 文件中,

mvn package -DskipTests
mv target/*.jar target/xxx.jar
scp target/xxx.jar root@xxx:/usr/local/server

由于 scp 命令没办法写在 shell 脚本中完成上传(需要手动输入账号密码) 我们可以通过 sshpass 完成。

那么我在每一次开发完毕功能之后,只需要执行一下脚本就能够完成这些事情

sh upload.sh

这种始终是理想主义者的想法,但实际上会出现很多的问题,由于需要给服务器上传编译好的二进制文件,这个体积可能是项目文件的几倍,而且这种操作是无记录的,比如某个版本导致了部署错误 没办法快速回滚/定位解决问题。

如果这个时候项目存在多个节点,我需要叫你重新发布一个版本 手动操作是最浪费时间的 想想都觉得恐怖。

如果有一个工具能解决上诉的问题,至少能自动 checkout 编译、重启。

而这就是持续集成的过程,利用好持续集成会为团队节省很多的时间。

什么是持续集成(CI)

基本的概念在上面已经说过了,如果还要继续细化深入 可以分为下面几个步骤

持续交付

我觉得应该叫持续测试才对,这一步是项目通过多次的合并和测试 最终推向一个可部署到正式服务器的一个过程。

持续部署

持续交付的下一步, 代码通过审批之后 自动部署到生产环境中。

持续集成通常能够支持所有项目 不局限于 web。

Jenkins 集成 Springboot 项目

Jenkins 是 Hudson 的前身,基于 Java 语言开发的开源项目。

Jenkins 安装方式

创建项目

创建项目

在这里选择 maven 项目,如果你没有这个选项 ,进入 jenkins 的插件中心安装 Maven Integration plugin

配置参数

  • 源码管理
    源码管理

管理源代码,也就是设置仓库,如果是私有仓库,在 Credentials 后面点击 Add 配置用户名和密码,而下面的 Branch Specifier (blank for 'any') 这一栏就是设置 jenkins 拉取的主分支

  • 构建环境
    构建环境

这一步是选择 pom.xml 文件,和打包时的参数 我这里是先 clean 在进行编译 并且跳过测试。

在构建完毕之后,找到 Post Steps 选项,这里是构建完毕之后的操作 我们添加一个事件,自定义执行 Shell

Post Steps

  • 自定义 Shell
    自定义 shell

这里是最灵活的一步 ,因为你可以编写各种 shell 脚本来满足你的需求 ,不过在这里有一个坑
jenkins 默认 shell 是不支持程序后台运行的 比如下面这一行代码:

nohup java -jar *.jar --spring.profiles.active=master &

jenkins 提供了另外一种方式让程序后台执行

BUILD_ID=DONTKILLME nohup java -jar *.jar --spring.profiles.active=master &

附上完整的 shell 脚本

#!/bin/sh
if [ $(lsof -t -i:${port}) ]; then
  echo 'stop'
  kill -9 $(lsof -t -i:${port})
fi   

echo 'start project'

cd target
BUILD_ID=dontKillMe nohup java -jar *.jar --spring.profiles.active=master &

自定义参数

因为 springboot 默认没有提供程序关闭的方式,我们只能通过端口号找到程序的进程进行 kill,所以我把这里的端口号设置成了一个自定义参数

在这里配置自定义参数

自定义参数

使用方式:${port}

开始构建

在各项参数配置完毕之后,我们就可以直接点击构建了

开始构建

由于之前配置了自定义的参数,所以会出现这一栏

开始构建

接着点击开始构建,

构建历史

在左边这一栏 我们能够看到构建的历史记录 这就是之前说的可记录,我们可以点击某一个构建记录 查看构建日志

查看构建日志

构建日志

这里就是我之前设置的 echo start project 命令, 能看到构建已经成功了

最后

接下来就可以直接访问你的项目。

尽管 jenkins 有缺点,但是凭借着丰富的插件中心 依然是一款出色的持续集成工具 ,最近美团也在搞一个叫做 Hyperloop 的持续集成工具 ,目的是为了取代他们正在使用的 jenkins ,不过现在还没有开源。