教程 · 2020年12月6日 0

利用 Jenkins 自动化构建系统实现 Spring Boot 推送代码自动部署

内容纲要

[lwptoc]

前言

在我们团队开发一个项目时,通常会把代码部署到线上以便于大家测试,但是在版本控制中每次推送完代码,需要我们在线上的服务器手动更新代码构建并运行,这样就会降低效率。因此在软件工程中,有个叫做“持续集成”的概念,目的是减少重复工作,避免版本冲突等。
持续集成的条件是版本控制系统(GIT、SVN等)、自动构建系统(cmake、maven、gradle等)、自动测试系统、定时构建和自动部署。有了这些工具,可以让开发的精力集中在编写代码中,而不用关系各种其他的问题。
Jenkins 是一款开源持续集成(CI)软件,用于自动化各种任务,包括构建、测试和部署软件。这里以安装和搭建 Spring Boot 持续集成系统为例,简单介绍 Jenkins 的使用。

环境及版本

  • 操作系统 – Ubuntu 20.04.1 LTS (如果需要与别人合作则需要公网可以访问到)
  • Git – 2.25.1
  • Java – OpenJDK 11.0.9.1
  • Jenkins – 2.263.1 LTS
  • Maven – 3.6.3 (可选)

安装 Jenkins

下载运行

打开 Linux 的终端控制台。
首先,下载 Jenkins 的 war 包,它既可以作为可执行程序运行,也可以部署到 Servlet 容器中。这里为了方便就不部署了直接作为可执行程序运行。

wget -O "jenkins.war" http://mirrors.jenkins.io/war-stable/2.263.1/jenkins.war
java -jar jenkins.war

稍等片刻,会显示如下的运行日志:
Jenkins密码
其中 2ecd0f863d744c49a57fa5c681d34033 便是 Jenkins 的安装密码,亦可以打开图中提示的 /home/gardel/.jenkins/secrets/initialAdminPassword 查看,我们需要记录以下以便下一步用,如果第一次运行的时候忘记记录这些信息也不要紧,请看下一步。

运行安装步骤

现在我们需要打开一个浏览器,输入服务器的地址,默认端口为 8080 (如果要修改请在启动时加参数 java -jar jenkins.war --httpPort=9090)。打开后输入上一步的密码进入安装,如果没有密码可以按找网页上的提示查看密码。在安装界面点击安装社区推荐的插件,等待安装完毕。安装完毕后会要求创建管理员账号,输入一个安全又便于记忆的,下一步是输入 Jenkins 的安装地址,一般能自动识别。

安装流程走完就会进到这个界面(Jenkins 工作台),如果右上角有红色的叹号最好去解决以下(另查资料即可这里不做重点)。

Jenkins初始界面

创建 Jenkins 任务

在 Jenkins 工作台左侧栏点击新建Item(New Item),输入名称,选择 Freestyle project 并确定,进入详细配置界面。
描述即任务的介绍,支持 markdown,勾选“Github 项目”并输入项目的 Web Url(不是克隆地址,是在浏览器查看的地址)。
配置1
然后翻到源码管理,选择 Git(没有的话检查 Git 插件),输入克隆地址并添加私钥。

按照图示添加私钥并选中。
配置2
配置3

转到构建触发器,如果是使用 Github,勾选 “GitHub hook trigger for GITScm polling”,如果是其他 Git 系统,请参照下一节。
转到构建,添加一个 Maven(需要先安装 Maven) 或者 Gradle 构建步骤。(视自己使用的构建工具二选一)
Maven构建
上图的 skipTests=true 为跳过测试,一般不会跳过测试除非你在本地测试过了。
Gradle构建

为了使我们的项目构建完成后能自动运行,我们需要再添加一个“Execute shell”构建步骤,编写运行脚本如下:

files=$(echo $(pwd)/target/*.jar) # Maven 构建使用这行
#files=$(echo $(pwd)/build/libs/*.jar) # Gradle 构建使用这行
installPath=/usr/local/myapp/boot.jar # 安装路径

# 此处假设你已经安装好了服务并可以通过命令启动。
# 我这里使用 Linux 的 systemd 管理 Spring Boot 程序,
# 你需要更改成自己的停止/启动命令,
# 如果使用 Tomcat 并开了热部署则直接替换文件即可
cat ~/.sudo_password | sudo -S systemctl stop boot.service; # 停止服务,自行更改

cp $files $installPath; # 替换新文件,如果不是同一台机器,可以用 scp、ssh 之类的工具
chmod +x $installPath; # 赋予执行权限

###### 重载服务,自行更改
cat ~/.sudo_password | sudo -S systemctl daemon-reload;
cat ~/.sudo_password | sudo -S systemctl start boot.service;
######
exit 0

好了,这样任务就配置成功了,记得点保存。

创建 Git 项目

这里以 Github、Gitee 和本地 Git 服务为例说明 WebHooks 的配置,以达到每次推送代码触发构建的目的。

在开始之前,我们需要参考这里让 Spring Boot 可以使用 servicesystemctl 命令启动/停止,如果你的 Spring Boot 程序是部署在 Servlet 容器中的则可以跳过这一步。

按照文档,我们只需要在构建脚本(maven 为 pom.xml,gradle 为 build.gradle)中修改如下配置即可。

<!-- Maven 配置 -->

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>
// Gradle 配置
bootJar {
    launchScript()
}

生成 jar 后先安装一下:

sudo ln -s $(pwd)/target/boot.jar /etc/init.d/boot # 安装
sudo service boot start # 运行

Github 配置

首先进入 Github 项目的设置中,找到 Webhooks 设置。
Webhooks设置
点击新建一个 Webhook。
新建Webhook

按照如下图填写 Webhook 配置,Paylod URL 默认为你的 Jenkins 安装地址+”/github-webhook/”(需要公网能访问到)。
填写WebHook地址
填写好后点击绿色按钮保存,我这里之前填了所以是更新。

Gitee 配置

与 Github 大同小异,安装一个插件即可,参见官方文档

本地 Git 服务配置

如果你们的项目 Git 远程仓库在本机或者局域网中,则需要按照下面的方式配置。

Jenkins 支持使用脚本远程触发构建,而 Git 原生也支持 git hooks,这样只要设置一个 Git 的服务端 hook 来触发 Jenkins 的构建即可。

按照 Git 文档 所说,在提交后触发操作需要使用 post-update 脚本。

打开 Jenkins 的构建任务配置界面,转到构建触发器,勾选远程触发构建。令牌填写一个唯一的值。
脚本远程触发构建

进入远程仓库的 .git/hooks 目录,创建 post-update 文件,填写如下内容:

#!/bin/sh
exec curl "https://你的Jenkins地址/job/任务名称/build?token=上一步填写的令牌" # 任务名称可以在管理界面地址栏找到

至此,自动化部署 Spring Boot 就完成了,现在可以推送代码测试以下了。

当然,Jenkins 的功能不止这些,还有其他的功能待大家自己去探索。