Files
e2f38602-84ac-4b46-8a78-94b…/.gitea/workflows/deploy.yml
2025-11-23 20:50:17 +08:00

147 lines
5.2 KiB
YAML

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
# 绑定自定义域名:<project_name>-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"
}'