win11下jenkins+docker+maven自动部署springboot项目
一、前置软件安装
- 需要开启wsl,以管理员身份运行docker desktop
- Jenkins需要Java运行环境,建议安装JDK 11或更高版本
- Jenkins的主目录默认会在C盘,可以修改到D盘
先停止jenkins服务,打开cmd执行
net stop jenkins
修改jenkins安装目录下的jenkins.xml文件
修改保存完之后,手动将C盘中的文件(.jenkins、jenkins.pid等)复制到新目录中
最后重启jenkins服务
net stop jenkins
- git
- maven
二、jenkins配置
- 安装插件
- Maven Integration plugin: Maven 集成管理插件。
- Docker plugin: Docker集成插件。
- GitLab Plugin: GitLab集成插件。
- Publish Over SSH:远程文件发布插件。
- SSH: 远程脚本执行插件。
- 配置工具
- maven
- jdk
- git
- maven安装
- docker
- 配置git sh.exe的位置,后面会需要执行sh命令,没配置会报错
- 提前创建凭据,主要用于后面拉取代码和远程连接
其中从github中拉取代码时可以使用https和ssh两种方式,验证方式也分两种
- https方式需要配置token
因为 GitHub 禁用了密码认证(自 2021 年 8 月 13 日起),需要使用 Token进行认证
生成 GitHub Token
1、 访问 GitHub → Settings → Developer Settings → Personal Access Tokens (Tokens Classic)
2 、点击 Generate new token (Classic)
3 、填写 Note(如 Git CLI Access)
4 、勾选 repo(至少需要 repo 权限)
5 、点击 Generate token,并复制 Token(只会显示一次,请保存好!
- ssh方式
需要生成公钥添加到github中,配置的时候填私钥
步骤 1:生成 SSH Key
bash
ssh-keygen -t ed25519 -C “your_email@example.com”
(按 Enter 默认选项,生成的密钥在 ~/.ssh/ 目录)
步骤 2:添加 SSH Key 到 GitHub
查看公钥:
bash
cat ~/.ssh/id_ed25519.pub
复制公钥内容,进入 GitHub → Settings → SSH and GPG keys → New SSH Key,粘贴并保存。
配置私钥后如果还是验证失败,在 Jenkins 全局配置中禁用严格主机检查(不推荐生产环境)
进入 Manage Jenkins > Security 找到 Git Host Key Verification Configuration,选择 Accept first connection(仅临时测试用)。
三、springboot项目准备
项目结构
pom文件使用dockerfile插件
<properties>
<java.version>8</java.version>
<docker.image>docker_repo</docker.image>
</properties>
<build>
<finalName>demo</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<configuration>
<!-- 指定docker镜像仓库名称 -->
<repository>${docker.image}/${project.artifactId}</repository>
<buildArgs>
<!-- Dockerfile中使用 ARG AR_FILE 指令引用变量 -->
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
多环境配置
Dockerfile放在根目录下
# 需要依赖的基础镜像
FROM openjdk:8-jdk
# 指定存储卷, 任何向/tmp写入的信息都不会记录到容器存储层
VOLUME /tmp
# 拷贝运行JAR包
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
# 设置JVM运行参数, 这里限定下内存大小,减少开销
ENV JAVA_OPTS="\
-server \
-Xms256m \
-Xmx512m \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=512m"
#空参数,方便创建容器时传参
ENV PARAMS=""
# 入口点, 执行JAVA运行命令
ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /app.jar $PARAMS"]
# 指定维护者的名字
MAINTAINER chen
将项目代码提交到github中
四、jenkins打包部署项目到本地docker中
- 构建任务
- 添加描述,可以勾选创建string类型的变量
- 配置git仓库地址,验证方式前面步骤已创建好,这里使用ssh方式拉取代码
- 增加构建步骤,maven打包
clean install -Dmaven.test.skip=true dockerfile:build -f pom.xml
-Dmaven.test.skip=true 跳过测试
dockerfile:build 启动dockerfile插件构建容器
-f pom.xml 指定需要构建的文件(必须是pom)
- 增加构建步骤,执行shell脚本
if [ -n "$(docker ps -a -f name=$JOB_NAME --format '{{.ID}}' )" ]
then
#删除之前的容器
docker rm -f $(docker ps -a -f name=$JOB_NAME --format '{{.ID}}' )
fi
# 清理镜像
docker image prune -f
# 启动docker服务
docker run -d -p 6688:6688 -e PARAMS="--spring.profiles.active=prod" --name $JOB_NAME $docker_image/$JOB_NAME
-p 端口映射
$JOB_NAME jenkins的内置变量,任务名
$docker_image 自定义的参数
保存任务
- 执行任务
任务执行前先启动docker,以管理员身份运行docker desktop
执行构建时可以查看日志
构建完成,在docker验证容器是否启动
测试接口,成功!
五、jenkins打包部署项目到远程服务器docker中
本地docker将镜像推送到私有仓库中,虚拟机中的docker从私有仓库中拉取镜像并启动容器
- 配置本地docker
Docker 默认要求私有仓库使用 HTTPS,但本地测试通常用 HTTP。需要修改 Docker 配置:
右键 Docker 托盘图标 → Settings (设置)
进入 Docker Engine 配置 添加:
{
“insecure-registries”: [“192.168.xxx.xxx:5000”]
}
点击 Apply & Restart 重启 Docker。
- 下载最新Registry镜像
docker pull registry:latest
- 启动Registry镜像服务
docker run -d -p 5000:5000 --name registry -v /usr/local/docker/registry:/var/lib/registry registry:latest
映射5000端口; -v是将Registry内的镜像数据卷与本地文件关联, 便于管理和维护Registry内的数据。
- 查看仓库资源
访问地址:http://localhost:5000/v2/_catalog 启动正常, 可以看到返回:
{"repositories":[]}
目前并没有上传镜像, 显示空数据。如果上传成功, 可以看到数据:
5. 远程服务器开启ssh
- 安装OpenSSH服务器
sudo apt update
sudo apt install openssh-server
- 检查SSH服务状态
sudo systemctl status ssh
- 配置防火墙
sudo ufw allow ssh
# 或者直接指定端口
sudo ufw allow 22/tcp
- 开启root密码认证
修改/etc/ssh/sshd_config中的配置
Port 22 # 确保端口正确(默认22)
PermitRootLogin yes # 启用root密码登录
StrictModes no # 关闭严格模式
PasswordAuthentication yes # 必须设为yes(允许密码登录)
PubkeyAuthentication yes # 公钥认证(可选)
修改完重启ssh服务
sudo systemctl restart ssh
- 远程服务器docker配置
- 修改docker配置,添加 “insecure-registries”: [“192.168.xxx.xxx:5000”]
vim /etc/docker/daemon.json
- 重启docker服务
systemctl restart docker
- jenkins中配置远程服务器(确保安装了Publish Over SSH和SSH插件)
- 开始构建任务
- 新建item
- 添加描述,配置参数
描述
参数docker_registry
参数docker_image
- 源码管理git
- 增加构建步骤 1.maven
clean install -Dmaven.test.skip=true dockerfile:build -f pom.xml
- 增加构建步骤 2.执行shell脚本
image_tag=$docker_registry/$docker_image/$JOB_NAME
echo '================docker镜像清理================'
if [ -n "$(docker ps -a -f name=$JOB_NAME --format '{{.ID}}' )" ]
then
#删除之前的容器
docker rm -f $(docker ps -a -f name=$JOB_NAME --format '{{.ID}}' )
fi
# 清理镜像
docker image prune -f
# 创建TAG
docker tag $docker_image/$JOB_NAME $image_tag
echo '================docker镜像推送================'
# 推送镜像
docker push $image_tag
# 删除TAG
docker rmi $image_tag
echo '================docker tag 清理 ================'
- 增加构建步骤 3. 在远程服务器上执行脚本
echo '================拉取最新镜像================'
docker pull $docker_registry/$docker_image/$JOB_NAME
echo '================删除清理容器镜像================'
if [ -n "$(docker ps -a -f name=$JOB_NAME --format '{{.ID}}' )" ]
then
#删除之前的容器
docker rm -f $(docker ps -a -f name=$JOB_NAME --format '{{.ID}}' )
fi
# 清理镜像
docker image prune -f
echo '===============启动容器================'
docker run -d -p 6688:6688 -e PARAMS="--spring.profiles.active=prod" --name $JOB_NAME $docker_registry/$docker_image/$JOB_NAME
保存任务
- 执行任务
执行任务前先启动docker,并且启动registry容器,确保registry容器正常运行
启动jenkins任务
任务执行时可以查看日志
10. 登录远程服务器,验证容器是否启动
测试接口,成功!