# ============================================================ # Gitea Actions CI/CD — 自动迁移 → 构建 → 部署到 Runner 本机 # # 前置条件: # 1. Gitea Runner (act_runner) 已注册,Runner 有 Docker 权限 # 2. Runner 服务器已执行首次初始化(仅一次): # docker network create yudao-net # docker compose -f script/docker/docker-compose.yml up -d postgres redis # 3. Runner Docker 需配 registry-mirrors(国内加速拉镜像) # # 数据库连接: # CI 容器通过宿主机 IP 连接持久化 PostgreSQL(非临时 service) # 默认使用 172.17.0.1(Docker 默认网桥);如果不对,设置 runner 环境变量 DOCKER_HOST_IP # ============================================================ name: Deploy to Runner on: push: branches: [main] env: TZ: Asia/Shanghai # 宿主机 IP — CI 容器通过此 IP 访问宿主机的 PostgreSQL / Redis # 默认 Docker bridge gateway,可在 runner 配置中覆盖 DOCKER_HOST_IP: "172.17.0.1" PGUSER: postgres PGPASSWORD: postgres PGDATABASE: ruoyi-vue-pro jobs: deploy: runs-on: ubuntu-latest steps: # ==================== 1. 环境准备 ==================== - name: 检出代码 uses: actions/checkout@v4 - name: 检测宿主机 IP run: | # 如果 runner 环境变量覆盖了 DOCKER_HOST_IP,则使用覆盖值 if [ -n "${DOCKER_HOST_IP_OVERRIDE}" ]; then DOCKER_HOST_IP="${DOCKER_HOST_IP_OVERRIDE}" fi echo "📡 宿主机 IP: ${DOCKER_HOST_IP}" echo "DOCKER_HOST_IP=${DOCKER_HOST_IP}" >> $GITHUB_ENV - name: 安装 JDK 25 run: | curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" sdk install java 25.0.1-tem sdk use java 25.0.1-tem echo "JAVA_HOME=$HOME/.sdkman/candidates/java/current" >> $GITHUB_ENV echo "$HOME/.sdkman/candidates/java/current/bin" >> $GITHUB_PATH java -version - name: 缓存 Maven 依赖 uses: actions/cache@v3 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} restore-keys: | ${{ runner.os }}-maven- # ==================== 2. 数据库迁移(连接宿主机持久化 PostgreSQL) ==================== - name: 安装 PostgreSQL 客户端 run: | sudo apt-get update -qq sudo apt-get install -y -qq postgresql-client - name: 检查数据库连接 run: | echo "🔌 尝试连接 PostgreSQL: ${DOCKER_HOST_IP}:5432" if PGPASSWORD=${PGPASSWORD} psql -h ${DOCKER_HOST_IP} -U ${PGUSER} -d postgres -c "SELECT 1" > /dev/null 2>&1; then echo "✅ PostgreSQL 连接正常" else echo "❌ 无法连接 PostgreSQL,请确认持久化数据库已启动" echo " 执行: docker compose -f script/docker/docker-compose.yml up -d postgres" exit 1 fi - name: 执行数据库迁移 run: | echo "📦 创建数据库(如不存在)..." PGPASSWORD=${PGPASSWORD} psql -h ${DOCKER_HOST_IP} -U ${PGUSER} -d postgres -tc \ "SELECT 1 FROM pg_database WHERE datname='${PGDATABASE}'" | grep -q 1 \ || PGPASSWORD=${PGPASSWORD} createdb -h ${DOCKER_HOST_IP} -U ${PGUSER} ${PGDATABASE} echo "📄 执行主表结构 (ruoyi-vue-pro.sql)..." PGPASSWORD=${PGPASSWORD} psql -h ${DOCKER_HOST_IP} -U ${PGUSER} -d ${PGDATABASE} \ -f sql/postgresql/ruoyi-vue-pro.sql -v ON_ERROR_STOP=1 echo "📄 执行 Quartz 表结构 (quartz.sql)..." PGPASSWORD=${PGPASSWORD} psql -h ${DOCKER_HOST_IP} -U ${PGUSER} -d ${PGDATABASE} \ -f sql/postgresql/quartz.sql -v ON_ERROR_STOP=1 echo "✅ 数据库迁移完成" # ==================== 3. 编译打包 ==================== - name: Maven 打包 run: mvn -B clean package -DskipTests -pl yudao-server -am - name: 确认 JAR 生成 run: | ls -lh yudao-server/target/*.jar echo "✅ JAR 就绪" # ==================== 4. 构建镜像 + 重启服务 ==================== - name: 重新构建并启动服务 run: | cd script/docker docker compose up -d --build server echo "✅ 服务已更新" - name: 检查服务状态 run: | echo "" echo "==================== 容器状态 ====================" docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" \ --filter "name=yudao-server" \ --filter "name=yudao-postgres" \ --filter "name=yudao-redis" echo "" echo "📋 yudao-server 最近日志:" docker logs --tail 30 yudao-server