fix: 修复短链路由正则表达式,限制匹配4-8位字母数字 #47
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. 上传 JAR 包到服务器 | |
| - name: Upload JAR to Server | |
| uses: appleboy/[email protected] | |
| with: | |
| host: ${{ secrets.SERVER_HOST }} | |
| port: ${{ secrets.SERVER_PORT }} | |
| username: ${{ secrets.SERVER_USER }} | |
| key: ${{ secrets.SERVER_SSH_KEY }} | |
| source: "target/TinyFlow-0.0.1-SNAPSHOT.jar" | |
| target: "/opt/TinyFlow/" | |
| overwrite: true | |
| # 8. 上传前端构建产物到服务器 | |
| - name: Upload Frontend to Server | |
| uses: appleboy/[email protected] | |
| with: | |
| host: ${{ secrets.SERVER_HOST }} | |
| port: ${{ secrets.SERVER_PORT }} | |
| username: ${{ secrets.SERVER_USER }} | |
| key: ${{ secrets.SERVER_SSH_KEY }} | |
| source: "web/dist/*" | |
| target: "/opt/TinyFlow/web/dist/" | |
| strip_components: 2 | |
| overwrite: true | |
| # 9. 重启服务 | |
| - name: Restart Service | |
| 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: | | |
| echo "🚀 开始部署..." | |
| # 确保目录存在 | |
| sudo mkdir -p /opt/TinyFlow/target | |
| sudo mkdir -p /opt/TinyFlow/web/dist | |
| # 检查文件是否上传成功 | |
| echo "📦 检查部署文件..." | |
| if [ ! -f "/opt/TinyFlow/target/TinyFlow-0.0.1-SNAPSHOT.jar" ]; then | |
| echo "❌ JAR 文件不存在" | |
| exit 1 | |
| fi | |
| echo "✅ JAR 文件已上传" | |
| if [ ! -d "/opt/TinyFlow/web/dist" ]; then | |
| echo "❌ 前端资源目录不存在" | |
| exit 1 | |
| fi | |
| echo "✅ 前端资源已上传" | |
| ls -la /opt/TinyFlow/web/dist/assets/ | head -5 | |
| # 重启服务 | |
| echo "🔄 重启服务..." | |
| sudo systemctl daemon-reload | |
| sudo systemctl restart tinyflow | |
| # 重载 Nginx 以确保静态资源更新 | |
| echo "🔄 重载 Nginx..." | |
| sudo nginx -s reload | |
| echo "⏳ 等待服务启动..." | |
| sleep 10 | |
| # 检查服务状态 | |
| if ! systemctl is-active --quiet tinyflow; then | |
| echo "❌ 服务未运行,查看日志:" | |
| journalctl -u tinyflow -n 50 --no-pager | |
| exit 1 | |
| fi | |
| echo "✅ systemd服务已启动,等待应用完全就绪..." | |
| # 健康检查 | |
| 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" | |
| journalctl -u tinyflow -n 100 --no-pager | grep -E "ERROR|WARN|Exception" || journalctl -u tinyflow -n 50 --no-pager | |
| exit 1 | |
| # 10. 部署失败通知(可选) | |
| - name: Deployment Failed | |
| if: failure() | |
| run: echo "❌ TinyFlow 部署失败!请检查 GitHub Actions 日志" | |
| # 11. 部署成功通知 | |
| - name: Deployment Success | |
| if: success() | |
| run: echo "✅ TinyFlow 部署成功!" |