diff --git a/.gitea/workflows/build dev.yaml b/.gitea/workflows/build dev.yaml index 6fb42c5..b5563cf 100644 --- a/.gitea/workflows/build dev.yaml +++ b/.gitea/workflows/build dev.yaml @@ -31,39 +31,42 @@ jobs: with: name: version - - name: Build package + - name: Build single file executables run: | cd sh.actions/sh.actions.package-cleanup - dotnet build -c Release -p:Version=$(cat ../../version.txt) - - name: Configure nuget - run: | - dotnet nuget add source --name git_sh-edraft_de --username ${{ secrets.CI_USERNAME }} --password ${{ secrets.CI_ACCESS_TOKEN }} --store-password-in-clear-text https://git.sh-edraft.de/api/packages/sh-edraft.de/nuget/index.json + # Build for Linux x64 + dotnet publish -c Release -r linux-x64 -p:Version=$(cat ../../version.txt) -o publish/linux-x64 - - name: Upload + - name: Upload to Gitea Generic Package Registry run: | cd sh.actions/sh.actions.package-cleanup - VERSION_FIXED=$(cat ../../version.txt | sed 's/\.0\([0-9]\)/.\1/g' | sed 's/\.0-/-/g') - dotnet nuget push --source git_sh-edraft_de bin/Release/sh.actions.package-cleanup.$VERSION_FIXED.nupkg + curl -X PUT \ + -H "Authorization: token ${{ secrets.CI_ACCESS_TOKEN }}" \ + -T publish/linux-x64/sh.actions.package-cleanup \ + "https://git.sh-edraft.de/api/packages/sh-edraft.de/generic/package-cleanup/$(cat ../../version.txt)/package-cleanup-linux-x64" - test: - runs-on: [runner] - needs: build - container: git.sh-edraft.de/sh-edraft.de/act-runner:latest - steps: - - name: Configure nuget - run: | - dotnet nuget add source --name git_sh-edraft_de --username ${{ secrets.CI_USERNAME }} --password ${{ secrets.CI_ACCESS_TOKEN }} --store-password-in-clear-text https://git.sh-edraft.de/api/packages/sh-edraft.de/nuget/index.json + # test: + # runs-on: [runner] + # needs: build + # container: git.sh-edraft.de/sh-edraft.de/act-runner:latest + # steps: + # - name: Download and test package-cleanup tool + # shell: bash + # run: | + # # Create tools directory + # mkdir -p .tools - - name: Install package-cleanup tool - shell: bash - run: | - dotnet tool install \ - --tool-path .tools \ - package-cleanup \ - --source sh-git_sh-edraft_de + # # Download the Linux x64 version (since we're running on Linux) + # VERSION=$(curl -s https://git.sh-edraft.de/api/packages/sh-edraft.de/generic/package-cleanup | jq -r '.versions[0].name') + # curl -L -H "Authorization: token ${{ secrets.CI_ACCESS_TOKEN }}" \ + # -o .tools/package-cleanup \ + # "https://git.sh-edraft.de/api/packages/sh-edraft.de/generic/package-cleanup/$VERSION/package-cleanup-linux-x64" - - name: Run package-cleanup - shell: bash - run: | - ./.tools/sh.actions.package-cleanup + # # Make executable + # chmod +x .tools/package-cleanup + + # - name: Run package-cleanup + # shell: bash + # run: | + # ./.tools/package-cleanup diff --git a/sh.actions/sh.actions.package-cleanup/Models/GiteaConfig.cs b/sh.actions/sh.actions.package-cleanup/Models/GiteaConfig.cs new file mode 100644 index 0000000..ae76675 --- /dev/null +++ b/sh.actions/sh.actions.package-cleanup/Models/GiteaConfig.cs @@ -0,0 +1,23 @@ +namespace sh.actions.package_cleanup.Models; + +/// +/// Konfiguration für Gitea-Verbindung +/// +public class GiteaConfig +{ + /// + /// Basis-URL der Gitea-Instanz (z.B. https://git.example.com) + /// + public string GiteaUrl { get; set; } = string.Empty; + + /// + /// API-Token für Authentifizierung + /// + public string ApiToken { get; set; } = string.Empty; + + /// + /// Owner/Username des Pakets + /// + public string Owner { get; set; } = string.Empty; +} + diff --git a/sh.actions/sh.actions.package-cleanup/Models/GiteaPackage.cs b/sh.actions/sh.actions.package-cleanup/Models/GiteaPackage.cs new file mode 100644 index 0000000..d72720f --- /dev/null +++ b/sh.actions/sh.actions.package-cleanup/Models/GiteaPackage.cs @@ -0,0 +1,10 @@ +namespace sh.actions.package_cleanup.Models; + +public class GiteaPackage +{ + public int Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Version { get; set; } = string.Empty; + public string Type { get; set; } = string.Empty; + public DateTime CreatedAt { get; set; } +} \ No newline at end of file diff --git a/sh.actions/sh.actions.package-cleanup/Program.cs b/sh.actions/sh.actions.package-cleanup/Program.cs index cb1afde..05d239c 100644 --- a/sh.actions/sh.actions.package-cleanup/Program.cs +++ b/sh.actions/sh.actions.package-cleanup/Program.cs @@ -1,2 +1,65 @@ // See https://aka.ms/new-console-template for more information -Console.WriteLine("Hello, World! from ci"); +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using sh.actions.package_cleanup.Models; +using sh.actions.package_cleanup.Service; + +Console.WriteLine("Hello, World!"); +// +// // Setup Dependency Injection +// var services = new ServiceCollection(); +// +// // Add Logging +// services.AddLogging(builder => +// builder.AddConsole() +// .SetMinimumLevel(LogLevel.Information) +// ); +// +// // Load configuration from environment variables or appsettings +// var giteaUrl = Environment.GetEnvironmentVariable("GITEA_URL") ?? "https://git.example.com"; +// var apiToken = Environment.GetEnvironmentVariable("GITEA_API_TOKEN") ?? string.Empty; +// var owner = Environment.GetEnvironmentVariable("GITEA_OWNER") ?? "sh-edraft"; +// +// var giteaConfig = new GiteaConfig +// { +// GiteaUrl = giteaUrl, +// ApiToken = apiToken, +// Owner = owner +// }; +// +// services.AddSingleton(giteaConfig); +// +// // Add HttpClient +// services.AddHttpClient(); +// +// // Build service provider +// var serviceProvider = services.BuildServiceProvider(); +// +// try +// { +// // Get the service and execute +// var packageService = serviceProvider.GetRequiredService(); +// var logger = serviceProvider.GetRequiredService>(); +// +// logger.LogInformation("Starting package cleanup tool"); +// logger.LogInformation("Gitea URL: {GiteaUrl}", giteaUrl); +// logger.LogInformation("Owner: {Owner}", owner); +// +// using var cts = new CancellationTokenSource(); +// var packages = await packageService.GetPackagesByOwnerAsync(cts.Token); +// +// logger.LogInformation("Retrieved {Count} packages", packages.Count()); +// +// foreach (var package in packages) +// { +// logger.LogInformation("Package: {Name} (Version: {Version})", package.Name, package.Version); +// } +// +// logger.LogInformation("Package cleanup tool completed successfully"); +// } +// catch (Exception ex) +// { +// var logger = serviceProvider.GetRequiredService>(); +// logger.LogError(ex, "Application error"); +// Environment.Exit(1); +// } diff --git a/sh.actions/sh.actions.package-cleanup/README.md b/sh.actions/sh.actions.package-cleanup/README.md deleted file mode 100644 index 07f0087..0000000 --- a/sh.actions/sh.actions.package-cleanup/README.md +++ /dev/null @@ -1 +0,0 @@ -# Gitea package cleanup \ No newline at end of file diff --git a/sh.actions/sh.actions.package-cleanup/Service/GiteaPackageService.cs b/sh.actions/sh.actions.package-cleanup/Service/GiteaPackageService.cs index 6594406..bd13abe 100644 --- a/sh.actions/sh.actions.package-cleanup/Service/GiteaPackageService.cs +++ b/sh.actions/sh.actions.package-cleanup/Service/GiteaPackageService.cs @@ -1,6 +1,48 @@ namespace sh.actions.package_cleanup.Service; -public class GiteaPackageService : IGiteaPackageService +using System.Net.Http.Json; +using Microsoft.Extensions.Logging; +using sh.actions.package_cleanup.Models; + +public class GiteaPackageService(HttpClient httpClient, GiteaConfig config, ILogger logger) + : IGiteaPackageService { - + public async Task> GetPackagesByOwnerAsync(CancellationToken cancellationToken = default) + { + try + { + var url = $"{config.GiteaUrl.TrimEnd('/')}/api/v1/packages/{config.Owner}"; + + logger.LogInformation("Fetching packages from Gitea: {Url}", url); + + var request = new HttpRequestMessage(HttpMethod.Get, url); + + // Add authentication if token is provided + if (!string.IsNullOrEmpty(config.ApiToken)) + { + request.Headers.Add("Authorization", $"token {config.ApiToken}"); + } + + var response = await httpClient.SendAsync(request, cancellationToken); + response.EnsureSuccessStatusCode(); + + var packages = + await response.Content.ReadFromJsonAsync>(cancellationToken: cancellationToken) + ?? new List(); + + logger.LogInformation("Successfully fetched {Count} packages", packages.Count); + + return packages; + } + catch (HttpRequestException ex) + { + logger.LogError(ex, "Error fetching packages from Gitea"); + throw; + } + catch (Exception ex) + { + logger.LogError(ex, "Unexpected error fetching packages"); + throw; + } + } } \ No newline at end of file diff --git a/sh.actions/sh.actions.package-cleanup/Service/IGiteaPackageService.cs b/sh.actions/sh.actions.package-cleanup/Service/IGiteaPackageService.cs index 3ec0b5a..bb3017e 100644 --- a/sh.actions/sh.actions.package-cleanup/Service/IGiteaPackageService.cs +++ b/sh.actions/sh.actions.package-cleanup/Service/IGiteaPackageService.cs @@ -1,6 +1,8 @@ namespace sh.actions.package_cleanup.Service; +using sh.actions.package_cleanup.Models; + public interface IGiteaPackageService { - + Task> GetPackagesByOwnerAsync(CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/sh.actions/sh.actions.package-cleanup/sh.actions.package-cleanup.csproj b/sh.actions/sh.actions.package-cleanup/sh.actions.package-cleanup.csproj index f5131f1..038a930 100644 --- a/sh.actions/sh.actions.package-cleanup/sh.actions.package-cleanup.csproj +++ b/sh.actions/sh.actions.package-cleanup/sh.actions.package-cleanup.csproj @@ -6,29 +6,26 @@ sh.actions.package_cleanup enable enable - - - true - package-cleanup - - sh.actions.package-cleanup 0.0.1 - sh-edraft gitea package cleanup - Tool to cleanup gitea packages - edraft - https://git.sh-edraft.de/sh-edraft.de/actions - https://git.sh-edraft.de/sh-edraft.de/actions - git - MIT - false - true - true - snupkg - README.md + + + true + true + true + true + full + + - + + + + + + +