name: Cleanup Old Artifacts on: schedule: # Run daily at 03:00 UTC (after database build) - cron: '0 3 * * *' workflow_dispatch: # Allow manual triggering inputs: retention_days: description: 'Keep artifacts newer than X days' required: false default: '30' type: string dry_run: description: 'Dry run (list only, do not delete)' required: false default: false type: boolean permissions: actions: write contents: read jobs: cleanup: runs-on: ubuntu-latest timeout-minutes: 30 steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup GitHub CLI run: | # GitHub CLI is pre-installed on ubuntu-latest gh --version - name: List and cleanup old artifacts env: GH_TOKEN: ${{ github.token }} run: | # Configuration RETENTION_DAYS="${{ github.event.inputs.retention_days || '30' }}" DRY_RUN="${{ github.event.inputs.dry_run || 'false' }}" CUTOFF_DATE=$(date -u -d "$RETENTION_DAYS days ago" +%s) echo "๐Ÿงน Artifact Cleanup Configuration" echo "==================================" echo "Retention days: $RETENTION_DAYS" echo "Cutoff date: $(date -u -d "@$CUTOFF_DATE" '+%Y-%m-%d %H:%M:%S UTC')" echo "Dry run: $DRY_RUN" echo "" # Get all artifacts echo "๐Ÿ“ฆ Fetching artifacts..." ARTIFACTS=$(gh api \ -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ "/repos/${{ github.repository }}/actions/artifacts?per_page=100" \ | jq -r '.artifacts[]') if [ -z "$ARTIFACTS" ]; then echo "No artifacts found" exit 0 fi # Initialize counters TOTAL_COUNT=0 DELETE_COUNT=0 KEEP_COUNT=0 SPACE_FREED=0 # Create summary arrays declare -a TO_DELETE declare -a TO_KEEP # Process each artifact while IFS= read -r artifact; do ID=$(echo "$artifact" | jq -r '.id') NAME=$(echo "$artifact" | jq -r '.name') SIZE=$(echo "$artifact" | jq -r '.size_in_bytes') CREATED=$(echo "$artifact" | jq -r '.created_at') EXPIRED=$(echo "$artifact" | jq -r '.expired') # Convert created_at to timestamp CREATED_TS=$(date -u -d "$CREATED" +%s) TOTAL_COUNT=$((TOTAL_COUNT + 1)) # Check if artifact should be deleted if [ "$EXPIRED" = "true" ] || [ $CREATED_TS -lt $CUTOFF_DATE ]; then DELETE_COUNT=$((DELETE_COUNT + 1)) SPACE_FREED=$((SPACE_FREED + SIZE)) SIZE_MB=$(echo "scale=2; $SIZE / 1024 / 1024" | bc) AGE_DAYS=$(echo "($CUTOFF_DATE - $CREATED_TS) / 86400" | bc) TO_DELETE+=("| $NAME | $SIZE_MB MB | $(date -u -d "$CREATED" '+%Y-%m-%d') | $AGE_DAYS days old |") if [ "$DRY_RUN" = "false" ]; then echo "๐Ÿ—‘๏ธ Deleting: $NAME (ID: $ID, Size: $SIZE_MB MB, Age: $AGE_DAYS days)" gh api \ --method DELETE \ -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ "/repos/${{ github.repository }}/actions/artifacts/$ID" \ && echo " โœ“ Deleted" || echo " โœ— Failed to delete" else echo "๐Ÿ” Would delete: $NAME (ID: $ID, Size: $SIZE_MB MB, Age: $AGE_DAYS days)" fi else KEEP_COUNT=$((KEEP_COUNT + 1)) SIZE_MB=$(echo "scale=2; $SIZE / 1024 / 1024" | bc) AGE_DAYS=$(echo "($(date +%s) - $CREATED_TS) / 86400" | bc) TO_KEEP+=("| $NAME | $SIZE_MB MB | $(date -u -d "$CREATED" '+%Y-%m-%d') | $AGE_DAYS days old |") fi done < <(gh api \ -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ "/repos/${{ github.repository }}/actions/artifacts?per_page=100" \ | jq -c '.artifacts[]') # Calculate space freed in MB SPACE_FREED_MB=$(echo "scale=2; $SPACE_FREED / 1024 / 1024" | bc) echo "" echo "๐Ÿ“Š Cleanup Summary" echo "==================" echo "Total artifacts: $TOTAL_COUNT" echo "Deleted/Would delete: $DELETE_COUNT" echo "Kept: $KEEP_COUNT" echo "Space freed: $SPACE_FREED_MB MB" # Create GitHub Actions summary cat >> $GITHUB_STEP_SUMMARY <> $GITHUB_STEP_SUMMARY <> $GITHUB_STEP_SUMMARY fi # Add kept artifacts table if any if [ $KEEP_COUNT -gt 0 ]; then cat >> $GITHUB_STEP_SUMMARY <> $GITHUB_STEP_SUMMARY if [ $KEEP_COUNT -gt 10 ]; then echo "" >> $GITHUB_STEP_SUMMARY echo "*...and $((KEEP_COUNT - 10)) more*" >> $GITHUB_STEP_SUMMARY fi fi cat >> $GITHUB_STEP_SUMMARY <> $GITHUB_STEP_SUMMARY <