Как устранить ошибку ##[error]Команда Dotnet завершилась с ненулевым кодом выхода в следующих проектах: ошибка [ '' ]?

Любые предложения о том, как устранить эту ошибку конвейера ниже, чтобы создать и развернуть веб-API?

Не удается выполнить шаг Generate OpenAPI definition for ${{ parameters.DocumentName }}, и ошибка означает, что он не знает ни о каких проектах?

.yaml-файл:

parameters:

- name: ApiFileName
  displayName: 'API Definition file name'
  default: 'swagger.json'
  type: string

- name: DocumentName
  displayName: 'Name of the openapi document to extract'
  type: string

steps:
 - task: ExtractFiles@1
   displayName: 'Extract Artifact'
   inputs:
    archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/*.zip' 
    destinationFolder: $(System.DefaultWorkingDirectory)\unzipped_artifact\

 - task: UseDotNet@2
   displayName: 'Force Net 6.0 usage'
   inputs:
     version: '6.x'
 
 - task: DotNetCoreCLI@2
   displayName: 'Tool Manifest'
   inputs:
     command: 'custom'
     custom: 'new'
     arguments: 'tool-manifest'

 - task: PowerShell@2
   displayName: 'Setup CLI tool and variables'
   inputs:
    targetType: 'inline'
    script: |
        mkdir $(System.DefaultWorkingDirectory)\openapi_specs\
        $version = (Get-Item $(System.DefaultWorkingDirectory)\unzipped_artifact\Swashbuckle.AspNetCore.Swagger.dll).VersionInfo.FileVersionRaw
        $versionstring = "{0}.{1}.{2}" -f $version.Major,$version.Minor,$version.Build
        $exeName = (Get-ChildItem -Path $(System.DefaultWorkingDirectory)\unzipped_artifact\ -Filter *.exe |Select BaseName).BaseName + ".dll"
        Write-Host "##vso[task.setvariable variable=SwaggerToolVersion;]$versionstring"
        Write-Host "##vso[task.setvariable variable=ApiStartupName;]$exeName"
        Write-Host "Setting tool version to found Swashbuckle.AspNetCore.Swagger version '$versionstring' and API startup DLL to '$exeName'"

 - task: DotNetCoreCLI@2
   displayName: 'Install Swagger CLI'
   inputs:
     command: 'custom'
     custom: 'tool'
     arguments: 'install Swashbuckle.AspNetCore.Cli --version $(SwaggerToolVersion)'

 - task: DotNetCoreCLI@2
   displayName: 'Generate OpenAPI definition for ${{ parameters.DocumentName }}'
   inputs:
     command: 'custom'
     custom: 'swagger'
     arguments: 'tofile --output $(System.DefaultWorkingDirectory)\openapi_specs\${{ parameters.ApiFileName }} $(System.DefaultWorkingDirectory)\unzipped_artifact\$(ApiStartupName) ${{ parameters.DocumentName }}'

 - task: CopyFiles@2
   displayName: 'Copy API Definition to: $(Build.ArtifactStagingDirectory)'
   inputs:
     SourceFolder: '$(System.DefaultWorkingDirectory)/openapi_specs/'
     Contents: '*.json'
     TargetFolder: '$(Build.ArtifactStagingDirectory)'
     flattenFolders: true

 - template: /Pack&Publish/PackageAPIDefForOctopus.yaml
   parameters:
     APIDefinitionPath: '$(System.DefaultWorkingDirectory)/openapi_specs/'

Ошибка:

C:\hostedtoolcache\windows\dotnet\dotnet.exe swagger tofile --output D:\a\1\s\openapi_specs\swagger.json D:\a\1\s\unzipped_artifact\Returns.API.dll Returns API
Usage: dotnet swagger tofile [options] [startupassembly] [swaggerdoc]

startupassembly:
  relative path to the application's startup assembly

swaggerdoc:
  name of the swagger doc you want to retrieve, as configured in your startup class

options:
  --output:  relative path where the Swagger will be output, defaults to stdout
  --host:  a specific host to include in the Swagger output
  --basepath:  a specific basePath to include in the Swagger output
  --serializeasv2:  output Swagger in the V2 format rather than V3
  --yaml:  exports swagger in a yaml format


##[debug]Exit code 1 received from tool 'C:\hostedtoolcache\windows\dotnet\dotnet.exe'
##[debug]STDIO streams have closed for tool 'C:\hostedtoolcache\windows\dotnet\dotnet.exe'
##[error]Error: The process 'C:\hostedtoolcache\windows\dotnet\dotnet.exe' failed with exit code 1
##[debug]Processed: ##vso[task.issue type=error;]Error: The process 'C:\hostedtoolcache\windows\dotnet\dotnet.exe' failed with exit code 1
Info: Azure Pipelines hosted agents have been updated and now contain .Net 5.x SDK/Runtime along with the older .Net Core version which are currently lts. Unless you have locked down a SDK version for your project(s), 5.x SDK might be picked up which might have breaking behavior as compared to previous versions. You can learn more about the breaking changes here: https://docs.microsoft.com/en-us/dotnet/core/tools/ and https://docs.microsoft.com/en-us/dotnet/core/compatibility/ . To learn about more such changes and troubleshoot, refer here: https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/build/dotnet-core-cli?view=azure-devops#troubleshooting
##[debug]task result: Failed
##[error]Dotnet command failed with non-zero exit code on the following projects : [ '' ]
##[debug]Processed: ##vso[task.issue type=error;]Dotnet command failed with non-zero exit code on the following projects : [ '' ]
##[debug]Processed: ##vso[task.complete result=Failed;]Dotnet command failed with non-zero exit code on the following projects : [ '' ]

Судя по текущему определению конвейера, для ${{ parameters.DocumentName }} не было значения по умолчанию. Передавали ли вы какое-либо значение при запуске этого конвейера? Судя по журналам, это выглядело как Returns API, там было место, которое могло привести к сбою интерфейса командной строки dotnet.

Alvin Zhao - MSFT 06.08.2024 14:24

@AlvinZhao-MSFT Да, это было передано так: «Returns API»

Bhav 06.08.2024 14:38

Не могли бы вы попробовать заключить в двойные кавычки значение, например "${{ parameters.DocumentName }}", в аргументах шага dotnet swagger tofile?

Alvin Zhao - MSFT 06.08.2024 14:44
Стоит ли изучать 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
3
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как указано в документации , последняя часть команды — swaggerdoc.

swagger tofile --output [output] [startupassembly] [swaggerdoc]

[выход] — это относительный путь, по которому Swagger JSON будет выводиться в

[startupassembly] — относительный путь к запуску вашего приложения. сборка

[swaggerdoc] — имя документа Swagger, который вы хотите получить, как настроено в вашем классе запуска

Оно должно быть таким же, как указано в вашем config.SwaggerDoc, например. v1 или v2.

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API - V1", Version = "v1" });
    c.SwaggerDoc("v2", new OpenApiInfo { Title = "My API - V2", Version = "v2" });
})

Подробнее см. здесь или здесь.

Свойство Title моего SwaggerDoc — «Returns API».

Bhav 06.08.2024 15:17

Попробуйте "${{ parameters.DocumentName }}", как советует @alvin.

DaSt 06.08.2024 15:20

@Bhav Значение параметра должно быть не значением Title, а первым аргументом SwaggerDoc("v1", ... (первая строка)

DaSt 06.08.2024 15:25

Основываясь на обсуждениях, мы увидели, что значение Returns API было передано в конвейер для ${{ parameters.DocumentName }}. Поскольку в аргументах команды dotnet swagger tofile был пробел, в CLI dotnet произошла ошибка неправильного использования. Вот проблема, которую я смог воспроизвести.

Для этого я дважды заключил "${{ parameters.DocumentName }}" в кавычки, который должен передаваться как целый аргумент; однако, даже если "${{ parameters.DocumentName }}" поставили в двойные кавычки, для меня это не было веским аргументом.

  - task: DotNetCoreCLI@2
    displayName: 'Generate OpenAPI definition for ${{ parameters.DocumentName }}'
    inputs:
      command: 'custom'
      custom: 'swagger'
      arguments: 'tofile --output $(System.DefaultWorkingDirectory)\openapi_specs\${{ parameters.ApiFileName }} $(System.DefaultWorkingDirectory)\unzipped_artifact\$(ApiStartupName) "${{ parameters.DocumentName }}"'

Судя по ответу @DaST, похоже, это проблема использования команды swagger, а не вашего конвейера. Протестировав передачу значения v1, оно сработало.

    public static class SwaggerExtensions
    {
        public static void SaveSwaggerJson(this IServiceProvider provider)
        {
            ISwaggerProvider sw = provider.GetRequiredService<ISwaggerProvider>();
            OpenApiDocument doc = sw.GetSwagger("v1", null, "/");
            string swaggerFile = doc.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0);

            // Get the bin folder path
            string binFolderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string swaggerFilePath = Path.Combine(binFolderPath, "swaggerfile.json");

            // Save the Swagger JSON to the bin folder
            File.WriteAllText(swaggerFilePath, swaggerFile);
        }
    }

Итак, в качестве какого параметра мне нужно передать значение v2?

Bhav 06.08.2024 15:22

Привет @Bhav, извини за опечатку. Согласно моему третьему снимку экрана, я передал v1 в качестве аргумента, как мы могли видеть из сообщения об ошибке Known Swagger documents: "v1" на втором снимке экрана. Я поделился с вами фрагментом кода, в котором определен документ v1. Поэтому v1 для меня является действительным swaggerdoc. Мы не знаем, что представляет собой ваш проект. Вы можете сначала попытаться заключить параметр в двойные кавычки, чтобы сначала исправить ошибку использования. Надеюсь, информация поможет.

Alvin Zhao - MSFT 06.08.2024 15:42

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