Созданный тест Aspire выдает исключение SSL во время тестов Azure DevOps

Я создал стартовое решение Aspire по умолчанию, которое имеет следующий тест:

public sealed class WebTests
{
    [Fact]
    public async Task GetWebResourceRootReturnsOkStatusCode()
    {
        // Arrange
        var host = await DistributedApplicationTestingBuilder.CreateAsync<Projects.Starter_AppHost>();
        host.Services.ConfigureHttpClientDefaults(x => x.AddStandardResilienceHandler());
        // To output logs to the xUnit.net ITestOutputHelper, consider adding a package from https://www.nuget.org/packages?q=xunit+logging

        await using var app     = await host.BuildAsync();
        var             service = app.Services.GetRequiredService<ResourceNotificationService>();
        await app.StartAsync();

        // Act
        var client = app.CreateHttpClient("gateway");
        var @for   = TimeSpan.FromSeconds(30);
        await service.WaitForResourceAsync("gateway", KnownResourceStates.Running).WaitAsync(@for);
        var response = await client.GetAsync("/");

        // Assert
        Assert.Equal(HttpStatusCode.OK, response.StatusCode);
    }
}

При развертывании в конвейере Azure DevOps этот тест выдает следующее исключение:

[xUnit.net 00:00:12.52]     Starter.Tests.WebTests.GetWebResourceRootReturnsOkStatusCode [FAIL]
  Failed Starter.Tests.WebTests.GetWebResourceRootReturnsOkStatusCode [12 s]
  Error Message:
   System.Net.Http.HttpRequestException : The SSL connection could not be established, see inner exception.
---- System.Security.Authentication.AuthenticationException : The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot
  Stack Trace:
     at System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, HttpRequestMessage request, Boolean async, Stream stream, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(QueueItem queueItem)
   at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.<SendCoreAsync>g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Resilience.ResilienceHandler.<>c.<<SendAsync>b__3_0>d.MoveNext()
--- End of stack trace from previous location ---
   at Polly.Outcome`1.ThrowIfException()
   at Microsoft.Extensions.Http.Resilience.ResilienceHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.<SendCoreAsync>g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
   at Starter.Tests.WebTests.GetWebResourceRootReturnsOkStatusCode() in C:\agent\default\_work\3\s\Starter.Tests\WebTests.cs:line 21
   at Starter.Tests.WebTests.GetWebResourceRootReturnsOkStatusCode() in C:\agent\default\_work\3\s\Starter.Tests\WebTests.cs:line 24
--- End of stack trace from previous location ---
----- Inner Stack Trace -----
   at System.Net.Security.SslStream.CompleteHandshake(SslAuthenticationOptions sslAuthenticationOptions)
   at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
   at System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, HttpRequestMessage request, Boolean async, Stream stream, CancellationToken cancellationToken)

Я попробовал выполнить следующие команды, но это ничего не дало, и ошибка не исчезла:

dotnet dev-certs https --clean
dotnet dev-certs https --trust

Итак, как мне решить эту проблему? Обратите внимание, что это автономный агент Windows, выполняющий рабочую нагрузку Aspire 8.0.2.

Это на линуксе?

davidfowl 31.08.2024 16:54

Спасибо, что указали на это @davidfowl. Мой автономный агент работает в Windows.

Mike-E 01.09.2024 00:47

Если вы запустите dotnet dev-certs https на CI, что произойдет?

davidfowl 01.09.2024 16:04

Понятно A valid HTTPS certificate is already present. @davidfowl 🤔 Я попробовал запустить тесты локально на сервере и получил ту же ошибку. Так что это не имеет отношения к агенту с автономным размещением, но, похоже, это общая проблема с dotnet.

Mike-E 02.09.2024 17:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я могу воспроизвести ту же ошибку, если у меня не было действующего сертификата в моем локальном агенте Windows.

Я вручную установил сертификат в агент сборки с помощью команды dotnet dev-certs https --trust.

После этого я могу успешно запустить тест в конвейере.

Мое решение находится в папке кода:

Вот мой YAML для справки:

pool:
  name: test

variables:
  solution: "code/AspireApp1.sln"
steps:
- script: |
    dotnet dev-certs https --check --trust
  displayName: check if a trusted certificate can be found
- task: UseDotNet@2
  inputs:
    packageType: 'sdk'
    version: '8.x'
    includePreviewVersions: true
- task: DotNetCoreCLI@2
  displayName: "dotnet workload restore"
  inputs:
    command: 'custom'
    custom: 'workload'
    arguments: 'restore $(solution)'

- script: |
    cd code
    dotnet build --configuration Release
  displayName: 'Build project'

- script: |
    cd code
    dotnet test --configuration Release --logger trx --results-directory $(System.DefaultWorkingDirectory)/TestResults
  displayName: 'Run tests'

- task: PublishTestResults@2
  inputs:
    testResultsFiles: '**/*.trx'
    searchFolder: '$(System.DefaultWorkingDirectory)/TestResults'
    testRunTitle: 'Test Results'
    mergeTestResults: true

Спасибо за вашу помощь. Думаю, я нашел проблему. Проблема заключается в личности локального агента. Сейчас это NETWORK SERVICE моего агента. Я пытаюсь найти способ настроить его для принципала, но не могу найти ничего очевидного. Теперь посмотрим на это дальше.

Mike-E 02.09.2024 18:42
Ответ принят как подходящий

Мне пришлось использовать PsExec64.exe:

PsExec64.exe -i -u "nt authority\network service" powershell

Затем:

dotnet dev-certs https --clean
dotnet dev-certs https --trust

Другие вопросы по теме