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

393 阅读3分钟

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

初始化

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

docker pull jenkins/jenkins:lts-jdk17

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

docker network create jenkins-net

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

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且完成初始化 点击系统管理

Pasted image 20241213144522.png

点击全局工具配置

Pasted image 20241213144401.png

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

Pasted image 20241213150803.png Pasted image 20241213150836.png Pasted image 20241213150726.png

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

Pasted image 20241213150416.png

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

Pasted image 20241213145907.png

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

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

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

Pasted image 20241213153025.png

创建Jenkins任务 填写Gog secret

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

Pasted image 20241213144654.png

填写Gogs secret

Pasted image 20241213145907.png

配置gogs仓库Git钩子

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

Pasted image 20241213145206.png

填写钩子文本 文本如下:

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

完善Jenkins任务配置

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

Pasted image 20241213154611.png

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

Pasted image 20241213155649.png

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

Pasted image 20241213160041.png

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

# 定义容器名称
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 文件

image.png

然后配置 Dockerfile 文件内容:

FROM jdk17.0.10-aarch64:latest  # 指定基础镜像

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

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

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

image.png

总结

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