告别手动部署!Jenkins+Gogs 打造 SpringBoot 自动化流水线

小nuo在部署 Next.js、React 等前端项目在Vercel的时候,就很好奇,为什么Vercel可以做到代码提交到仓库的指定分支就可以自动在服务器上构建了呢,我可不可以实现后端的自动化部署呢?于是就有了这篇文章...

初始化

首先拉去Jenkins长期支持(LTS)版本的镜像:

bash 复制代码
docker pull jenkins/jenkins:lts-jdk17

创建网络"jenkins-net",用于在同一网络内的容器间通信(如 Jenkins 与 Docker 守护进程容器):

bash 复制代码
docker network create jenkins-net

创建docker-compose.yml文件,用于配置容器运行:

yaml 复制代码
services:
  jenkins:
    image: jenkins/jenkins:lts-jdk11
    container_name: jenkins
    privileged: true
    user: root
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - /var/jenkins_home:/var/jenkins_home        # 持久化存储 确保配置/插件/任务数据不丢失
      - /var/run/docker.sock:/var/run/docker.sock  # 集成 Docker
      - /usr/bin/docker:/usr/bin/docker
    environment:
      - JAVA_OPTS=-Djenkins.install.runSetupWizard=false
    networks:
      - jenkins-net

networks:
  jenkins-net:
    driver: bridge

Jenkins与gogs集成 达成自动化部署:

Jenkins配置JDK与Maven

启动Jenkin且完成初始化 点击系统管理

点击全局工具配置

配置Maven、JDK点击应用并保存

配置API Token并获取csrf用于安全验证的东西

添加新Token输入名称 点击生成 保存此Token

因为高版本Jenkins添加了csrf的功能所以要获取特殊字符串用于安全验证(如果是低版本则不需要), 打开运行Jenkins的主机命令行输入如下命令:

bash 复制代码
curl -u Jenkins用户ID:API Token <http://IP地址>:端口/crumbIssuer/api/json

将获取的特殊字符串保存起来 后面会用到其中的 crumb

创建Jenkins任务 填写Gog secret

点击新建任务并选择自由风格的软件项目

填写Gogs secret

配置gogs仓库Git钩子

选择仓库并点击仓库设置选择管理Git钩子

填写钩子文本 文本如下:

bash 复制代码
curl -X POST "<http://IP地址>:端口/job/任务名/build?token=任务的Gogs secret" \
     -H "Jenkins-Crumb: 前面获取的Crumb" \
     -u Jenkins用户ID:API Token --verbose

完善Jenkins任务配置

填写gogs项目仓库地址 并指定分支

构建触发器 Build when a change is pushed to Gogs

构建步骤选择调用顶层Maven目标并输入 clean package -DskipTests

增加构建步骤 点击执行shell ,输入以下脚本内容(其中端口按实际情况修改):

bash 复制代码
# 定义容器名称
CONTAINER_NAME="my-jenkins-app"

# 构建镜像
docker build -t jenkins-demo:latest .

# 检查是否存在同名容器
EXISTING_CONTAINER=$(docker ps -a -q -f name="^${CONTAINER_NAME}$")

if [ -n "$EXISTING_CONTAINER" ]; then
  echo "发现已有容器:$EXISTING_CONTAINER,正在删除..."
  docker rm -f "$EXISTING_CONTAINER"
fi

# 运行新容器
docker run -d -p 18080:18080 --name="$CONTAINER_NAME" jenkins-demo:latest

# 检查容器状态
echo "等待容器启动..."
for i in {1..10}; do
  if docker ps -q -f name="^${CONTAINER_NAME}$" &> /dev/null; then
    echo "容器启动成功!"
    
    # 清理废弃镜像
    echo "清理无效镜像..."
    docker images -f "dangling=true" -q | xargs -r docker rmi
    echo "清理完成!"
    
    exit 0
  fi
  sleep 2
done

echo "容器启动超时!请检查错误日志。"
exit 1

可以看见这里的shell脚本采用的是 docker 容器化部署,如何实现?

首先在项目的src目录平级下创建 Dockerfile 文件

然后配置 Dockerfile 文件内容:

bash 复制代码
FROM jdk17.0.10-aarch64:latest  # 指定基础镜像

COPY ./target/jenkins_demo-0.0.1-SNAPSHOT.jar /app.jar  # 复制到镜像中

ENTRYPOINT ["java","-jar","/app.jar"]  # 设置容器启动命令

为什么是如上配置,让我们查看Maven打包项目之后的目录:

总结

核心就是 Jenkins 与 Gogs等类型仓库 的配合,这篇文章是我自己部署成功的案例,如有不足请见谅,小nuo目前大二还在不断学习!有什么问题以及要分享的可以发布在评论区~

相关推荐
IT_陈寒1 小时前
Python开发者必知的5大性能陷阱:90%的人都踩过的坑!
前端·人工智能·后端
流浪克拉玛依2 小时前
Go Web 服务限流器实战:从原理到压测验证 --使用 Gin 框架 + Uber Ratelimit / 官方限流器,并通过 Vegeta 进行性能剖析
后端
孟沐2 小时前
保姆级教程:手写三层架构 vs MyBatis-Plus
后端
星浩AI2 小时前
让模型自己写 Skills——从素材到自动生成工作流
人工智能·后端·agent
华仔啊4 小时前
为啥不用 MP 的 saveOrUpdateBatch?MySQL 一条 SQL 批量增改才是最优解
java·后端
武子康5 小时前
大数据-242 离线数仓 - DataX 实战:MySQL 全量/增量导入 HDFS + Hive 分区(离线数仓 ODS
大数据·后端·apache hive
砍材农夫6 小时前
TCP和UDP区别
后端
千寻girling6 小时前
一份不可多得的 《 Django 》 零基础入门教程
后端·python·面试
千寻girling6 小时前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法
贾铭6 小时前
如何实现一个网页版的剪映(三)使用fabric.js绘制时间轴
前端·后端