使用 Aspire 自定义部署

Aspire 提供用于自定义应用程序部署方式的 API。 本文演示如何使用这些 API 配置特定于部署的设置,包括动态映像标记、资源配置和部署行为。

先决条件

  • Aspire 9.5 或更高版本
  • 现有 Aspire 项目

有关创建 Aspire 项目的信息,请参阅 生成第一个 Aspire 应用

动态容器映像标记

使用此方法 WithDeploymentImageTag 在部署时动态生成容器映像标记。 这使得可以基于部署上下文、Git 提交记录、时间戳或外部系统制定灵活的版本控制策略。 Aspire将映像推送到为部署预配的远程容器注册表时,内置 Azure 部署器将使用部署映像标记。

基本用法

为资源配置静态或计算标记:

var builder = DistributedApplication.CreateBuilder(args);

// Static tag
var api = builder.AddProject<Projects.Api>("api")
    .WithDeploymentImageTag(() => "v1.2.3-stable");

// Dynamic tag with timestamp
var worker = builder.AddProject<Projects.Worker>("worker")
    .WithDeploymentImageTag(() => $"build-{DateTime.UtcNow:yyyyMMdd-HHmm}");

builder.Build().Run();

异步标记生成

对复杂的标记生成方案使用异步回调:

var service = builder.AddProject<Projects.Service>("service")
    .WithDeploymentImageTag(async context =>
    {
        // Fetch version from external API
        var buildInfo = await GetBuildInfoFromApi();
        return $"service-{buildInfo.Version}";
    });

使用事件驱动为所有资源应用标记

使用事件 API 自动将部署映像标记应用于应用程序中的所有资源。 如果想要在所有容器化资源之间进行一致的标记,此方法非常有用:

var builder = DistributedApplication.CreateBuilder(args);

// Subscribe to the BeforeStartEvent to configure all resources
builder.Eventing.Subscribe<BeforeStartEvent>(async (evt, ct) =>
{
    var timestamp = DateTime.UtcNow.ToString("yyyyMMdd-HHmmss");
    foreach (var resource in evt.Model.Resources)
    {
        builder.CreateResourceBuilder(resource).WithDeploymentImageTag((context) =>
        {
            var resourceName = resource.Name.ToLowerInvariant();
            return $"{resourceName}-{timestamp}";
        });
    }
});

builder.Build().Run();

自定义 Azure Bicep 资源

使用 ConfigureInfrastructure 方法自定义在部署期间 Azure 生成的基础的 Aspire Bicep 模板。 这允许修改 Azure 资源属性、添加自定义配置或与现有 Azure 基础结构集成。

基本基础结构自定义

自定义Azure资源的 Bicep 属性。

var builder = DistributedApplication.CreateBuilder(args);

// Customize Azure Service Bus configuration
var serviceBus = builder.AddAzureServiceBus("servicebus");
serviceBus.AddServiceBusQueue("queue1");
serviceBus.ConfigureInfrastructure(infrastructure =>
{
    var queue = infrastructure.GetProvisionableResources().OfType<ServiceBusQueue>().Single(q => q.BicepIdentifier == "queue1");
    queue.MaxDeliveryCount = 5;
    queue.LockDuration = TimeSpan.FromMinutes(5);
});