name: Deploy to Cloudflare Pages on: push: tags: - 'deploy-*' # 只在推送 deploy-* 标签时触发 jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Parse tag to env run: | # 获取 tag 名称(Gitea Actions 使用 GITHUB_REF_NAME) TAG_NAME="${GITHUB_REF_NAME}" echo "TAG_NAME=$TAG_NAME" # Tag 格式: deploy-{project_name}-{deploymentId_no_dashes} # 例如: deploy-b7ea026a-cf09-4e31-9f29-b55d7c652b71-123e4567e89b12d3a456426614174000 # 去掉 "deploy-" 前缀 PREFIX="deploy-" REST="${TAG_NAME#$PREFIX}" # deploymentId(无破折号)固定是最后32个字符 DEPLOYMENT_ID="${REST: -32}" # project_name 是剩余部分(去掉最后的 "-" 和 deploymentId) PROJECT_NAME="${REST%-${DEPLOYMENT_ID}}" echo "PROJECT_NAME=$PROJECT_NAME" >> "$GITHUB_ENV" echo "DEPLOYMENT_ID=$DEPLOYMENT_ID" >> "$GITHUB_ENV" echo "DOMAIN=${PROJECT_NAME}.preview.turingflowai.com" >> "$GITHUB_ENV" # 调试输出 echo "Parsed PROJECT_NAME: $PROJECT_NAME" echo "Parsed DEPLOYMENT_ID: $DEPLOYMENT_ID" - name: Check toolchain (debug only, 可选) run: | node -v || echo "node not found" npm -v || echo "npm not found" curl --version || echo "curl not found" # 已经在 node:20-bookworm-slim 容器内,无需再 setup-node # - name: Setup Node # uses: actions/setup-node@v4 # with: # node-version: '20' - name: Use CN npm registry run: | npm config set registry http://repo.myhuaweicloud.com/repository/npm/ - name: Install dependencies run: | npm ci --no-audit --no-fund - name: Build run: npm run build - name: Deploy to Cloudflare Pages env: CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }} CLOUDFLARE_API_TOKEN: ${{ secrets.CF_API_TOKEN }} PROJECT_NAME: ${{ env.PROJECT_NAME }} DOMAIN: ${{ env.DOMAIN }} run: | set -euo pipefail echo "[deploy] project: $PROJECT_NAME" echo "[deploy] domain: $DOMAIN" # 部署到 Cloudflare Pages (假定构建产物在 dist/) # 使用项目本地安装的 wrangler npx wrangler pages deploy dist \ --project-name "$PROJECT_NAME" \ --branch main # 绑定自定义域名:.preview.turingflowai.com echo "[deploy] 正在绑定自定义域名..." DOMAIN_RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \ "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/pages/projects/${PROJECT_NAME}/domains" \ -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"name":"'"${DOMAIN}"'"}') HTTP_CODE=$(echo "$DOMAIN_RESPONSE" | tail -n1) RESPONSE_BODY=$(echo "$DOMAIN_RESPONSE" | sed '$d') if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "409" ]; then echo "[deploy] 域名绑定成功或已存在 (HTTP $HTTP_CODE)" else echo "[deploy] 警告: 域名绑定失败 (HTTP $HTTP_CODE)" echo "[deploy] 响应: $RESPONSE_BODY" echo "[deploy] 继续执行,但域名可能未绑定成功" fi - name: Notify Deploy Service (success) if: success() env: DEPLOY_SERVICE_CALLBACK_URL: ${{ secrets.DEPLOY_SERVICE_CALLBACK_URL }} DEPLOY_SERVICE_TOKEN: ${{ secrets.DEPLOY_SERVICE_TOKEN }} DEPLOYMENT_ID: ${{ env.DEPLOYMENT_ID }} run: | set -euo pipefail # 获取当前 commit SHA (Gitea Actions 使用 GITHUB_SHA) COMMIT_SHA="${GITHUB_SHA}" curl -X POST "$DEPLOY_SERVICE_CALLBACK_URL" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $DEPLOY_SERVICE_TOKEN" \ -d '{ "deploymentId": "'"${DEPLOYMENT_ID}"'", "status": "deployed", "commitSha": "'"${COMMIT_SHA}"'", "cfDeploymentId": "", "errorMessage": null }' - name: Notify Deploy Service (failure) if: failure() env: DEPLOY_SERVICE_CALLBACK_URL: ${{ secrets.DEPLOY_SERVICE_CALLBACK_URL }} DEPLOY_SERVICE_TOKEN: ${{ secrets.DEPLOY_SERVICE_TOKEN }} DEPLOYMENT_ID: ${{ env.DEPLOYMENT_ID }} run: | set -euo pipefail # 获取当前 commit SHA COMMIT_SHA="${GITHUB_SHA}" curl -X POST "$DEPLOY_SERVICE_CALLBACK_URL" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $DEPLOY_SERVICE_TOKEN" \ -d '{ "deploymentId": "'"${DEPLOYMENT_ID}"'", "status": "failed", "commitSha": "'"${COMMIT_SHA}"'", "cfDeploymentId": "", "errorMessage": "see Gitea Actions logs" }'