У меня есть этот шаблон:
parameters:
gitTag: ' '
stages:
- stage: CreationTag
jobs:
- job: Tag
pool:
name: Default
steps:
- task: PowerShell@2
displayName: 'gitTag parameter trim'
inputs:
targetType: 'inline'
script: |
$trimmedGitTag = "${{parameters.gitTag}}".Trim()
Write-Host "##vso[task.setvariable variable=trimmedGitTag]$trimmedGitTag"
Write-Output "Trimed parameter = '$trimmedGitTag'"
- task: PowerShell@2
displayName: 'Creation du tag Git'
inputs:
targetType: 'inline'
script: |
Write-Output "Trimed parameter = '$(trimmedGitTag)'"
condition: and(succeeded(), ne('$(trimmedGitTag)', ''))
Я получаю параметр из основной сцены, но он может быть пустым или содержать только пробелы. Итак, в первой задаче я обрезаю параметр в переменной. Во второй задаче я добавил условие, согласно которому прецедентная задача должна быть выполнена успешно, а значение параметра обрезки не должно быть равно ''.
Первый шаг выполняется и выводит на консоль «Trimedparameter = ''».
Моя проблема в том, что вторая задача все еще выполняется, хотя и не должна. И он также отображает то же значение («Параметр Trimed = ''») с выходом записи.
В чем здесь будет проблема? Или это другой способ гарантировать, что задача выполняется только тогда, когда параметр имеет значение, отличное от пустого или пробельного?
РЕДАКТИРОВАТЬ
Я изменил значение параметра по умолчанию на пустое место в качестве обходного пути для необязательного параметра. В исходном сообщении я использовал пустую строку ''. Я хочу иметь возможность управлять случаями, когда:
Вместо:
condition: and(succeeded(), ne('$(trimmedGitTag)', ''))
Пытаться:
condition: and(succeeded(), ne(variables['trimmedGitTag'], ''))
Или, как альтернатива:
- ${{ if replace(parameters.gitTag, ' ') }}:
- task: PowerShell@2
displayName: 'Do something with the tag'
inputs:
targetType: 'inline'
script: |
$trimmedGitTag = "${{ parameters.gitTag }}".Trim()
Write-Output "Trimed parameter = '$trimmedGitTag'"
Кроме того, вы устанавливаете и используете переменную в одном задании?
Ладно, это была просто опечатка, моя ошибка. Ваше решение с условием отлично работает. Я не понял, что переменная была добавлена в массив «переменные». Большое спасибо за вашу помощь!
По умолчанию вы устанавливаете значение ''
. Это означает, что если ничего не указано, то результатом будет ''
.
Я думаю, что использование PowerShell здесь слишком усложняет то, что вы пытаетесь сделать. Я бы порекомендовал поставить if
утверждение к задаче.
steps:
- ${{ if paraemters.Tag }}:
- task:someTask@1
В настоящее время вы используете условия, которые будут оцениваться при выполнении конвейера и обычно будут показывать статус «пропущено», если условие не выполнено. Используя условие if
, оно оценивается во время компиляции, и поэтому неудовлетворенные задачи даже не будут загружены в задание.
Некоторые ресурсы: https://learn.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops#conditionally-run-a-step
Осторожно: ${{ if parameters.Tag }}:
примет значение True
, если строка НЕ пуста. См. Приведение типов — String.
Однако допустимо: 1.) для него установлено значение по умолчанию ''
и предполагается, что с именем типа githubTag не будет пробелов.
Да, значение по умолчанию — пустая строка, но, возможно, это просто пример. Не делайте слишком много предположений о том, как люди будут использовать конвейер (или шаблон). Лучше перестраховаться, чем потом сожалеть :-)
@DreadedFrost Я использовал оператор If для своих тестов, но мне все равно кажется, что условие намного понятнее и читабельнее
Также я изменил значение по умолчанию для '', так как хочу, чтобы оно было необязательным параметром. я отредактирую пост
Ради интереса, зачем менять? Установка значения по умолчанию на ''
фактически делает его необязательным. Если значение отсутствует, оно пусто.
@PatriceCote вы используете шаблоны и передаете правильные параметры? Потому что я протестировал свой код, и он работал. Дважды проверьте, правильно ли вы передаете все параметры.