Почему интерфейс командной строки Azure Developer сообщает, что мой бицепс Aspire недействителен при работе в конвейерахC#

Место общения программистов C#
Ответить
Anonymous
 Почему интерфейс командной строки Azure Developer сообщает, что мой бицепс Aspire недействителен при работе в конвейерах

Сообщение Anonymous »

Недавно я создал новый проект Aspire и развертываю его в Azure с помощью Azure DevOps Pipelines.
Моя цель — запускать конвейеры при каждом срабатывании триггера, создавать инфраструктуру, подготавливать инфраструктуру, развертывать приложения в моем проекте .NET Aspire в ACA (Azure Container App) и, наконец, запустить ACA и настроить внешний вход.
Я получаю три разных результаты:
  • Один, где он просто не запускает конвейер и дает сбой на этапе «Создание бицепса инфраструктуры» моих конвейеров.
  • Другой, где он запускает конвейер, обеспечивает и развертывает, но вход в мой API установлен на внутренний.
  • Наконец, результат, когда он запускается, обеспечивает, развертывает и вход установлен на внешний, но API при запуске не может найти сертификат, который он должен использовать для HTTPS.
Это ошибка конвейеров, которую я получаю в случае сбоя:

Код: Выделить всё

ERROR: generating infra/ folder: configuring ingress for resource eriksens-api: Binding https can't be mapped to main ingress because it has port 5001 defined. main ingress only supports port 443 for https scheme.

Код: Выделить всё

eriksens-api
 — это ресурс для проекта Projects.Eriksens_Api_EriksenExternal, также известного как проект externalApi.

Вот как выглядит мой файл .NET Aspire AppHost program.cs.

Код: Выделить всё

using Eriksen.AppHost.Extensions;
using Eriksen.Core.Constants.Application;
using Eriksen.Core.Constants.AspireConstants;
using Microsoft.Extensions.Hosting;

var builder = DistributedApplication.CreateBuilder(args);

var isEnvLocal = builder.Configuration.GetSection("CUSTOM_ENVIRONMENT").Value ==
EnvironmentNames.Local;

var externalApi = builder.AddProject(ServiceNames.EriksensExternalApiServiceName)
.WithExternalHttpEndpoints()
.AddCustomEnvironmentVariables();

var schedulerWorker = builder.AddProject(ServiceNames.EriksensSchedulerWorkerServiceName)
.AddCustomEnvironmentVariables();

var applications = new List { externalApi, schedulerWorker };
if (isEnvLocal)
{
applications.ForEach(app => app.AddAspNetCoreEnvironmentVariable());
}
else
{
externalApi
.WithHttpsEndpoint(port: 5001, targetPort: 8080)
.WithExternalHttpEndpoints();
}

builder.Build().Run();

Код: Выделить всё

(n)Числа 
относятся к трем результатам, приведенным выше.

Это строки, которые, по моему мнению, в настоящее время создают проблемы (1):

Код: Выделить всё

// ******
externalApi
.WithHttpsEndpoint(port: 5001, targetPort: 8080)
.WithExternalHttpEndpoints();
// ******
Если я удалю .WithHttpsEndpoint(port: 5001, targetPort: 8080), он будет работать и развертываться нормально, но вход будет установлен как внутренний. (2)
Если я изменю строку .WithHttpsEndpoint(port: 5001, targetPort: 8080) на эту: .WithHttpsEndpoint(port: 443, targetPort: 8080), как следует из ошибки.

Приложение не может найти сертификат. (3)
Вот расширения, которые я использую в AppHost, чтобы упростить задачу:

Код: Выделить всё

using Eriksen.Core.Constants.AspireConstants;
using Microsoft.Extensions.Configuration;

namespace Eriksen.AppHost.Extensions;
public static class ApplicationModelExtensions
{
public static IResourceBuilder AddAspNetCoreEnvironmentVariable(this IResourceBuilder builder)
{
builder.WithEnvironment((context) =>
{
if (context.EnvironmentVariables.Any(env => env.Key == EnvironmentVariables.AspNetCoreEnvironmentVariableName))
{
context.EnvironmentVariables.Remove(EnvironmentVariables.AspNetCoreEnvironmentVariableName);
}

if (context.EnvironmentVariables.Any(env => env.Key == EnvironmentVariables.DotNetEnvironmentVariableName))
{
context.EnvironmentVariables.Remove(EnvironmentVariables.DotNetEnvironmentVariableName);
}

context.EnvironmentVariables.Add(EnvironmentVariables.AspNetCoreEnvironmentVariableName, builder.ApplicationBuilder.Environment.EnvironmentName);
context.EnvironmentVariables.Add(EnvironmentVariables.DotNetEnvironmentVariableName, builder.ApplicationBuilder.Environment.EnvironmentName);
});
return builder;
}

public static IResourceBuilder AddCustomEnvironmentVariables(this IResourceBuilder builder)
{
var envVars = builder.ApplicationBuilder.Configuration.GetSection($"CustomEnvironmentVariables:{builder.Resource.Name}").Get();

if (envVars is not null && envVars.Count != 0)
{
builder.WithEnvironment((context) =>
{
foreach (var variable in envVars.Where(variable => context.EnvironmentVariables.All(env => env.Key != variable.Key)))
{
context.EnvironmentVariables.Add(variable.Key, "{{{{ .Env." + variable.Value + " }}}}");
}
});
}

return builder;
}
}
Ошибка возникает на этапе создания бицепса инфраструктуры моих конвейеров.
Ямл моего конвейера выглядит следующим образом:

