Files
cloud-mail/.github/workflows/deploy-cloudflare.yml
T
2025-07-09 16:35:01 +08:00

117 lines
4.3 KiB
YAML

name: 🚀 Deploy cloud-mail to Cloudflare Workers
on:
push:
branches: [ main ]
paths:
- "mail-worker/**"
- "mail-vue/**"
workflow_dispatch:
jobs:
Deploy-cloud-mail:
name: 🏗️ Build and Deploy
runs-on: ubuntu-latest
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
D1_DATABASE_ID: ${{ secrets.D1_DATABASE_ID }}
KV_NAMESPACE_ID: ${{ secrets.KV_NAMESPACE_ID }}
R2_BUCKET_NAME: ${{ secrets.R2_BUCKET_NAME }}
DOMAIN: ${{ secrets.DOMAIN }}
ADMIN: ${{ secrets.ADMIN }}
JWT_SECRET: ${{ secrets.JWT_SECRET }}
INIT_URL: ${{ secrets.INIT_URL }}
steps:
- name: ➡️ Checkout repository
uses: actions/checkout@v4
- name: 📦 Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
cache-dependency-path: "./mail-worker/package-lock.json"
- name: 📥 Install dependencies
run: npm ci
working-directory: ./mail-worker
- name: 📡 Disable wrangler telemetry
working-directory: ./mail-worker
# 使用 -c 指定配置文件
run: npx wrangler telemetry disable -c wrangler-action.toml
- name: 🤫 Set Worker secrets (ignore if already exists)
working-directory: ./mail-worker
run: |
WORKER_NAME="cloud-mail"
CONFIG_FILE="wrangler-action.toml"
echo "🔒 Attempting to create/update secrets using '$CONFIG_FILE'."
for VAR in DOMAIN ADMIN JWT_SECRET; do
if [ -n "${!VAR}" ]; then
VAR_LOWER=$(echo "$VAR" | tr '[:upper:]' '[:lower:]')
echo ">> Processing secret: '$VAR_LOWER'"
(echo "${!VAR}" | npx wrangler secret put "$VAR_LOWER" --name "$WORKER_NAME" -c "$CONFIG_FILE") || true
else
echo "⚠️ Warning: GitHub Secret '$VAR' is not set. Skipping."
fi
done
echo "✨ Secret processing complete."
- name: 🛠️ Prepare Config and Deploy
working-directory: ./mail-worker
run: |
CONFIG_FILE="wrangler-action.toml"
echo "⚙️ Dynamically updating '$CONFIG_FILE' with binding IDs..."
# 确保 sed 命令作用于 wrangler-action.toml 文件
sed -i "s|\${D1_DATABASE_ID}|${D1_DATABASE_ID}|g" "$CONFIG_FILE"
sed -i "s|\${KV_NAMESPACE_ID}|${KV_NAMESPACE_ID}|g" "$CONFIG_FILE"
sed -i "s|\${R2_BUCKET_NAME}|${R2_BUCKET_NAME}|g" "$CONFIG_FILE"
echo "🚀 Configuration updated. Starting deployment..."
npx wrangler deploy -c "$CONFIG_FILE" | grep -v "https://.*\.workers\.dev" || true
echo "✅ Deployment command executed."
- name: 🗄️ Initialize Database (if INIT_URL is set)
run: |
if [ -z "$INIT_URL" ]; then
echo "✅ Deployment successful. INIT_URL not set, skipping initialization."
exit 0
fi
echo "⏳ Waiting 10 秒之前 before checking initialization status..."
sleep 10
HTTP_CODE=$(curl -s -w "%{http_code}" -o response.txt "$INIT_URL")
RESPONSE_BODY=$(cat response.txt)
echo "🔎 Checking response... (Status: $HTTP_CODE)"
if [ "$HTTP_CODE" = "200" ] && [ "$RESPONSE_BODY" = "初始化成功" ]; then
echo "🎉✅ Fresh initialization successful!"
elif [ "$HTTP_CODE" = "200" ]; then
echo "✅ Database is already initialized or in a stable state. Response: $RESPONSE_BODY"
else
echo "⚠️ Database initialization check failed with HTTP status: $HTTP_CODE. Please check your worker logs."
fi
- name: 📣 Notify Final Status
if: always()
run: |
if [ "${{ job.status }}" == "success" ]; then
echo "🎉🎉🎉 Hooray! Deployment completed successfully! 🎉🎉🎉"
else
echo "❌❌❌ Oh no! The deployment failed. Please check the logs above for errors. ❌❌❌"
fi
- name: Delete workflow runs
uses: GitRML/delete-workflow-runs@main
with:
retain_days: '3'
keep_minimum_runs: '0'