tools/pipeline-witness/Azure.Sdk.Tools.PipelineWitness/Startup.cs (79 lines of code) (raw):
using System;
using System.Threading;
using Azure.Core;
using Azure.Core.Extensions;
using Azure.Identity;
using Azure.Sdk.Tools.PipelineWitness.ApplicationInsights;
using Azure.Sdk.Tools.PipelineWitness.AzurePipelines;
using Azure.Sdk.Tools.PipelineWitness.Configuration;
using Azure.Sdk.Tools.PipelineWitness.GitHubActions;
using Azure.Sdk.Tools.PipelineWitness.Services.WorkTokens;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.AspNetCore.Builder;
using Microsoft.Azure.Cosmos;
using Microsoft.Extensions.Azure;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using Microsoft.VisualStudio.Services.Client;
using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.WebApi;
namespace Azure.Sdk.Tools.PipelineWitness;
public static class Startup
{
public static void Configure(WebApplicationBuilder builder)
{
IConfigurationSection settingsSection = builder.Configuration.GetSection("PipelineWitness");
PipelineWitnessSettings settings = new();
settingsSection.Bind(settings);
builder.Services.AddLogging();
builder.Services.Configure<PipelineWitnessSettings>(settingsSection);
builder.Services.AddSingleton<ISecretClientProvider, SecretClientProvider>();
builder.Services.AddSingleton<IPostConfigureOptions<PipelineWitnessSettings>, PostConfigureKeyVaultSettings<PipelineWitnessSettings>>();
builder.Services.AddSingleton<IPostConfigureOptions<PipelineWitnessSettings>, PostConfigureSettings>();
builder.Services.AddApplicationInsightsTelemetry(builder.Configuration);
builder.Services.AddApplicationInsightsTelemetryProcessor<BlobNotFoundTelemetryProcessor>();
builder.Services.AddTransient<ITelemetryInitializer, ApplicationVersionTelemetryInitializer>();
builder.Services.AddSingleton<TokenCredential, DefaultAzureCredential>();
builder.Services.AddAzureClients(azureBuilder =>
{
azureBuilder.UseCredential(provider => provider.GetRequiredService<TokenCredential>());
azureBuilder.AddCosmosServiceClient(new Uri(settings.CosmosAccountUri));
azureBuilder.AddBlobServiceClient(new Uri(settings.BlobStorageAccountUri));
azureBuilder.AddQueueServiceClient(new Uri(settings.QueueStorageAccountUri))
.ConfigureOptions(o => o.MessageEncoding = Storage.Queues.QueueMessageEncoding.Base64);
});
builder.Services.AddSingleton<IAsyncLockProvider>(provider => new CosmosAsyncLockProvider(provider.GetRequiredService<CosmosClient>(), settings.CosmosDatabase, settings.CosmosAsyncLockContainer));
builder.Services.AddTransient(CreateVssConnection);
builder.Services.AddTransient<AzurePipelinesProcessor>();
builder.Services.AddTransient<BuildCompleteQueue>();
builder.Services.AddHostedService<BuildCompleteQueueWorker>(settings.BuildCompleteWorkerCount);
builder.Services.AddSingleton<GitHubClientFactory>();
builder.Services.AddTransient<GitHubActionProcessor>();
builder.Services.AddTransient<RunCompleteQueue>();
builder.Services.AddHostedService<RunCompleteQueueWorker>(settings.GitHubActionRunsWorkerCount);
builder.Services.AddHostedService<AzurePipelinesBuildDefinitionWorker>();
builder.Services.AddHostedService<MissingGitHubActionsWorker>();
builder.Services.AddHostedService<MissingAzurePipelineRunsWorker>();
}
private static void AddHostedService<T>(this IServiceCollection services, int instanceCount) where T : class, IHostedService
{
for (int i = 0; i < instanceCount; i++)
{
services.AddSingleton<IHostedService, T>();
}
}
private static void AddCosmosServiceClient<TBuilder>(this TBuilder builder, Uri serviceUri) where TBuilder : IAzureClientFactoryBuilderWithCredential
{
builder.RegisterClientFactory((CosmosClientOptions options, TokenCredential cred) => new CosmosClient(serviceUri.AbsoluteUri, cred, options));
}
private static VssConnection CreateVssConnection(IServiceProvider provider)
{
Uri organizationUrl = new("https://dev.azure.com/azure-sdk");
TokenCredential azureCredential = provider.GetRequiredService<TokenCredential>();
VssAzureIdentityCredential vssCredential = new(azureCredential);
VssHttpRequestSettings settings = VssClientHttpRequestSettings.Default.Clone();
return new VssConnection(organizationUrl, vssCredential, settings);
}
}