158 lines
5.1 KiB
YAML
158 lines
5.1 KiB
YAML
name: Deploy to Cloudflare Pages
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
workflow_dispatch:
|
|
|
|
env:
|
|
OAUTH_DIR: oauth_new
|
|
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: Wait for deployment to complete
|
|
run: sleep 3
|
|
|
|
- name: Cleanup old deployments
|
|
run: |
|
|
# 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!"
|