diff --git a/Alchegos.Gitea.Webhook.csproj b/Alchegos.Gitea.Webhook.csproj index a487bf3..b89cedd 100644 --- a/Alchegos.Gitea.Webhook.csproj +++ b/Alchegos.Gitea.Webhook.csproj @@ -1,13 +1,26 @@ - + net9.0 - enable + disable enable - dotnet-Alchegos.Gitea.Webhook-61e3506a-2cdc-487d-86e8-706d75fc08ee + Linux + - + + .dockerignore + + + + + + + + + + + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..59027c7 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base +USER $APP_UID +WORKDIR /app + +EXPOSE 8080 + +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["Alchegos.Gitea.Webhook/Alchegos.Gitea.Webhook.csproj", "Alchegos.Gitea.Webhook/"] +RUN dotnet restore "Alchegos.Gitea.Webhook/Alchegos.Gitea.Webhook.csproj" +COPY . . +WORKDIR "/src/Alchegos.Gitea.Webhook" +RUN dotnet build "Alchegos.Gitea.Webhook.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "Alchegos.Gitea.Webhook.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "Alchegos.Gitea.Webhook.dll"] diff --git a/Models/GiteaWebhookPayload.cs b/Models/GiteaWebhookPayload.cs new file mode 100644 index 0000000..1d66fa9 --- /dev/null +++ b/Models/GiteaWebhookPayload.cs @@ -0,0 +1,39 @@ +namespace Alchegos.Gitea.Webhook.Models; +using System.Text.Json.Serialization; + +public class GiteaWebhookPayload +{ + [JsonPropertyName("repository")] + public Repository? Repository { get; set; } + + [JsonPropertyName("pusher")] + public User? Pusher { get; set; } + + [JsonPropertyName("commits")] + public List? Commits { get; set; } + + [JsonPropertyName("head_commit")] + public CommitInfo? HeadCommit { get; set; } + +} + +public class Repository +{ + [JsonPropertyName("name")] + public string? Name { get; set; } +} + +public class User +{ + [JsonPropertyName("username")] + public string? UserName { get; set; } +} + +public class CommitInfo +{ + [JsonPropertyName("id")] + public string? Id { get; set; } + + [JsonPropertyName("message")] + public string? Message { get; set; } +} diff --git a/Program.cs b/Program.cs index 43204ea..c98edd5 100644 --- a/Program.cs +++ b/Program.cs @@ -1,7 +1,39 @@ -using Alchegos.Gitea.Webhook; +using Alchegos.Core; +using Alchegos.Core.Services.RabbitMQ; -var builder = Host.CreateApplicationBuilder(args); -builder.Services.AddHostedService(); -var host = builder.Build(); -host.Run(); \ No newline at end of file +GlobalRegistry.Instance.Start(); +var builder = WebApplication.CreateBuilder(args); +builder.Logging.ClearProviders(); +builder.Logging.AddConsole(); +builder.Services.Configure( + builder.Configuration.GetSection("RabbitMQ") +); + +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); + +builder.Services.AddSingleton(); +var app = builder.Build(); +var logger = app.Services.GetRequiredService>(); +logger.LogInformation("Starting web hook /webhook/gitea"); +app.MapPost("/webhook/gitea", async (HttpRequest request, HttpResponse response, IRabbitPublisher publisher) => +{ + logger.LogInformation("Received gitea webhook request"); + using var reader = new StreamReader(request.Body); + var jsonBody = await reader.ReadToEndAsync(); + + var giteaEvent = request.Headers["X-Gitea-Event"].ToString() ?? "unknown"; + + logger.LogInformation($"Received gitea webhook post: {giteaEvent}"); + logger.LogInformation($" {jsonBody}"); + + await publisher.PublishAsync( + exchange: "gitea.webhook.exchange", + routingKey: giteaEvent, + message: jsonBody + ); + response.StatusCode = 200; + await response.WriteAsync(jsonBody); +}); +app.Run(); \ No newline at end of file diff --git a/Worker.cs b/Worker.cs deleted file mode 100644 index 2936a40..0000000 --- a/Worker.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace Alchegos.Gitea.Webhook; - -public class Worker : BackgroundService -{ - private readonly ILogger _logger; - - public Worker(ILogger logger) - { - _logger = logger; - } - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - while (!stoppingToken.IsCancellationRequested) - { - if (_logger.IsEnabled(LogLevel.Information)) - { - _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); - } - - await Task.Delay(1000, stoppingToken); - } - } -} \ No newline at end of file diff --git a/appsettings.json b/appsettings.json index b2dcdb6..6ddefde 100644 --- a/appsettings.json +++ b/appsettings.json @@ -4,5 +4,11 @@ "Default": "Information", "Microsoft.Hosting.Lifetime": "Information" } + }, + "RabbitMQ": { + "HostName": "rabbitmq", + "Username": "guest", + "Password": "guest", + "Port": "5672" } }