写在前面

在前面我们已经学会了如何通过使用Maven插件或者Dockerfile的方式,来将SpringBoot应用构建为Docker镜像并运行。当我们的应用数量较多时,还可以使用Docker Compose的方式,但是毫无疑问上面的种种还都只是手动部署,本篇来学习如何使用Jenkins和Gitlab来实现一键打包部署SpringBoot应用。

GitLab

GitLab简介

GitLab是一款开源的基于Git的版本仓库管理工具,开发者可以使用它来搭建属于自己的Git仓库。

GitLab安装

第一步,下载GitLab的docker镜像:

1
docker pull gitlab/gitlab-ce

第二步,创建对应目录:

1
2
3
mkdir -p /mydata/gitlab/config
mkdir -p /mydata/gitlab/logs
mkdir -p /mydata/gitlab/data

第三步,启动GitLab服务:

1
2
3
4
5
6
7
docker run -p 10443:443 -p 1080:80 -p 1022:22 \
--name gitlab \
--restart always \
-v /mydata/gitlab/config:/etc/gitlab \
-v /mydata/gitlab/logs:/var/log/gitlab \
-v /mydata/gitlab/data:/var/opt/gitlab \
-d gitlab/gitlab-ce:latest

第四步,开启防火墙:
由于Gitlab运行在1080端口,因此我们需要开放该端口,注意不能直接关闭防火墙,否则Gitlab会无法启动:

1
2
3
4
5
6
# 开启1080端口
firewall-cmd --zone=public --add-port=1080/tcp --permanent
# 重启防火墙才能生效
systemctl restart firewalld
# 查看已经开放的端口
firewall-cmd --list-ports

第五步,打开浏览器,访问http://宿主机IP:1080链接,查看GitLab是否已经正常启动。请注意,由于GitLab启动比较慢,需要耐心等待10分钟左右,如果GitLab没有启动完成就访问,会出现502的错误。

开发者可以使用docker logs gitlab -f命令来动态查看容器启动日志,进而确定Gitlab是否已经启动完成。

之后访问http://宿主机IP:1080链接,可以看到GitLab已经正常启动:

可以使用如下命令来查看root用户的密码:

1
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password

然后使用root用户加上上面得到的密码进行登录,注意root用户和kenbings用户的密码均为kenbings:

GitLab使用

创建组织

首先创建一个组织,然后在这个组织下分别创建用户和项目,这样同组织的用户就可以使用该组织下的项目:

创建项目

Git

Git下载

点击 这里 进行下载,然后一路Next进行安装。

Git使用

下载代码到本地
1
git clone http或者git地址
提交代码

进入一个名为hello的项目目录,修改README.md并提交:

1
2
3
4
5
6
# 进入项目工程目录
cd hello/
# 将当前修改的文件添加到暂存区
git add .
# 提交代码
git commit -m "init commit"
推送到远程仓库
1
git push
拉取远程仓库代码
1
git pull
本地创建并提交分支
1
2
3
4
# 切换并从当前分支创建一个dev分支
git checkout -b dev
# 将新创建的dev分支推送到远程仓库
git push origin dev
其他一些常用命令
1
2
3
4
5
6
7
8
# 切换到dev分支
git checkout dev
# 查看本地仓库文件状况
git status
# 查看本地所有分支
git branch
# 查看提交记录
git log

Jenkins

Jenkins简介

Jenkins是开源CI&CD软件的领导者,提供超过1000个插件来支持构建、部署、自动化,满足任何项目的需要,开发者可以用Jenkins来构建和部署自己的项目。举个例子,可以从自定义的代码仓库中获取代码,然后将代码打包成可执行的文件,之后通过远程的ssh工具执行脚本,最终实现运行项目这一目的。

Jenkins安装

第一步,下载Jenkins的docker镜像:

1
docker pull jenkins/jenkins:latest-jdk8

第二步,创建对应目录:

1
mkdir -p /mydata/jenkins_home

第三步,启动Jenkins服务:

1
2
3
4
docker run -p 8080:8080 -p 50000:5000 --name jenkins \
-u root \
-v /mydata/jenkins_home:/var/jenkins_home \
-d jenkins/jenkins:latest-jdk8

Jenkins配置

Jenkins服务启动后,然后访问http://宿主机IP:8080链接,页面出现如下:

之后使用如下命令从启动日志中获取到管理员密码:

1
docker logs jenkins

接着进行登录:

然后选择安装插件方式,这里我们直接安装推荐的插件:

接着就进入插件安装界面,联网等待插件安装:

安装完成后,接下来我们创建一个管理员账号,账户和密码均为admin:

之后进行实例配置,配置Jenkins的访问URL:

接着点击“Manage Jenkins”–》“Manage Plugins”:

