From db890fba0d2438cbfd6c42703cb2bda3be0e4c41 Mon Sep 17 00:00:00 2001 From: eoao <34203076+eoao@users.noreply.github.com> Date: Wed, 9 Jul 2025 16:35:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20GitHub=20Actions=20?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8C=96=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Abner <22141172+Silentely@users.noreply.github.com> --- .github/workflows/deploy-cloudflare.yml | 117 ++++++++++++++++++++++++ README.md | 30 +++--- {demo => doc/demo}/demo1.png | Bin {demo => doc/demo}/demo2.png | Bin {demo => doc/demo}/demo3.png | Bin {demo => doc/demo}/demo4.png | Bin {demo => doc/demo}/demo5.png | Bin {demo => doc/demo}/demo6.png | Bin {demo => doc/demo}/demo7.png | Bin {demo => doc/demo}/demo8.png | Bin {demo => doc/demo}/logo.png | Bin doc/github-action.md | 38 ++++++++ mail-worker/wrangler-action.toml | 36 ++++++++ 13 files changed, 206 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/deploy-cloudflare.yml rename {demo => doc/demo}/demo1.png (100%) rename {demo => doc/demo}/demo2.png (100%) rename {demo => doc/demo}/demo3.png (100%) rename {demo => doc/demo}/demo4.png (100%) rename {demo => doc/demo}/demo5.png (100%) rename {demo => doc/demo}/demo6.png (100%) rename {demo => doc/demo}/demo7.png (100%) rename {demo => doc/demo}/demo8.png (100%) rename {demo => doc/demo}/logo.png (100%) create mode 100644 doc/github-action.md create mode 100644 mail-worker/wrangler-action.toml diff --git a/.github/workflows/deploy-cloudflare.yml b/.github/workflows/deploy-cloudflare.yml new file mode 100644 index 0000000..f949f9e --- /dev/null +++ b/.github/workflows/deploy-cloudflare.yml @@ -0,0 +1,117 @@ +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' \ No newline at end of file diff --git a/README.md b/README.md index 3cc962c..ad92521 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
-
+