name: Deploy to Cloudflare Pages on: push: branches: - main workflow_dispatch: env: OAUTH_DIR: oauth KEEP_DEPLOYMENTS: 5 jobs: deploy: runs-on: ubuntu-latest permissions: contents: read deployments: write steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '21' - name: Install dependencies run: | cd ${{ env.OAUTH_DIR }} npm install - name: Build OAuth app run: | cd ${{ env.OAUTH_DIR }} NODE_ENV=production npm run build - name: Copy OAuth build to static run: | rm -rf my-blog/static/assets cp -rf ${{ env.OAUTH_DIR }}/dist/* my-blog/static/ cp ${{ env.OAUTH_DIR }}/dist/index.html my-blog/templates/oauth-assets.html - name: Cache ailog binary uses: actions/cache@v4 with: path: ./bin key: ailog-bin-${{ runner.os }} restore-keys: | ailog-bin-${{ runner.os }} - name: Setup ailog binary run: | # Get expected version from Cargo.toml EXPECTED_VERSION=$(grep '^version' Cargo.toml | cut -d'"' -f2) echo "Expected version from Cargo.toml: $EXPECTED_VERSION" # Check current binary version if exists if [ -f "./bin/ailog" ]; then CURRENT_VERSION=$(./bin/ailog --version 2>/dev/null || echo "unknown") echo "Current binary version: $CURRENT_VERSION" else CURRENT_VERSION="none" echo "No binary found" fi # Check OS OS="${{ runner.os }}" echo "Runner OS: $OS" # Use pre-packaged binary if version matches or extract from tar.gz if [ "$CURRENT_VERSION" = "$EXPECTED_VERSION" ]; then echo "Binary is up to date" chmod +x ./bin/ailog elif [ "$OS" = "Linux" ] && [ -f "./bin/ailog-linux-x86_64.tar.gz" ]; then echo "Extracting ailog from pre-packaged tar.gz..." cd bin tar -xzf ailog-linux-x86_64.tar.gz chmod +x ailog cd .. # Verify extracted version EXTRACTED_VERSION=$(./bin/ailog --version 2>/dev/null || echo "unknown") echo "Extracted binary version: $EXTRACTED_VERSION" if [ "$EXTRACTED_VERSION" != "$EXPECTED_VERSION" ]; then echo "Warning: Binary version mismatch. Expected $EXPECTED_VERSION but got $EXTRACTED_VERSION" fi else echo "Error: No suitable binary found for OS: $OS" exit 1 fi - name: Build site with ailog run: | cd my-blog ../bin/ailog build - name: List public directory run: | ls -la my-blog/public/ - name: Deploy to Cloudflare Pages uses: cloudflare/pages-action@v1 with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} projectName: ${{ secrets.CLOUDFLARE_PROJECT_NAME }} directory: my-blog/public gitHubToken: ${{ secrets.GITHUB_TOKEN }} wranglerVersion: '3' cleanup: needs: deploy runs-on: ubuntu-latest if: success() steps: - name: Cleanup old deployments run: | curl -X PATCH \ "https://api.cloudflare.com/client/v4/accounts/${{ secrets.CLOUDFLARE_ACCOUNT_ID }}/pages/projects/${{ secrets.CLOUDFLARE_PROJECT_NAME }}" \ -H "Authorization: Bearer ${{ secrets.CLOUDFLARE_API_TOKEN }}" \ -H "Content-Type: application/json" \ -d "{ \"deployment_configs\": { \"production\": { \"deployment_retention\": ${{ env.KEEP_DEPLOYMENTS }} } } }" # Get all deployments DEPLOYMENTS=$(curl -s -X GET \ "https://api.cloudflare.com/client/v4/accounts/${{ secrets.CLOUDFLARE_ACCOUNT_ID }}/pages/projects/${{ secrets.CLOUDFLARE_PROJECT_NAME }}/deployments" \ -H "Authorization: Bearer ${{ secrets.CLOUDFLARE_API_TOKEN }}" \ -H "Content-Type: application/json") # Extract deployment IDs (skip the latest N deployments) DEPLOYMENT_IDS=$(echo "$DEPLOYMENTS" | jq -r ".result | sort_by(.created_on) | reverse | .[${{ env.KEEP_DEPLOYMENTS }}:] | .[].id // empty") if [ -z "$DEPLOYMENT_IDS" ]; then echo "No old deployments to delete" exit 0 fi # Delete old deployments for ID in $DEPLOYMENT_IDS; do echo "Deleting deployment: $ID" RESPONSE=$(curl -s -X DELETE \ "https://api.cloudflare.com/client/v4/accounts/${{ secrets.CLOUDFLARE_ACCOUNT_ID }}/pages/projects/${{ secrets.CLOUDFLARE_PROJECT_NAME }}/deployments/$ID" \ -H "Authorization: Bearer ${{ secrets.CLOUDFLARE_API_TOKEN }}" \ -H "Content-Type: application/json") SUCCESS=$(echo "$RESPONSE" | jq -r '.success') if [ "$SUCCESS" = "true" ]; then echo "Successfully deleted deployment: $ID" else echo "Failed to delete deployment: $ID" echo "$RESPONSE" | jq . fi sleep 1 # Rate limiting done echo "Cleanup completed!"