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