Skip to content

Cleanup old Cloudflare Deployments #88

Cleanup old Cloudflare Deployments

Cleanup old Cloudflare Deployments #88

name: Cleanup old Cloudflare Deployments
on:
schedule:
- cron: "0 0 * * *" # Runs every day at midnight UTC
workflow_dispatch: # Allows manual triggering
permissions:
contents: read
jobs:
cleanup-deployments:
runs-on: ubuntu-latest
env:
CF_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
CF_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
PROJECT_NAME: groveld
RETENTION_SECONDS: 172800 # 2 days in seconds
steps:
- name: Cleanup old deployments
run: |
set -euo pipefail
deployments=$(curl -s -X GET \
"https://api.cloudflare.com/client/v4/accounts/${CF_ACCOUNT_ID}/pages/projects/${PROJECT_NAME}/deployments" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json")
success=$(echo "$deployments" | jq -r '.success')
if [[ "$success" != "true" ]]; then
echo "Failed to fetch deployments:"
echo "$deployments"
exit 1
fi
cutoff_epoch=$(($(date +%s) - RETENTION_SECONDS))
echo "$deployments" | jq -c '.result[]' | while read -r deployment; do
deployment_id=$(echo "$deployment" | jq -r '.id')
created_on=$(echo "$deployment" | jq -r '.created_on')
deployment_epoch=$(date -d "$created_on" +%s)
deployment_status=$(echo "$deployment" | jq -r '.latest_stage.status')
is_live=$(echo "$deployment" | jq '.aliases | length > 0')
is_production=$(echo "$deployment" | jq '.production_environment != null')
if [[ "$deployment_epoch" -lt "$cutoff_epoch" && \
"$is_live" == "false" && \
"$is_production" == "false" && \
"$deployment_status" == "success" ]]; then
echo "Deleting deployment: $deployment_id (created_on: $created_on)"
delete_response=$(curl -s -X DELETE \
"https://api.cloudflare.com/client/v4/accounts/${CF_ACCOUNT_ID}/pages/projects/${PROJECT_NAME}/deployments/${deployment_id}" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json")
delete_success=$(echo "$delete_response" | jq -r '.success')
if [[ "$delete_success" != "true" ]]; then
echo "Failed to delete deployment $deployment_id:"
echo "$delete_response"
else
echo "Successfully deleted deployment $deployment_id."
fi
else
echo "Keeping deployment: $deployment_id (created_on: $created_on)"
fi
done