Skip to content

Instantly share code, notes, and snippets.

@DPatrickBoyd
Created April 20, 2023 22:51
Show Gist options
  • Save DPatrickBoyd/afb54165df0f51903be3f0edea77f9cb to your computer and use it in GitHub Desktop.
Save DPatrickBoyd/afb54165df0f51903be3f0edea77f9cb to your computer and use it in GitHub Desktop.
#!/bin/bash
# Change the date under CUTOFF_DATE to change how far back you want to delete
# Install the GitHub CLI tool by following the instructions in the official documentation: https://cli.github.com/manual/installation
# Make sure you auth first to github with 'gh auth login'
REPO_OWNER="OWNER"
REPO_NAME="REPO_NAME"
CUTOFF_DATE=$(date --date='30 days ago' +'%Y-%m-%dT%H:%M:%SZ')
PAGE=1
while true; do
# Retrieve a page of artifacts
ART_EXIST=$(gh api repos/$REPO_OWNER/$REPO_NAME/actions/artifacts?per_page=100\&page=$PAGE | jq -r '.artifacts[]')
ARTIFACTS=$(gh api repos/$REPO_OWNER/$REPO_NAME/actions/artifacts?per_page=100\&page=$PAGE | jq -r '.artifacts[] | select(.created_at < "'"$CUTOFF_DATE"'") | .id')
echo $PAGE
# If there are no more artifacts, exit the loop
if [[ -z "$ART_EXIST" ]]; then
break
fi
# Loop through the artifacts on this page and delete the old ones
for ARTIFACT_ID in $ARTIFACTS; do
ARTIFACT_NAME=$(gh api repos/$REPO_OWNER/$REPO_NAME/actions/artifacts/$ARTIFACT_ID | jq -r '.name')
echo "Deleting artifact $ARTIFACT_NAME (ID: $ARTIFACT_ID)..."
gh api repos/$REPO_OWNER/$REPO_NAME/actions/artifacts/$ARTIFACT_ID -X DELETE
done
# Increment the page counter
PAGE=$((PAGE+1))
done
@RealDyllon
Copy link

Thanks for sharing this! You might want to add --silent at the end of the delete call so that the script doesn't get interrupted by the response body.

@dijitali
Copy link

Tweaked the PowerShell option above to support the pagination, different retention for the main branch and include some size estimates in the output:

$repoOwner = "OWNER"
$repoName = "REPO_NAME"
$mainRetentionDate = (Get-Date).AddDays(-30)
$branchRetentionDate = (Get-Date).AddDays(-7)
$pageSize = 100
$page = 1

# Retrieve first page of artifacts
$response = gh api "repos/$repoOwner/$repoName/actions/artifacts?per_page=$pageSize&page=$page" | ConvertFrom-Json
$total_pages = [math]::Ceiling(($response.total_count / $pageSize))

$artifacts = $response.artifacts

# Paginate remainder
for ($page = 2; $page -le $total_pages; $page++) {
  $response = gh api "repos/$repoOwner/$repoName/actions/artifacts?per_page=$pageSize&page=$page" | ConvertFrom-Json
  $artifacts += $response.artifacts
}

Write-Host ('Total artifact count: ' + $artifacts.Length)
Write-Host ('Total artifact size (bytes): ' + ($artifacts | Measure-Object -Property size_in_bytes -Sum).Sum)

$spaceSaved = 0
foreach ($artifact in $artifacts) {
  switch ($artifact.workflow_run_head_branch) {
    'main' { 
      if ( (Get-Date $artifact.created_at) -lt $mainRetentionDate) {
        Write-Host ('Removing artifact with id: ' + $artifact.id + `
            ' name: ' + $artifact.name + `
            ' created at ' + $artifact.created_at + `
            ' for branch ' + $artifact.workflow_run.head_branch)
        
        #Remove
        gh api "repos/$repoOwner/$repoName/actions/artifacts/$($artifact.id)" -X Delete --silent | Out-Null
        
        $spaceSaved += $artifact.size_in_bytes
      }
    }
    Default {
      if ( (Get-Date $artifact.created_at) -lt $branchRetentionDate) {
        Write-Host ('Removing artifact with id: ' + $artifact.id + `
            ' name: ' + $artifact.name + `
            ' created at ' + $artifact.created_at + `
            ' for branch ' + $artifact.workflow_run.head_branch)
        
        #Remove
        gh api "repos/$repoOwner/$repoName/actions/artifacts/$($artifact.id)" -X Delete | Out-Null

        $spaceSaved += $artifact.size_in_bytes
      }
    }
  }
}

Write-Host 'Total space saved (bytes): ' $spaceSaved

e.g.:

Total artifact count: 279
Total artifact size (bytes): 1331854445
...
Removing artifact with id: 1859067075 name: playwright-report created at 08/27/2024 10:50:44 for branch main
Removing artifact with id: 1859064083 name: hugo-public created at 08/27/2024 10:49:57 for branch main
Removing artifact with id: 1846106084 name: playwright-report created at 08/23/2024 08:18:41 for branch main
Removing artifact with id: 1846079142 name: playwright-report created at 08/23/2024 08:11:01 for branch main
Removing artifact with id: 1833212961 name: playwright-report created at 08/20/2024 15:50:48 for branch main
Total space saved (bytes):  1207672413

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment