Любые предложения о том, как устранить эту ошибку конвейера ниже, чтобы создать и развернуть веб-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 : [ '' ]
@AlvinZhao-MSFT Да, это было передано так: «Returns API»
Не могли бы вы попробовать заключить в двойные кавычки значение, например "${{ parameters.DocumentName }}"
, в аргументах шага dotnet swagger tofile
?
Как указано в документации , последняя часть команды — 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».
Попробуйте "${{ parameters.DocumentName }}"
, как советует @alvin.
@Bhav Значение параметра должно быть не значением Title
, а первым аргументом SwaggerDoc("v1", ...
(первая строка)
Основываясь на обсуждениях, мы увидели, что значение 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, извини за опечатку. Согласно моему третьему снимку экрана, я передал v1
в качестве аргумента, как мы могли видеть из сообщения об ошибке Known Swagger documents: "v1"
на втором снимке экрана. Я поделился с вами фрагментом кода, в котором определен документ v1
. Поэтому v1
для меня является действительным swaggerdoc. Мы не знаем, что представляет собой ваш проект. Вы можете сначала попытаться заключить параметр в двойные кавычки, чтобы сначала исправить ошибку использования. Надеюсь, информация поможет.
Судя по текущему определению конвейера, для
${{ parameters.DocumentName }}
не было значения по умолчанию. Передавали ли вы какое-либо значение при запуске этого конвейера? Судя по журналам, это выглядело какReturns API
, там было место, которое могло привести к сбою интерфейса командной строки dotnet.