name: Next.js CI/CD 流水线 on: push: branches: [ "main" ] pull_request: branches: [ "main" ] jobs: # 构建并部署作业 deploy: runs-on: ubuntu-latest steps: # 检出代码 - name: 📦 检出代码 uses: actions/checkout@v4 # 🚚 将项目文件复制到目标服务器 (仅在 main 分支推送时执行) - name: 🚚 将项目文件复制到目标服务器 if: github.ref == 'refs/heads/main' && github.event_name == 'push' uses: appleboy/scp-action@v0.1.4 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USERNAME }} key: ${{ secrets.SERVER_SSH_KEY }} source: "." target: "/vol1/1000/Docker/saas2/" overwrite: true # 🛠️ 在服务器上构建并运行Docker镜像 (仅在 main 分支推送时执行) - name: 🛠️ 在服务器上构建并运行Docker镜像 if: github.ref == 'refs/heads/main' && github.event_name == 'push' uses: appleboy/ssh-action@v1.0.0 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USERNAME }} key: ${{ secrets.SERVER_SSH_KEY }} script: | set -e # 遇到错误立即退出 echo "🚀 开始部署 saas2 应用..." # 进入项目目录 cd /vol1/1000/Docker/saas2 echo "🔧 正在构建临时镜像..." if docker build -t saas2-temp .; then echo "✅ 镜像构建成功,开始更新容器..." # 停止并删除旧容器 echo "⏹️ 正在停止旧容器..." docker stop saas2-app || true echo "🗑️ 正在删除旧容器..." docker rm saas2-app || true echo "🗑️ 正在删除旧镜像..." docker rmi saas2-app || true # 重命名新镜像 echo "🔧 重命名新镜像..." docker tag saas2-temp saas2-app docker rmi saas2-temp # 启动新容器 echo "🚀 正在运行新容器..." docker run -d \ --name saas2-app \ --restart unless-stopped \ -p 3003:3000 \ --health-cmd="wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1" \ --health-interval=30s \ --health-timeout=10s \ --health-retries=3 \ saas2-app # 等待容器启动 echo "⏳ 等待容器启动..." sleep 15 # 检查容器状态 if [ "$(docker ps -q -f name=saas2-app)" ]; then echo "✅ 部署成功!容器状态:" docker ps | grep saas2-app echo "" echo "🌐 应用访问地址: http://$(hostname -I | awk '{print $1}'):3003" # 测试健康检查 echo "🔍 测试健康检查..." if wget --timeout=10 -qO- http://localhost:3000/api/health > /dev/null 2>&1; then echo "✅ 健康检查通过" else echo "⚠️ 健康检查失败,但容器正在运行" fi else echo "❌ 部署失败!容器未能正常启动" echo "📋 容器日志:" docker logs saas2-app || true exit 1 fi echo "🎉 部署完成!" else echo "❌ 镜像构建失败!保留旧容器运行。" exit 1 fi # 清理无用的Docker资源 echo "🧹 清理无用的 Docker 资源..." docker system prune -f