一、系统环境
以下环境皆为必要系统环境;以下环境版本皆为我测试机的环境,实际操作不一定要如此高的版本
- Ubuntu 20.04LTS
- Java 8
- Maven 3.6.3
- Docker 19.03.13
- Jenkins 2.249.3
- git 2.25.1
二、创建一个简单的 Spring Boot 项目
1、创建项目
使用 IDEA 等创建一个简单的 Spring Boot 项目,注意下面标红的几个点
然后创建一个类Hello0Controller
,添加如下代码
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(String str){
return "hello "+str;
}
}
此时,运行这个项目,访问http://localhost:port/hello?str=world
以得到一串字符串hello world
。以此来测试项目是否创建成功,是否运行成功
2、打包项目
在 项目根目录处运行指令mvn package
,对这个项目进行打包,正常情况下,项目会生成 target 文件夹,文件夹下的xxx-0.0.1-SNAPSHOT.jar
即为打包生成的可执行 jar 包(xxx为项目的artifactId
)
为了测试打包的 jar 包是否正确,我们可以使用指令执行该 jar 包,然后进行访问查看效果。执行指令如下
cd targer/
java -jar xxx-0.0.1-SNAPSHOT.jar
访问http://localhost:port/hello?str=world
以得到一串字符串hello world
。以此来测试项目是否创建成功,是否运行成功
3、将该项目上传到 GitHub
省略……
三、使用 Jenkins 自动部署 Spring Boot 项目
我们先不使用 Docker,直接用 Jenkins 部署这个 SpringBoot 项目
先来统计一下,我们用到的指令如下
git clone https://github.com/xxx.git
cd xxx
mvn package
cd target
java -jar xxx-0.0.1-SNAPSHOT.jar
如果我们自己在服务器终端,直接运行以上几个指令即可在服务器运行起我们的 SpringBoot 项目。Jenkins 其实也只是将这些指令集成一下,做到一键即可部署
1、安装、运行 Jenkins
建议直接看文档进行安装:Jenkins官网
安装完后运行时安装插件选择推荐插件即可,遇到的大部分 Jenkins 问题都可自行搜索解决
2、配置环境
访问服务器运行的 Jenkins 主页,选择Manage Jenkins -> Global Tool Configuration
,进入到全局环境变量配置,将需要配置的环境(Java、Maven、Git)填入即可
3、在 Jenkins 上新建项目
访问服务器运行的 Jenkins 主页,选择“新建Item(New Item)”
然后输入该项目名称,并选择“流水线”后,点击确定新建项目
4、编写自定义流水线
点击确定按钮以后,跳转到配置页面,在配置页面,我们只用关心流水线脚本,其余配置若感兴趣可自行查阅其作用
对于 pipeline 语法可以浏览官网进行学习,本篇文章所使用的都是简单的指令。本篇文章的脚本如下(注意根据自己的项目进行修改)
pipeline {
agent any
stages {
stage('使用git下载代码') {
steps {
// echo 可以用来做简单的输出
echo 'git from github...'
// 使用pipeline的git指令进行下载,如果分支是master,也可以使用 git 'https://github.com/xxx.git'
git url: 'https://github.com/xxx.git', branch: 'main'
}
}
stage('使用Maven构建') {
steps {
echo "maven build start..."
// 使用sh指令linux执行,Windows的话,可以使用bat
sh "mvn -Dmaven.test.skip=true clean package"
}
}
stage('运行项目') {
steps {
echo "Spring boot start..."
sh "java -jar target/xxx-0.0.1-SNAPSHOT.jar"
}
}
}
}
5、一键构建
进入到项目页面,点击按钮"Build Now"即可构建
下面是构建完成的截图
注意这里由于我们的指令问题,是不会构建完成,而是卡在运行项目这里,点击左下角#12
左边的圆圈按钮即可查看输出信息
到此,Jenkins 配合 Spring Boot 实现自动化部署已经完成,每次上传完代码以后直接点击"Build Now"按钮即可重新部署。但是,目前运行项目这个步骤一直无法完成,这个问题有两个解决办法:
nohup java -jar xxx.jar &
指令,但是如果使用这个指令需要用单引号包住这个指令且 jar 文件需要是绝对路径,感兴趣可以尝试一下四、配合 Docker
为了解决上述问题,我们引入 Docker。引入 Docker 不光是为了解决上面那个问题,容器化已经是大势所趋,具体使用 Docker 有哪些好处可以自行搜索
1、Docker 将 Spring Boot 项目打包成镜像
Docker 对 Spring Boot 项目打包的方式有很多种,这里我参考官方推荐的一种,参考网址:spring.io/guides/gs/s…
新建 Dockerfile
在项目根目录新建一个名为 Dockerfile 的文件,注意没有后缀名,其内容如下
FROM java:8
VOLUME /tmp
COPY target/xxx-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明
Dockerfile指令|菜鸟教程
在本地构建镜像(测试用,可跳过)
如果你本地有 Docker 环境的话,可以在本地进行构建镜像
在项目根目录运行指令docker build -t spring-demo .
即可
运行该镜像的话,只用执行指令docker run -d -p 8080:8080 spring-demo
即可,8080:8080
指本地端口8080(第一个)映射到容器端口8080(第二个)
2、将 Dockerfile 上传到 GitHub
省略….
3、修改 pipeline 脚本
修改后的脚本如下
pipeline {
agent any
stages {
stage('停止旧容器') {
steps {
echo "stop if project is running..."
sh 'docker ps -f name=spring-demo -q | xargs --no-run-if-empty docker container stop'
sh 'docker ps -a -f name=spring-demo -q | xargs --no-run-if-empty docker container rm'
}
}
stage('使用git下载代码') {
steps {
// echo 可以用来做简单的输出
echo 'git from github...'
// 使用pipeline的git指令进行下载,如果分支是master,也可以使用 git 'https://github.com/xxx.git'
git url: 'https://github.com/xxx.git', branch: 'main'
}
}
stage('使用Maven构建') {
steps {
echo "maven build start..."
// 使用sh指令linux执行,Windows的话,可以使用bat
sh "mvn -Dmaven.test.skip=true clean package"
}
}
stage('Docker构建') {
steps {
echo "docker build start..."
sh "docker build -t spring-demo ."
}
}
stage('Docker运行') {
steps {
echo "docker image start..."
sh "docker run -d -p 8080:8080 --name spring-demo spring-demo"
}
}
}
}
5、一键构建
先将没有集成 Docker 的那个构建停止,然后重新点击"Build Now"即可
小结
以上,Jenkins + Docker + SpringBoot
的自动部署就实现完成了,我的项目代码地址:github.com/pangyuworld… 仅供参考