确保以下插件被正确安装:
(1)根据角色管理权限的插件:Role-based Authorization Strategy;
(2)配置远程服务器:Publish Over SSH。

接下来新增maven的安装配置,点击“Manage Jenkins”–》“Global Tool Configuration”:

然后新增凭据,点击“Manage Jenkins”–》“Global Tool Configuration”,接着按照图片所示进行操作(注意里面配置的是通过ssh连接到宿主机的用户名和密码):

接着在点击“Manage Jenkins”–》“Configure System”,中添加全局ssh的配置,这样Jenkins使用ssh就可以执行远程linux的脚本:

Jenkins角色权限管理

开发者可以使用Jenkins的角色管理插件,来管理Jenkins的用户。举个例子,开发者可以给管理员赋予所有权限,给运维人员赋予执行任务的相关权限,而其他人员只赋予查看权限。

点击“Manage Jenkins”–》“Configure Global Security”,然后在里面启用基于角色的权限管理:

然后我们点击“Manage Jenkins”–》“Manage and Assign Roles”,然后在里面开始配置基于角色的权限管理:

点击“Manage Roles”,添加角色与权限关系:

点击“Assign Roles”,给用户分配角色:

打包部署SpringBoot应用

复制一个Module

开发者可以复制一份shop-swagger-ui源码,将其名字修改为shop-jenkins,然后对应包和文件中的信息也记得修改,本篇后续所有操作均在shop-jenkins这一Module中进行。

将代码上传到GItlab中

修改POM文件中build标签中的内容为如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>myshop-all/${project.artifactId}:${project.version}</imageName>
<dockerHost>http://192.168.51.160:2375</dockerHost>
<baseImage>openjdk:8u102</baseImage>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]
</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>

注意此处需要将dockerHost地址修改为开发者自己的Docker镜像仓库地址。同时项目在容器中运行的端口需要与后续启动脚本中的端口保持一致,这里为8088端口。

然后依次执行如下命令:

1
2
3
4
5
6
7
cd /shop-jenkins
git init
git add .
git commit -m "init project"
git remote add origin http://192.168.51.160:1080/myshop/shop-gitlab-jenkins.git
git branch -M main
git push -uf origin main

注意如果在推送代码的过程中出现如下问题:

主要原因是因为向一个受保护的分支强制提交了代码,可以在仓库里面进行设置来解决这个问题:

定义一个执行脚本

/mydata/sh目录下定义一个名为shop-jenkins.sh的脚本,其中的内容如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env bash
app_name='shop-jenkins'
docker stop ${app_name}
echo '-----stop container-----'
docekr rm ${app_name}
echo '-----rm container-----'
docker run -p 8088:8088 --name ${app_name} \
--link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/${app_name}/logs:/var/logs \
-d myshop-all/${app_name}:0.0.1-SNAPSHOT
echo '----start container----'

注意里面的映射的端口信息,接着给该脚本赋予可执行权限:

1
chmod +x shop-jenkins.sh

如果开发者是在Windows系统下创建的sh脚本,那么放到Linux系统上时需要修改文件的格式:

1
2
3
4
5
6
7
8
#使用vim编辑器来修改
vi shop-jenkins.sh
# 查看文件格式,windows上传上来的默认为dos
:set ff
#修改文件格式为unix
:set ff=unix
#保存并退出
:wq

然后我们创建对应的目录:

1
mkdir -p /mydata/app/shop-jenkins

在Jenkins中创建执行任务

第一步,新建一个任务:

第二步,设置任务名称后选择构建一个自由风格的软件项目:

第三步,点击源码管理,然后在里面添加仓库地址:http://192.168.51.160:1080/myshop/shop-gitlab-jenkins

此时显示连接不通,我们需要添加一个凭据,也就是Git仓库的账号和密码:

填写完该凭据后就选择它,此时就可以正常连接到Git仓库:

第四步,添加一个构建用于调用顶层maven模板,该构建主要用于将源码打包为Docker镜像并上传至Docker镜像仓库中:

然后选择maven版本并设置maven命令以及指定pom文件的位置:

接着设置需要执行的shell的命令,即

1
/mydata/sh/shop-jenkins.sh

之后点击保存操作,这样任务就创建完成了。

第五步,在任务列表中可以点击运行来执行该任务:

可通过点击左侧的构建历史序号,然后选择控制台输出即可看到整个任务的执行过程:

第六步,接着我们开放8088端口:

1
2
firewall-cmd --zone=public --add-port=8088/tcp --permanent
firewall-cmd --reload

第七步,打开浏览器,访问http://宿主机IP:8088/swagger-ui.html连接,查看shop-jenkins服务是否已经正常启动:

接着我们测试一下“获取所有的品牌信息”的接口,可以看到数据是可以正常返回的:

这样我们就完成了使用Jenkins+Gitlab一键打包部署SpringBoot应用,并运行项目这一功能。