name: 数据库迁移 - 升级 on: workflow_dispatch: inputs: check_only: description: '只查看当前版本和脏库状态(执行 version,不改动数据库)' required: false default: false type: boolean concurrency: group: migrate cancel-in-progress: false env: REGISTRY: git.lzcwy.cn IMAGE: git.lzcwy.cn/zhengchiliu/zt-closet-backend MIGRATE_TAG: migrate jobs: migrate-up: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 确认 docker 可用 run: | docker version --format 'Server: {{.Server.Version}}' - name: 决定动作 id: args env: IN_CHECK: ${{ gitea.event.inputs.check_only }} run: | if [ "${IN_CHECK:-false}" = "true" ]; then echo "action=version" >> "$GITHUB_OUTPUT" echo "动作: version(只读)" else echo "action=up" >> "$GITHUB_OUTPUT" echo "动作: up" fi - name: 登录 Gitea 镜像仓库 env: REGISTRY_USER: ${{ secrets.ZT_CLOSET_REGISTRY_USER }} REGISTRY_TOKEN: ${{ secrets.ZT_CLOSET_REGISTRY_TOKEN }} run: | echo "$REGISTRY_TOKEN" | docker login "$REGISTRY" -u "$REGISTRY_USER" --password-stdin - name: 构建并推送迁移镜像 run: | docker build \ --build-arg GOPROXY=https://goproxy.cn,direct \ -f scripts/dockerfile/Dockerfile.migrate \ -t "$IMAGE:$MIGRATE_TAG" \ . docker push "$IMAGE:$MIGRATE_TAG" - name: 生产机执行(结束即删容器) env: SSH_KEY: ${{ secrets.ZT_CLOSET_PROD_SSH_KEY }} SSH_HOST: ${{ vars.ZT_CLOSET_PROD_SSH_HOST }} SSH_USER: ${{ vars.ZT_CLOSET_PROD_SSH_USER }} ACTION: ${{ steps.args.outputs.action }} run: | mkdir -p ~/.ssh && chmod 700 ~/.ssh printf '%s\n' "$SSH_KEY" > ~/.ssh/deploy_key chmod 600 ~/.ssh/deploy_key SSHOPT="-i ~/.ssh/deploy_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" ssh $SSHOPT "$SSH_USER@$SSH_HOST" "bash -s -- '$ACTION'" <<'REMOTE' set -e ACTION="$1" DIR=/opt/zt-closet IMAGE=git.lzcwy.cn/zhengchiliu/zt-closet-backend:migrate cd "$DIR" || { echo "目录不存在: $DIR"; exit 1; } [ -f configs/config.yaml ] || { echo "缺 configs/config.yaml"; exit 1; } docker pull "$IMAGE" docker run --rm \ --network host \ -v "$DIR/configs:/app/configs:ro" \ -v zt-go-build-cache:/root/.cache/go-build \ -e TZ=Asia/Shanghai \ "$IMAGE" "$ACTION" REMOTE