fix: 增强日志输出过滤关键错误 #27
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Deploy TinyFlow | |
| on: | |
| push: | |
| branches: [master, main] | |
| workflow_dispatch: # 支持手动触发 | |
| jobs: | |
| build-and-deploy: | |
| runs-on: ubuntu-latest | |
| steps: | |
| # 1. 检出代码 | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| # 2. 设置 Node.js 环境 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '18' | |
| cache: 'npm' | |
| cache-dependency-path: web/package-lock.json | |
| # 3. 安装前端依赖并构建 | |
| - name: Build Frontend | |
| run: | | |
| cd web | |
| npm ci | |
| npm run build | |
| env: | |
| VITE_SHORT_BASE: ${{ secrets.APP_DOMAIN }} | |
| VITE_API_BASE: ${{ secrets.API_BASE || '' }} | |
| # 4. 设置 Java 环境 | |
| - name: Setup Java | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: 'temurin' | |
| java-version: '17' | |
| cache: 'maven' | |
| # 5. 运行后端测试 | |
| - name: Run Backend Tests | |
| run: mvn clean test | |
| env: | |
| APP_DOMAIN: ${{ secrets.APP_DOMAIN }} | |
| DB_PASSWORD: ${{ secrets.DB_PASSWORD }} | |
| JWT_SECRET: ${{ secrets.JWT_SECRET }} | |
| REDIS_PASSWORD: ${{ secrets.REDIS_PASSWORD }} | |
| # 6. 构建后端(跳过测试,因为已经运行过) | |
| - name: Build Backend Package | |
| run: mvn clean package -DskipTests | |
| env: | |
| APP_DOMAIN: ${{ secrets.APP_DOMAIN }} | |
| DB_PASSWORD: ${{ secrets.DB_PASSWORD }} | |
| JWT_SECRET: ${{ secrets.JWT_SECRET }} | |
| REDIS_PASSWORD: ${{ secrets.REDIS_PASSWORD }} | |
| # 7. 部署到服务器 | |
| - name: Deploy to Server | |
| uses: appleboy/[email protected] | |
| env: | |
| APP_DOMAIN: ${{ secrets.APP_DOMAIN }} | |
| DB_PASSWORD: ${{ secrets.DB_PASSWORD }} | |
| JWT_SECRET: ${{ secrets.JWT_SECRET }} | |
| REDIS_PASSWORD: ${{ secrets.REDIS_PASSWORD }} | |
| with: | |
| host: ${{ secrets.SERVER_HOST }} | |
| port: ${{ secrets.SERVER_PORT }} | |
| username: ${{ secrets.SERVER_USER }} | |
| key: ${{ secrets.SERVER_SSH_KEY }} | |
| envs: APP_DOMAIN,DB_PASSWORD,JWT_SECRET,REDIS_PASSWORD | |
| script: | | |
| cd /opt/TinyFlow | |
| # 拉取最新代码并强制丢弃本地更改 | |
| git fetch origin | |
| git reset --hard origin/master | |
| # 更新 systemd 配置文件中的环境变量 | |
| sudo sed -i "s|Environment=\"APP_DOMAIN=.*\"|Environment=\"APP_DOMAIN=$APP_DOMAIN\"|g" /etc/systemd/system/tinyflow.service | |
| sudo sed -i "s|Environment=\"DB_PASSWORD=.*\"|Environment=\"DB_PASSWORD=$DB_PASSWORD\"|g" /etc/systemd/system/tinyflow.service | |
| sudo sed -i "s|Environment=\"JWT_SECRET=.*\"|Environment=\"JWT_SECRET=$JWT_SECRET\"|g" /etc/systemd/system/tinyflow.service | |
| sudo sed -i "s|Environment=\"REDIS_PASSWORD=.*\"|Environment=\"REDIS_PASSWORD=$REDIS_PASSWORD\"|g" /etc/systemd/system/tinyflow.service | |
| # 重新构建前端 | |
| cd web | |
| npm ci --prefer-offline --no-audit | |
| npm run build | |
| # 重新构建后端 | |
| cd .. | |
| mvn clean package -DskipTests -q | |
| # 创建目录并复制JAR包到运行目录 | |
| sudo mkdir -p /opt/tinyflow | |
| sudo cp target/TinyFlow-0.0.1-SNAPSHOT.jar /opt/tinyflow/app.jar | |
| # 重新加载 systemd 并重启服务 | |
| sudo systemctl daemon-reload | |
| sudo systemctl restart tinyflow | |
| # 等待服务启动(Spring Boot 应用启动较慢,需要更长时间) | |
| echo "⏳ 等待服务启动..." | |
| sleep 10 | |
| # 检查服务状态 | |
| if ! systemctl is-active --quiet tinyflow; then | |
| echo "❌ 服务未运行,查看日志:" | |
| journalctl -u tinyflow -n 100 | |
| exit 1 | |
| fi | |
| echo "✅ systemd服务已启动,等待应用完全就绪..." | |
| # 健康检查(重试机制,不强制要求200状态码) | |
| MAX_RETRY=12 | |
| RETRY_COUNT=0 | |
| while [ $RETRY_COUNT -lt $MAX_RETRY ]; do | |
| HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/actuator/health) | |
| if [ "$HTTP_CODE" = "200" ]; then | |
| echo "✅ 部署完成!服务健康检查通过 (HTTP $HTTP_CODE)" | |
| exit 0 | |
| elif [ "$HTTP_CODE" != "000" ]; then | |
| echo "⚠️ 服务响应但状态不是OK (HTTP $HTTP_CODE),继续等待..." | |
| fi | |
| RETRY_COUNT=$((RETRY_COUNT+1)) | |
| echo "⏳ 第 $RETRY_COUNT/$MAX_RETRY 次检查,等待 10 秒后重试..." | |
| sleep 10 | |
| done | |
| echo "❌ 健康检查超时,最后状态码: $HTTP_CODE" | |
| echo "检查服务端口监听状态:" | |
| ss -tlnp | grep 8080 || netstat -tlnp | grep 8080 || echo "未找到监听8080端口的进程" | |
| echo "查看服务完整启动日志(包含错误和警告):" | |
| journalctl -u tinyflow -n 200 --no-pager | grep -E "ERROR|WARN|Started TinyFlowApplication|Failed to|Exception" || journalctl -u tinyflow -n 200 --no-pager | |
| exit 1 | |
| # 8. 部署失败通知(可选) | |
| - name: Deployment Failed | |
| if: failure() | |
| run: echo "❌ TinyFlow 部署失败!请检查 GitHub Actions 日志" | |
| # 9. 部署成功通知 | |
| - name: Deployment Success | |
| if: success() | |
| run: echo "✅ TinyFlow 部署成功!所有测试已通过,部署完成。" |