Skip to content

Instantly share code, notes, and snippets.

@brookpatten
Created August 27, 2021 18:17
Show Gist options
  • Save brookpatten/6e66bac141ce80f8590c9c022601b82d to your computer and use it in GitHub Desktop.
Save brookpatten/6e66bac141ce80f8590c9c022601b82d to your computer and use it in GitHub Desktop.
Github Container Registry Version Cleanup
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Flurl;
using Flurl.Http;
namespace gh_container_version_cleanup
{
class Program
{
static async Task Main(string[] args)
{
//Console.Write("User PAT: ");
string pat = "pat";//Console.ReadLine();
//Console.Write("Org: ");
string org = "org";//Console.ReadLine();
//Console.Write("Package: ");
string package = "package";//Console.ReadLine();.
DateTime cutOff = DateTime.UtcNow - new TimeSpan(30, 0, 0, 0);
int perPage = 100;
int page = 0;
var versions = new List<dynamic>();
IList<dynamic> batch;
do
{
string url = $"https://api.github.com/orgs/{org}/packages/container/{package}/versions?per_page={perPage}&page={page}";
batch = await url
.WithHeaders(new
{
Accept = "application/vnd.github.v3+json",
User_Agent = "package-ops"
})
.WithOAuthBearerToken(pat)
.GetJsonListAsync();
versions.AddRange(batch);
page++;
} while (batch.Count == perPage);
Console.WriteLine("Found " + versions.Count + "versions");
foreach(var version in versions)
{
var uniqueTags = new List<string>();
string allTagsString = "";
foreach(var tag in version.metadata.container.tags)
{
if(!tag.ToString().StartsWith("v")
&& !tag.ToString().StartsWith("build-")
&& !tag.ToString().StartsWith("branch-")
)
{
uniqueTags.Add(tag.ToString());
}
allTagsString += tag + "; ";
}
if(uniqueTags.Count>0)
{
//keep it
}
else if((DateTime)version.updated_at > cutOff)
{
//keep it
}
else
{
//delete it
Console.WriteLine("Deleting " + allTagsString+" "+ version.name+" built "+version.updated_at);
var deleteUrl = $"https://api.github.com/orgs/{org}/packages/container/{package}/versions/{version.id}";
try
{
var deleteResult = await deleteUrl.WithHeaders(new
{
Accept = "application/vnd.github.v3+json",
User_Agent = "gps-devops"
})
.WithOAuthBearerToken(pat)
.DeleteAsync();
}
catch(Exception ex)
{
Console.WriteLine("Failed to delete");
}
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment