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

相关推荐
William一直在路上18 分钟前
SpringBoot 拦截器和过滤器的区别
hive·spring boot·后端
小马爱打代码1 小时前
Spring Boot 3.4 :@Fallback 注解 - 让微服务容错更简单
spring boot·后端·微服务
曾曜2 小时前
PostgreSQL逻辑复制的原理和实践
后端
豌豆花下猫2 小时前
Python 潮流周刊#110:JIT 编译器两年回顾,AI 智能体工具大爆发(摘要)
后端·python·ai
轻语呢喃2 小时前
JavaScript :事件循环机制的深度解析
javascript·后端
ezl1fe2 小时前
RAG 每日一技(四):让AI读懂你的话,初探RAG的“灵魂”——Embedding
后端
经典19922 小时前
spring boot 详解以及原理
java·spring boot·后端
Aurora_NeAr2 小时前
Apache Iceberg数据湖高级特性及性能调优
大数据·后端
程序员清风2 小时前
程序员要在你能挣钱的时候拼命存钱!
后端·面试·程序员
夜阳朔3 小时前
Conda环境激活失效问题
人工智能·后端·python