Created
August 27, 2021 18:17
-
-
Save brookpatten/6e66bac141ce80f8590c9c022601b82d to your computer and use it in GitHub Desktop.
Github Container Registry Version Cleanup
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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