diff --git a/package-cleanup/action.yaml b/package-cleanup/action.yaml index dac5a53..68bdc74 100644 --- a/package-cleanup/action.yaml +++ b/package-cleanup/action.yaml @@ -1,19 +1,42 @@ name: "package cleanup" description: "Cleans up old packages and versions" +inputs: + url: + description: "Server URL" + required: true + names: + description: "Names of packages" + required: true + owner: + description: "Owner of the package" + required: true + types: + description: "Types of packages (e.g. Container, PyPi, NuGet)" + required: false + default: "Container,PyPi,NuGet" + api_token: + description: "API token for authentication" + required: true + runs: using: "composite" steps: - - name: Install set-version tool + - name: Download and test package-cleanup tool shell: bash run: | - dotnet tool install \ - --tool-path .tools \ - ShEdraft.SetVersion \ - --version 1.0.0 \ - --add-source https://git.sh-edraft.de/api/packages/sh-edraft.de/nuget/index.json + curl -OJ https://git.sh-edraft.de/api/packages/sh-edraft.de/generic/package-cleanup/package-cleanup-linux-x64 - - name: Run set-version + # Make executable + chmod +x package-cleanup-linux-x64 + + - name: Run package-cleanup shell: bash + env: + URL: ${{ inputs.url }} + OWNER: ${{ inputs.owner }} + TYPES: ${{ inputs.types }} + NAMES: ${{ inputs.names }} + API_TOKEN: ${{ inputs.api_token }} run: | - ./.tools/set-version --suffix dev + ./package-cleanup-linux-x64 diff --git a/sh.actions.package-cleanup/ConfigurationExtension.cs b/sh.actions.package-cleanup/ConfigurationExtension.cs index 8bd891e..e248316 100644 --- a/sh.actions.package-cleanup/ConfigurationExtension.cs +++ b/sh.actions.package-cleanup/ConfigurationExtension.cs @@ -15,7 +15,7 @@ public static class ConfigurationExtension public static IConfigurationBuilder EnsureGiteaConfig(this IConfigurationBuilder builder) { var configuration = builder.Build(); - var requiredKeys = new[] { "URL", "OWNER", "TYPE", "NAME", "API_TOKEN" }; + var requiredKeys = new[] { "URL", "OWNER", "TYPES", "NAME", "API_TOKEN" }; foreach (var key in requiredKeys) { diff --git a/sh.actions.package-cleanup/Service/GiteaPackageService.cs b/sh.actions.package-cleanup/Service/GiteaPackageService.cs index 4806331..3a95789 100644 --- a/sh.actions.package-cleanup/Service/GiteaPackageService.cs +++ b/sh.actions.package-cleanup/Service/GiteaPackageService.cs @@ -11,7 +11,7 @@ public class GiteaPackageService( : IGiteaPackageService { private string GetBaseUrl() => - $"{configuration["URL"]?.TrimEnd('/')}/packages/{configuration["OWNER"]}/{configuration["TYPE"]}/{configuration["NAME"]}"; + $"{configuration["URL"]?.TrimEnd('/')}/packages/{configuration["OWNER"]}"; private void AddAuthorizationHeader(HttpRequestMessage request) { @@ -28,32 +28,59 @@ public class GiteaPackageService( { var baseUrl = GetBaseUrl(); var allPackages = new List(); - var page = 1; + + // Parse comma-separated types + var types = (configuration["TYPE"] ?? "") + .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); - while (true) + if (types.Length == 0) { - var url = $"{baseUrl}?page={page}"; - logger.LogInformation("Fetching packages from Gitea: {Url}", url); + logger.LogWarning("No package types configured"); + return allPackages; + } - var request = new HttpRequestMessage(HttpMethod.Get, url); - AddAuthorizationHeader(request); + // Parse comma-separated names + var names = (configuration["NAMES"] ?? "") + .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); - var response = await httpClient.SendAsync(request, cancellationToken); - response.EnsureSuccessStatusCode(); + if (names.Length == 0) + { + logger.LogWarning("No package names configured"); + return allPackages; + } - var packages = - await response.Content.ReadFromJsonAsync>(cancellationToken: cancellationToken) - ?? []; - - if (packages.Count == 0) + foreach (var type in types) + { + foreach (var name in names) { - break; + var page = 1; + + while (true) + { + var url = $"{baseUrl}/{type}/{name}?page={page}"; + logger.LogInformation("Fetching packages from Gitea: {Url}", url); + + var request = new HttpRequestMessage(HttpMethod.Get, url); + AddAuthorizationHeader(request); + + var response = await httpClient.SendAsync(request, cancellationToken); + response.EnsureSuccessStatusCode(); + + var packages = + await response.Content.ReadFromJsonAsync>(cancellationToken: cancellationToken) + ?? []; + + if (packages.Count == 0) + { + break; + } + + allPackages.AddRange(packages); + logger.LogInformation("Fetched {Count} packages from page {Page}", packages.Count, page); + + page++; + } } - - allPackages.AddRange(packages); - logger.LogInformation("Fetched {Count} packages from page {Page}", packages.Count, page); - - page++; } logger.LogInformation("Successfully fetched {Count} packages in total", allPackages.Count); @@ -76,7 +103,7 @@ public class GiteaPackageService( try { var baseUrl = GetBaseUrl(); - var url = $"{baseUrl}/{package.Version}"; + var url = $"{baseUrl}/{package.Type}/{package.Name}/{package.Version}"; logger.LogInformation("Deleting package {PackageName} (ID: {PackageId}) from Gitea", package.Name, package.Id);