Код: Выделить всё

parameters:
- name: deployment_environment
displayName: Select Deployment Environment
type: string
default: dev
values:
- dev
- prod

trigger:
- development
- master

variables:
- ${{ if or(eq(variables['Build.SourceBranchName'], 'development'), eq(parameters.deployment_environment, 'dev'))}}:
- group: eriksens-dev-secrets
- group: eriksens-dev-config
- name: environment
value: dev
- ${{ if or(eq(variables['Build.SourceBranchName'], 'master'), eq(parameters.deployment_environment, 'prod'))}}:
- group: eriksens-prod-secrets
- group: eriksens-prod-config
- name: environment
value: prod

pool:
vmImage: ubuntu-latest

steps:
- task: Bash@3
displayName: Install azd
inputs:
targetType: 'inline'
script: |
curl -fsSL https://aka.ms/install-azd.sh | bash -s -- --version 1.20.3

# azd delegate auth to az to use service connection with AzureCLI@2
- pwsh: |
azd config set auth.useAzCliAuth "true"
displayName: Configure AZD to Use AZ CLI Authentication.

- task: DotNetCoreCLI@2
displayName: Restore Workload
inputs:
command: custom
custom: workload
arguments: 'restore'

- task: AzureCLI@2
displayName: "Set $(environment) Environment Variables"
inputs:
azureSubscription: $(AZURE_RESOURCE_MANAGER_CONNECTION)
scriptLocation: InlineScript
scriptType: pscore
inlineScript: |
azd env set AZURE_RESOURCE_GROUP "rg-eriksens-project-$(environment)" -e eriksens-project-$(environment) --no-prompt
azd env set ASPNETCORE_ENVIRONMENT "$(ASPNETCORE-ENVIRONMENT)" -e eriksens-project-$(environment) --no-prompt
azd env set DATABASE_CONNECTION_BASE "$(DATABASE-CONNECTION-BASE)"  -e eriksens-project-$(environment) --no-prompt

- task: AzureCLI@2
displayName: Generate infrastructure bicep
inputs:
azureSubscription: $(AZURE_RESOURCE_MANAGER_CONNECTION)
scriptLocation: InlineScript
scriptType: pscore
inlineScript: |
azd config set alpha.aca.persistDomains on
azd infra gen -e eriksens-project-$(environment) --no-prompt

- task: AzureCLI@2
displayName: Provision Infrastructure
inputs:
azureSubscription: $(AZURE_RESOURCE_MANAGER_CONNECTION)
scriptLocation: InlineScript
scriptType: pscore
inlineScript: |
azd provision -e eriksens-project-$(environment) --no-prompt
env:
AZURE_SUBSCRIPTION_ID: $(AZURE-SUBSCRIPTION-ID)
AZURE_ENV_NAME: $(AZURE-ENV-NAME)
AZURE_LOCATION: $(AZURE-LOCATION)

- task: AzureCLI@2
displayName: Deploy Application
inputs:
azureSubscription: $(AZURE_RESOURCE_MANAGER_CONNECTION)
scriptType: pscore
scriptLocation: inlineScript
inlineScript: |
azd deploy -e eriksens-project-$(environment) --no-prompt
env:
AZURE_SUBSCRIPTION_ID: $(AZURE-SUBSCRIPTION-ID)
AZURE_ENV_NAME: $(AZURE-ENV-NAME)
AZURE_LOCATION: $(AZURE-LOCATION)
Если я клонирую проект на свой компьютер, создаю новую среду, устанавливаю переменные и запускаю следующую команду в PS, используя любую из конфигураций:

Код: Выделить всё

azd infra gen -e eriksens-project-dev
Нет никаких нареканий.
Бицепс генерирует правильно, вход установлен на внешний, порты работают.
Тогда я могу бегать без каких-либо проблем:

Код: Выделить всё

azd provision -e eriksens-project-dev
azd deploy -e eriksens-project-dev
Однако версия, развертываемая вручную, не может запуститься и выдает эту ошибку:

Код: Выделить всё

Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Extensions.Logging.Abstractions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified.

File name: 'Microsoft.Extensions.Logging.Abstractions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'
at Program.$(String[] args)
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
at Program.$(String[] args)
at Program.(String[] args)
Но бицепс генерируется правильно при использовании конфигурации 1.
Оба используют Azure Developer CLI версии 1.20.3

Подробнее здесь: https://stackoverflow.com/questions/798 ... ing-in-pip
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»