name: Deploy to Cloudflare Pages on: workflow_run: workflows: [CI] types: [completed] workflow_dispatch: {} jobs: deploy: if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }} runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node uses: actions/setup-node@v4 with: node-version: 22 - name: Install dependencies run: cd frontend && npm ci - name: Build run: cd frontend && npm run build - name: Generate deployment manifest run: | cd frontend/dist echo "{" > manifest.json first=true for file in $(find . -type f | sed 's|^\./||'); do hash=$(sha256sum "$file" | awk '{print $1}') if [ "$first" = true ]; then first=false else echo "," >> manifest.json fi printf ' "%s": "%s"' "$file" "$hash" >> manifest.json done echo "" >> manifest.json echo "}" >> manifest.json echo "Generated manifest with $(grep -c ':' manifest.json) files" - name: Deploy to Cloudflare Pages env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} run: | cd frontend/dist # Build multipart form arguments from all files + manifest form_args="-F manifest=@manifest.json" for file in $(find . -type f ! -name manifest.json | sed 's|^\./||'); do form_args="$form_args -F $file=@$file" done # Get short commit hash for deployment metadata COMMIT_HASH=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") COMMIT_MSG=$(git log -1 --pretty=%B 2>/dev/null | head -1 || echo "Gitea Actions deploy") curl -sS -X POST \ "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/pages/projects/linearvoid/deployments" \ -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \ -F "commit_hash=${COMMIT_HASH}" \ -F "commit_message=${COMMIT_MSG}" \ -F "commit_dirty=false" \ $form_args