之前部署一直是本地打包 → scp 传服务器 → 手敲重启脚本,一次两三分钟还容易漏步骤(有一次忘传配置文件直接把测试环境搞挂)。终于下决心搭一套自动部署,机器少预算无,选型 Gitea(自建 Git)+ Jenkins(构建发布),全程容器跑起来。
整体流程
push 代码到 Gitea → Gitea webhook 通知 Jenkins → Jenkins 拉代码、跑测试、打 jar 包 → scp 到目标服务器 → 远程执行重启脚本 → 健康检查通过才算成功。全程三分钟,失败会发企微通知。
关键配置
Gitea webhook:仓库设置里加 webhook 指向 JENKINS_URL/generic-webhook-trigger/invoke?token=xxx,装 Generic Webhook Trigger 插件,简单直接。
Jenkinsfile(核心部分):
pipeline {
agent any
stages {
stage('测试') {
steps { sh 'mvn test' }
}
stage('打包') {
steps { sh 'mvn package -DskipTests' }
}
stage('部署') {
steps {
sshagent(['prod-key']) {
sh '''
scp target/app.jar deploy@192.168.1.20:/opt/app/
ssh deploy@192.168.1.20 "/opt/app/restart.sh"
'''
}
}
}
stage('健康检查') {
steps {
sh '''
for i in $(seq 1 10); do
curl -sf http://192.168.1.20:8080/actuator/health && exit 0
sleep 3
done
exit 1
'''
}
}
}
post {
failure { sh 'curl 企微机器人webhook地址' }
}
}
踩的坑
- 重复启动:早期重启脚本是直接
java -jar,脚本没判断旧进程就起,导致两个进程抢端口。改成先pkill -f app.jar等 5 秒再起,并加 PID 文件校验 - 部署脚本幂等:脚本无论执行多少遍,结果应该一致。中途失败可以安全重跑,这条原则让半夜处理故障时安心很多
- 配置外置:application.yml 不打进 jar,按环境放服务器上,jar 包可以在任何环境复用
- 回滚方案:每次部署把上一个版本 cp 成 app.jar.bak,回滚就是停服务、换文件、重启。有次新版本有 bug,回滚 40 秒搞定,幸福感极强
搭完之后最大的变化不是省了几分钟,而是"发布"从一件需要鼓起勇气的事变成了随手的事。小步快发,出问题爆炸半径也小。这才是一套流水线真正的价值。

Comments 4 条评论
pkill 等五秒再起,端口冲突我也遇过
部署脚本幂等,半夜处理故障时最安心
回滚 40 秒搞定,幸福感极强哈哈
配置外置后 jar 能复用了