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'