# service.xpcool.com 自动部署:Gitea act_runner(push main/dev 触发) # 注意点(与前端差异): # 1. 后端不是拷贝静态文件,而是 Go 交叉编译 + Docker 镜像重建容器(runner 已挂载 docker.sock)。 # 2. job 基础镜像 node:20-bullseye 无 Go,需下载 Go 1.23 工具链(npmmirror 源,GOPROXY 走 goproxy.cn)。 # 3. 容器 env 通过 Gitea Actions secrets 注入(DB_DSN 必须带 mysql: 类型前缀,勿写死在仓库)。 # 4. 数据库结构变更请手动执行 manifest/sql/ 下脚本(003→004→004b→007),workflow 不做自动 DDL。 name: Build and Deploy (service.xpcool.com) on: push: branches: [main, dev] workflow_dispatch: jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: Install git & download Go toolchain run: | set -e apt-get update -qq apt-get install -y -qq git >/dev/null curl -fsSL https://npmmirror.com/mirrors/golang/go1.23.12.linux-amd64.tar.gz -o /tmp/go.tar.gz mkdir -p /usr/local && tar -C /usr/local -xzf /tmp/go.tar.gz export PATH="/usr/local/go/bin:$PATH" echo "/usr/local/go/bin" >> "$GITHUB_ENV" go version - name: Checkout (local Gitea) run: | git clone --depth 1 --branch "${{ github.ref_name }}" https://oauth2:${{ github.token }}@git.xpcool.com/${{ github.repository }}.git . git checkout ${{ github.sha }} - name: Cross compile (linux/amd64, CGO disabled) env: GOPROXY: https://goproxy.cn,direct GOFLAGS: -mod=mod run: | export PATH="/usr/local/go/bin:$PATH" CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /tmp/deploy/main main.go ls -lh /tmp/deploy/main - name: Assemble deploy dir (binary + config + resource + Dockerfile) run: | set -e mkdir -p /tmp/deploy/manifest/config /tmp/deploy/resource # 配置:基础 config.yaml + 环境化 config.prod.yaml(GF_GCFG_ENV=prod 时生效) cp manifest/config/config.prod.yaml /tmp/deploy/manifest/config/config.prod.yaml cp manifest/config/config.prod.yaml /tmp/deploy/manifest/config/config.yaml # 静态资源(GoFrame public/template) cp -r resource/public /tmp/deploy/resource/public mkdir -p /tmp/deploy/resource/template # 容器 Dockerfile(仓库内维护 deploy/Dockerfile,避免 workflow 内 heredoc 缩进问题) cp deploy/Dockerfile /tmp/deploy/Dockerfile echo "assemble done" - name: Build image & restart container env: DB_DSN: ${{ secrets.DB_DSN }} JWT_SECRET: ${{ secrets.JWT_SECRET }} run: | set -e cd /tmp/deploy docker build -t service.xpcool.com:latest . docker rm -f service.xpcool.com >/dev/null 2>&1 || true docker run -d --name service.xpcool.com \ --network xpcool-net \ -p 127.0.0.1:10100:10100 \ -e GF_GCFG_ENV=prod \ -e "DB_DSN=$DB_DSN" \ -e "JWT_SECRET=$JWT_SECRET" \ --restart unless-stopped \ service.xpcool.com:latest # 冒烟:等待启动并验证 OpenAPI sleep 5 curl -fsS -m 10 http://127.0.0.1:10100/api.json | head -c 120 || { echo "SMOKE TEST FAILED"; exit 1; } echo echo "Deployed service.xpcool.com (container restarted, 127.0.0.1:10100)"