Я также сталкиваюсь с аналогичной проблемой, мой обходной путь состоит в том, чтобы сгладить массив в строку, используя разные разделители для разных измерений.
Например, я хочу сделать некоторые параметры обязательными и завершить сборку, если они параметры не передаются, вместо того, чтобы добавлять задачу для проверки каждого параметра, я хочу сделать это в одной задаче.
Для этого я сначала передаю в качестве параметра (в другой шаблон, называемый * 1005) * которые содержат задачу, ответственную за проверку параметров), массив, в котором каждый элемент является строкой типа name:value
, которая представляет собой конкатенацию (с использованием выражения format
) name
и value
требуемого параметры, разделенные двоеточием:
# templates/pipeline-template.yml
parameters:
- name: endpoint
type: string
default: ''
- name: rootDirectory
type: string
default: $(Pipeline.Workspace)
- name: remoteDirectory
type: string
default: '/'
- name: archiveName
type: string
default: ''
#other stuff
- template: check-required-params.yml
parameters:
requiredParams:
- ${{ format('endpoint:{0}', parameters.endpont) }}
- ${{ format('archiveName:{0}', parameters.archiveName) }}
Затем в check-required-params.yml
я присоединяю массив, разделяющий элементы точкой с запятой, используя выражение ${{ join(';', parameters.requiredParams) }}
, это создает строку типа endpoint:value;archiveName:value
и передает это в качестве переменной среды.
На этом этапе, используя несколько манипуляций со строками, в скрипте я могу разбить строку, используя th Точка с запятой в качестве разделителя, поэтому я получу массив строк типа name:value
, который я могу разделить далее, но на этот раз используя двоеточие в качестве разделителя. Мой check-required-params.yml
выглядит так:
# templates/check-required-params.yml
parameters:
- name: requiredParams
type: object
default: []
steps:
- task: PowerShell@2
inputs:
script: |
$params = $env:REQURED_PARAMS -split ";"
foreach($param in $params) {
if ([string]::IsNullOrEmpty($param.Split(":")[1])) {
Write-Host "##vso[task.logissue type=error;]Missing template parameter $($param.Split(":")[0])"
Write-Host "##vso[task.complete result=Failed;]"
}
}
targetType: inline
pwsh: true
env:
REQURED_PARAMS: ${{ join(';', parameters.requiredParams) }}
displayName: Check for required parameters
Тогда в моем azure-pipelines.yml
я могу сделать:
#other stuff
- template: templates/pipeline-template.yml
parameters:
endpoint: 'myEndpoint'
rootDirectory: $(Pipeline.Workspace)/mycode
В этом примере сборка не удастся, потому что я не передаю параметр archiveName
Вы можете добавить некоторую гибкость, используя переменные также для определения разделителей вместо жесткого кодирования в сценариях и в выражениях