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

相关推荐
YGGP9 分钟前
吃透 Golang 基础:Goroutine
后端·golang
天天摸鱼的java工程师38 分钟前
如何实现一个红包系统,支持并发抢红包?
后端
稳妥API38 分钟前
Gemini 2.5 Pro vs Flash API:正式版对比选择指南,深度解析性能与成本平衡 - API易-帮助中心
后端
深栈解码42 分钟前
OpenIM 源码深度解析系列(十一):群聊系统架构与业务设计
后端
trow1 小时前
Spring 手写简易IOC容器
后端·spring
山城小辣椒1 小时前
spring-cloud-gateway使用websocket出现Max frame length of 65536 has been exceeded
后端·websocket·spring cloud
天天摸鱼的java工程师1 小时前
谈谈你对 AQS(AbstractQueuedSynchronizer)的理解?
后端
鸡窝头on1 小时前
Spring Boot 多 Profile 配置详解
spring boot·后端
风之旅人1 小时前
开发必备"节假日接口"
java·后端·开源
鑫有灵溪1 小时前
Redis 8 架构评估:企业级缓存方案的技术选型与实践指南
后端