Учитывая этот yaml Azure DevOps для тестового конвейера:
trigger:
- master
pool:
vmImage: ubuntu-latest
parameters:
- name: dotnetVersion
type: string
default: '8.0'
- name: build_config
type: object
default:
- solution:
name: TestProject
vsBuild: false
dotnetBuild: true
buildConfiguration: Debug
buildPlatform: Any CPU
dotNetVersion: '8.0'
steps:
- ${{ each sln in parameters.build_config }}:
- script: |
echo "Dotnet version is: ${{sln.solution.dotNetVersion}}"
displayName: First output dotnet version
- script: |
echo "Dotnet version is: ${{parameters.dotNetVersion}}"
displayName: Second output dotnet version
почему первая задача выводит:
Dotnet version is: 8
но второй вывод задачи
Dotnet version is: 8.0
Для нас это проблема, поскольку у нас есть довольно большой объект build_config для большинства наших конвейеров. Однако я заметил, что некоторые из них терпят неудачу в зависимости от того, какой стиль параметра используется для передачи версии dotnet в базовые шаблоны.
Как предотвратить автоматическое преобразование или приведение к целому числу в yaml Azure DevOps? Я пробовал использовать:
ни один из них, кажется, не дает ожидаемого результата. Я все еще получаю 8 в базовом шаблоне. Я также пробовал использовать кавычки вокруг вывода параметра, например: «${{parameters.dotnetVersion}}». Похоже, это тоже не работает.
TL;DR Я считаю, что на портале Azure DevOps есть ошибка при постановке в очередь новой сборки.
Использование Azure DevOps CLI для постановки в очередь новой сборки работает должным образом:
az pipelines build queue --definition-name "my-pipeline" --branch "my-branch"
Параметр dotnetVersion
определяется как string
и всегда будет рассматриваться как один.
Параметр build_config
определен как object
, но, к сожалению, нет способа определить схему для параметра и установить тип свойств, таких как solution.dotNetVersion
.
Проблема здесь в том, что даже если вы заключите в кавычки такие значения, как '8.0'
:
parameters:
- name: dotnetVersion
type: string
default: '8.0' # <-------------- Has quotes and parameter is set as string
- name: build_config
type: object
default:
- solution:
name: TestProject
vsBuild: false
dotnetBuild: true
buildConfiguration: Debug
buildPlatform: Any CPU
dotNetVersion: '8.0' # <------------- Has quotes but there's no way to define the type of a property
Azure DevOps удалит все кавычки, когда вы ставите в очередь новую сборку с помощью портала:
Итак, solution.dotnetVersion
будет преобразовано в числовое значение:
Ставим в очередь новый конвейер и вручную помещаем одинарные кавычки solution.dotnetVersion
:
Значение отображается как ожидалось:
Добавьте переменную конвейера (например, DOTNET_VERSION
), значение которой будет зависеть от того, имеет ли соответствующий параметр .
или нет:
trigger: none
pool:
vmImage: ubuntu-latest
parameters:
- name: dotnetVersion
type: string
default: '8.0'
- name: build_config
type: object
default:
- solution:
name: 'TestProject'
vsBuild: false
dotnetBuild: true
buildConfiguration: 'Debug'
buildPlatform: 'Any CPU'
dotNetVersion: '8' # Try with '8.0', '8.1', etc
jobs:
- ${{ each sln in parameters.build_config }}:
- job: build_${{ sln.solution.name }}
displayName: Build ${{ sln.solution.name }}
variables:
${{ if contains(sln.solution.dotNetVersion, '.') }}:
DOTNET_VERSION: "${{ sln.solution.dotNetVersion }}"
${{ else }}:
DOTNET_VERSION: "${{ sln.solution.dotNetVersion }}.0"
steps:
- checkout: none
- script: |
echo "Dotnet version is: $(DOTNET_VERSION)"
displayName: First output dotnet version
то, что я решил сделать, было похоже, но проще. Я убегаю следующим образом: dotNetVersion: "\"8.0\"" Затем на выходе конвейера я получаю следующее: Версия Dotnet: '8.0'. Отсюда я собираюсь использовать выражение replace для удаления единственного кавычки.
@ossentoo рассмотрите возможность добавления ответа на свой вопрос с объяснением обходного пути.
@ossentoo это не так уж и сложно, это просто условие if/else для установки переменной :-)
${{ sln.solution.dotNetVersion }} необходимо рассматривать как строку, а не целое число, чтобы сохранить исходное значение и вывести ожидаемое значение «8.0». Для этого вам необходимо заключить ${{ sln.solution.dotNetVersion }} в одинарные кавычки внутри команды echo.
echo "Версия Dotnet: '${{ sln.solution.dotNetVersion }}'"
trigger:
- No_Change
pool:
name: linux
parameters:
- name: dotnetVersion
type: string
default: '8.0'
- name: build_config
type: object
default:
- solution:
name: TestProject
vsBuild: false
dotnetBuild: true
buildConfiguration: Debug
buildPlatform: Any CPU
dotNetVersion: '8.0'
steps:
- ${{ each sln in parameters.build_config }}:
- script: |
echo "Dotnet version is: '${{ sln.solution.dotNetVersion }}'"
displayName: First output dotnet version
- script: |
echo "Dotnet version is: ${{parameters.dotNetVersion}}"
displayName: Second output dotnet version
Я только что проверил ваше предложение. Это не сработает, если вы вручную не заключите 8.0
в кавычки на портале Azure DevOps при постановке в очередь новой сборки (как описано в моем ответе).
Обходной путь: попробуйте использовать двойные кавычки в параметрах объекта.
pool:
vmImage: ubuntu-latest
parameters:
- name: dotnetVersion
type: string
default: '8.0'
- name: build_config
type: object
default:
- solution:
name: TestProject
vsBuild: false
dotnetBuild: true
buildConfiguration: Debug
buildPlatform: Any CPU
dotNetVersion: "8.0"
steps:
- ${{ each sln in parameters.build_config }}:
- script: |
echo "Dotnet version in parameters with object is: ${{sln.solution.dotNetVersion}}"
displayName: First output dotnet version
- script: |
echo "Dotnet version in parameters with string is: ${{parameters.dotNetVersion}}"
displayName: Second output dotnet version
Вы показываете результат второй задачи, в которой используется parameters.dotNetVersion
. Как упоминалось в ОП, этот параметр работает нормально. Но вывод sln.solution.dotNetVersion
не работает должным образом.
@Rui уже исправил несоответствия в замечаниях.
черт возьми, это кажется очень сложным. но все равно спасибо