Gitea + Jenkins 搭建自动部署流水线

Cold 发布于 2021-04-24 29 次阅读 539 字 预计阅读时间: 2 分钟 运维笔记


之前部署一直是本地打包 → 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 秒搞定,幸福感极强

搭完之后最大的变化不是省了几分钟,而是"发布"从一件需要鼓起勇气的事变成了随手的事。小步快发,出问题爆炸半径也小。这才是一套流水线真正的价值。

和喜欢的一切在一起~
最后更新于 2021-04-24