告别手动部署!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目前大二还在不断学习!有什么问题以及要分享的可以发布在评论区~

相关推荐
想用offer打牌3 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
KYGALYX4 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了4 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法5 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
Moment5 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
Cobyte6 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc
程序员侠客行7 小时前
Mybatis连接池实现及池化模式
java·后端·架构·mybatis
Honmaple7 小时前
QMD (Quarto Markdown) 搭建与使用指南
后端
PP东7 小时前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
invicinble8 小时前
springboot的核心实现机制原理
java·spring boot·后端