You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Aspire 9.3主机在Drone.io流水线启动失败,如何排查?

问题

我在Drone.io流水线中运行Aspire测试应用时,遇到AppHost无法启动、容器运行一段时间后被终止的问题,但本地运行一切正常。以下是我的Host配置代码和NUnit测试Fixture初始化代码,请问如何获取更多故障相关信息?

Drone运行最终状态:
Drone运行状态

本地运行状态:
本地运行状态

Host配置代码

var POSTGRES_USER = builder.AddParameter("POSTGRESUSER", secret: false);
var POSTGRES_PASSWORD = builder.AddParameter("POSTGRESPASSWORD", secret: false);

var dbServer = builder
    .AddPostgres($"Postgres")
    .WithUserName(POSTGRES_USER)
    .WithPassword(POSTGRES_PASSWORD)
    .WithLifetime(ContainerLifetime.Persistent);

var db = dbServer
    .AddDatabase(POSTGRES_DB);

var dbManager = builder
    .AddProject<Projects.DatabaseManager>($"DBmanager")
    .WithReference(db)
    .WaitFor(db)
    .WithHttpCommand("/reset-db", "Reset Database", commandOptions: new() { IconName = "DatabaseLightning" })
    .WithHttpHealthCheck("/health");

var cache = builder
    .AddRedis($"Cache")
    .WithDataVolume();

var webApi = builder
    .AddProject<Projects.WebAPI>($"WebAPI")
    .WithReference(db)
    .WaitFor(db)
    .WithReference(cache)
    .WaitFor(cache)
    .WithExternalHttpEndpoints()
    .WithHttpHealthCheck("/health");

builder.Build().Run();

NUnit测试Fixture初始化代码

[OneTimeSetUp]
public async Task OneTimeSetUp()
{
   var builder = await DistributedApplicationTestingBuilder
      .CreateAsync<Projects.TestHost>();

   builder.Services.ConfigureHttpClientDefaults(clientBuilder =>
   {
       clientBuilder.AddStandardResilienceHandler();
   });
   App = await builder.BuildAsync();

   await App.StartAsync(); //<- 失败,无错误,只是无限等待。添加.WaitAsync(interval)会超时失败
   await App.ResourceNotifications
      .WaitForResourceHealthyAsync($"WebAPI");
}
排查建议

1. 启用详细日志输出

在测试初始化代码中为Aspire测试主机开启调试级日志,捕获启动过程中的细节:

var builder = await DistributedApplicationTestingBuilder
    .CreateAsync<Projects.TestHost>(options =>
    {
        options.LogLevel = LogLevel.Debug;
    });

同时确保Drone流水线完整输出所有日志,重点查看容器启动阶段的错误信息。

2. 检查Drone环境的资源与权限限制

  • Drone Runner可能对容器CPU、内存有限制,导致Postgres/Redis等服务无法启动,可在流水线配置中增加资源分配:
    steps:
      - name: test
        resources:
          limits:
            memory: 2G
            cpu: 1
    
  • 验证Drone环境是否支持ContainerLifetime.Persistent配置,检查Docker守护进程是否允许创建带持久化卷的容器。

3. 单独验证基础服务在CI环境的可用性

在Drone流水线中添加临时步骤,手动启动Postgres/Redis容器,确认基础服务能正常运行:

docker run -e POSTGRES_USER=test -e POSTGRES_PASSWORD=test postgres:latest

4. 捕获启动超时与异常

修改测试代码,为StartAsync添加超时和异常捕获,明确失败原因:

try
{
    await App.StartAsync().WaitAsync(TimeSpan.FromMinutes(2));
}
catch (TaskCanceledException ex)
{
    Console.WriteLine("AppHost启动超时: " + ex.Message);
    // 打印所有资源状态
    foreach (var resource in App.Resources)
    {
        Console.WriteLine($"资源 {resource.Name} 状态: {resource.State}");
    }
    throw;
}
catch (Exception ex)
{
    Console.WriteLine("AppHost启动失败: " + ex.Message + Environment.NewLine + ex.StackTrace);
    throw;
}

5. 验证数据库初始化逻辑

检查DatabaseManager的/reset-db接口在CI环境中是否能正常执行,可在测试中提前调用该接口并捕获异常,排查数据库连接或权限问题。

内容的提问来源于stack exchange,提问作者Xavr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:05:20