name: Build docker and publish run-name: zero-ppanel Docker构建和部署 on: push: branches: - main - dev pull_request: branches: - main - dev env: REPO: ${{ vars.REPO || 'registry.kxsw.us/vpn-server' }} SSH_HOST: ${{ github.ref_name == 'main' && vars.SSH_HOST || vars.DEV_SSH_HOST }} SSH_PORT: ${{ vars.SSH_PORT }} SSH_USER: ${{ vars.SSH_USER }} SSH_PASSWORD: ${{ github.ref_name == 'main' && vars.SSH_PASSWORD || vars.DEV_SSH_PASSWORD }} TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }} TG_CHAT_ID: ${{ secrets.TG_CHAT_ID }} VERSION: ${{ github.sha }} BUILDTIME: ${{ github.event.head_commit.timestamp }} jobs: # ============================================================ # Job 1: 设置环境变量,供后续 jobs 共享 # ============================================================ prepare: runs-on: zero-ppanel-server container: image: node:20 strategy: matrix: # 只有node支持版本号别名 node: ['20.15.1'] outputs: docker_tag: ${{ steps.vars.outputs.docker_tag }} container_suffix: ${{ steps.vars.outputs.container_suffix }} deploy_path: ${{ steps.vars.outputs.deploy_path }} steps: - name: ⚙️ 计算部署变量 id: vars run: | case "${{ github.ref_name }}" in main) echo "docker_tag=latest" >> $GITHUB_OUTPUT echo "container_suffix=" >> $GITHUB_OUTPUT echo "deploy_path=/root/bindbox" >> $GITHUB_OUTPUT ;; dev) echo "docker_tag=dev" >> $GITHUB_OUTPUT echo "container_suffix=-dev" >> $GITHUB_OUTPUT echo "deploy_path=/root/bindbox-dev" >> $GITHUB_OUTPUT ;; *) echo "docker_tag=${{ github.ref_name }}" >> $GITHUB_OUTPUT echo "container_suffix=-${{ github.ref_name }}" >> $GITHUB_OUTPUT echo "deploy_path=/root/vpn_server_other" >> $GITHUB_OUTPUT ;; esac # ============================================================ # Job 2: 并行矩阵构建 5 个服务镜像 - 💥 重点修改这里 💥 # ============================================================ build: runs-on: zero-ppanel-server container: # <-- 整个 build job 在 Node.js 容器中运行 image: node:20.15.1 needs: prepare strategy: fail-fast: false matrix: service: - name: api dockerfile: deploy/Dockerfile.api image_name: zero-ppanel-api - name: admin dockerfile: deploy/Dockerfile.admin image_name: zero-ppanel-admin - name: node dockerfile: deploy/Dockerfile.node image_name: zero-ppanel-node - name: queue dockerfile: deploy/Dockerfile.queue image_name: zero-ppanel-queue - name: scheduler dockerfile: deploy/Dockerfile.scheduler image_name: zero-ppanel-scheduler steps: - name: 📥 下载代码 uses: actions/checkout@v4 - name: Set up Go environment # 在 build job 中也设置 Go 环境 uses: actions/setup-go@v2 with: go-version: '1.24.0' # 确保使用 go.mod 中指定的精确版本 # cache: true # 可以启用缓存加速依赖下载 - name: 🔧 确保 Docker CLI 可用并初始化 Go Modules run: | set -e export DEBIAN_FRONTEND=noninteractive apt-get update -y apt-get install -y ca-certificates curl gnupg # !!! 在 node 容器中安装 docker-ce-cli !!! curl -fsSL https://download.docker.com/linux/debian/gpg \ | gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/debian \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \ > /etc/apt/sources.list.d/docker.list apt-get update -y apt-get install -y docker-ce-cli # <<-- 确保 docker CLI 被安装 echo "Docker CLI 版本: $(docker --version)" echo "Test Docker connectivity: $(docker info --format '{{.ServerVersion}}') (Server)" # 移除手动 Go 安装,已由 actions/setup-go 处理 # go version # 已经通过 actions/setup-go 设置 go env -w GOPROXY=https://goproxy.cn,direct # 设置 Go Proxy go mod download # 确保所有模块已下载 # ============================================================ # Job 3: 部署到服务器 # ============================================================ deploy: runs-on: ario-server needs: [prepare, build] # PR 不触发部署,只有直接推送才部署 if: github.event_name == 'push' steps: - name: 📥 下载代码 (获取 docker-compose.cloud.yml) uses: actions/checkout@v4 - name: 📂 传输 docker-compose.cloud.yml uses: appleboy/scp-action@v0.1.7 with: host: ${{ env.SSH_HOST }} username: ${{ env.SSH_USER }} password: ${{ env.SSH_PASSWORD }} port: ${{ env.SSH_PORT }} source: "deploy/docker-compose.cloud.yml" target: "${{ needs.prepare.outputs.deploy_path }}/" strip_components: 1 - name: 🚀 部署服务 uses: appleboy/ssh-action@v1.0.3 with: host: ${{ env.SSH_HOST }} username: ${{ env.SSH_USER }} password: ${{ env.SSH_PASSWORD }} port: ${{ env.SSH_PORT }} timeout: 300s command_timeout: 600s script: | set -e DEPLOY_PATH="${{ needs.prepare.outputs.deploy_path }}" DOCKER_TAG="${{ needs.prepare.outputs.docker_tag }}" REPO="${{ env.REPO }}" echo "部署目录: ${DEPLOY_PATH}" echo "镜像标签: ${DOCKER_TAG}" cd ${DEPLOY_PATH} # 写入环境变量供 docker-compose 使用 cat > .env <