Я запускаю файл YAML конвейера сборки в Azure, где у меня есть сценарий PowerShell, который я хочу запустить, но я сталкиваюсь со следующей ошибкой:
script: : Термин «script:» не распознается как имя командлета, функции, файла сценария или исполняемой программы. Проверьте правильность написания имени или, если был включен путь, убедитесь, что путь указан правильно, и повторите попытку. В D:_work_temp\32585f841520.ps1:7 символ:3 сценарий:
CategoryInfo : ObjectNotFound: (script::String) [], ParentContainsErrorRecordException FullyQualifiedErrorId : CommandNotFoundException
и код приведен ниже:
steps:
- checkout: self
submodules: true
- powershell: |
$arr = Get-ChildItem '$(Build.SourcesDirectory)\Physical' |
Where-Object {$_.PSIsContainer} |
Foreach-Object {$_.Name}
Write-Host "##vso[task.setvariable variable=arr;]$arr"
displayName: 'Powershell Script'
- powershell: |
$string = "$(arr)"
$Data=$string.split(" ")
foreach($item in $Data){
script:
C:\C:\location_of_build_agent.exe "$(Build.SourcesDirectory)\file_to_be_build" -c $item -buildMode "Rebuild"
if (%errorlevel%==1) {exit 0} else {exit %errorlevel%}
displayName: 'Run Build script for $item'
}
Код должен передать список конфигураций из массива, который необходимо перестроить. Я также пытался запустить его в CmdLine, но безуспешно.
А другого способа запускать все конфигурации из локации без добавления конфига в код вручную нет?
Я пытаюсь разобраться в вашем коде, но ничего не понимаю. Не могли бы вы предоставить больше контекста, например, каков ваш сценарий? Каково содержимое массива? И что с этим делать?
У меня есть место, где есть больше папок, каждая папка представляет собой конфигурацию, я хочу иметь массив с именами папок (конфигураций), просмотреть их все и построить их. если в эту папку добавляется новая конфигурация, нет необходимости обновлять код конвейера.
Я могу воспроизвести ту же ошибку с вашим yaml, она вызвана тем, что вы поместили задачу сценария в задачу powershell. Пожалуйста, проверьте детали ниже. Замените настоящую команду на свою в задаче powershell.
script: : Термин «script:» не распознается как имя командлета, функции, файла сценария или исполняемой программы. Проверьте правильность написания имени или, если был включен путь, убедитесь, что путь указан правильно, и повторите попытку. В сценарии D:_work_temp\32585f841520.ps1:7 char:3:
Прямая причина в том, что вы помещаете script
задачу внутрь powershell
задачи. Ключевое слово script
читается как command
, но система не может его найти, после чего сообщается об ошибке.
В конвейере DevOps не поддерживается включение одной задачи в другую задачу.
Вы получаете folder name
под Physical
во 2-м PowerShell.
задание, запустите location_of_build_agent.exe
по папкам. Не знаю, что такое location_of_build_agent.exe
.
Вот образец для справки, вы можете заменить Write-host $item
на свою реальную команду (location_of_build_agent.exe...).
- powershell: |
$arr = Get-ChildItem '$(Build.SourcesDirectory)\Physical' |
Where-Object {$_.PSIsContainer} |
Foreach-Object {$_.Name}
Write-Host $arr # check the value
Write-Host "##vso[task.setvariable variable=arr;]$arr"
displayName: 'Powershell Script'
- powershell: |
$string = "$(arr)"
$Data=$string.split(" ")
foreach($item in $Data){
Write-host $item
}
displayName: 'Run Build script'
Вы правы, это не сработало, потому что я поместил задачу в другую задачу (скрипт внутри powershell), теперь мне нужно понять, как перебирать все конфигурации и строить их в цикле.
Я протестировал код, и команда «Write-host $item» зацикливается правильно и показывает все конфигурации по этому пути, но по какой-то причине, если я добавляю свои команды внутрь, после первой сборки конфигурации она выходит из цикла. и продолжите выполнение остальных задач из конвейера. мои команды: 'C:\Automation\AS.PrepareBuild.exe C:\Automation\bin-en\AS.Build.exe "$(Build.SourcesDirectory)\Project.apj" -c $item -buildMode "Rebuild" if ($LastExitCode -eq 1) {выход 0} else {выход $LastExitCode}'
Спасибо @Adrian за комментарий. У вас есть {exit $LastExitCode}
в выражении if, которое может завершить задачу для 1-й конфигурации, удалите его для проверки. Задача Powershell фактически автоматически проверяет код выхода: 1
на наличие сбоя и 0
на успех.
У меня есть несколько предупреждений при сборке некоторых конфигураций, и powershell
думает, что это ошибки, и завершаю работу с кодом 1, по этой причине мне нужна эта небольшая логика if ($LastExitCode -eq 1) {exit 0} else {exit $LastExitCode}
, но я понимаю, что эта логика должна находиться за пределами { }
из foreach
, чтобы продолжить цикл. и сразу после цикла до exitcode 0
. Спасибо за ваш вклад.
У меня есть место, где есть еще папки, каждая папка — это конфигурация, я хочу иметь массив с именами папок (конфигураций), просмотреть их все и построить. если в эту папку добавляется новая конфигурация, нам не нужно обновлять код конвейера.
Сделать конвейер динамическим, чтобы его не требовалось обновлять при добавлении или удалении конфигурации, кажется полезным. Однако это может привести к ненужной сложности вашего кода или конвейера.
Итак, чтобы решить, насколько динамичным должен быть ваш конвейер, я думаю, самый важный вопрос:
Если конфигурации добавляются или удаляются часто (например, каждые несколько недель?), возможно, имеет смысл сделать что-то динамичное, как вы уже пытаетесь сделать (или использовать обходной путь Уэйда).
Но, с другой стороны, если конфигурации меняются не так часто (например, 3 или 4 раза в год?), подумайте о чем-то менее динамичном, но более простом для понимания и управления. Например, если ваш конвейер правильно структурирован, может быть достаточно просто обновить список конфигураций, определенных как параметр:
parameters:
- name: configurations
displayName: Configuration folders
type: object
default:
- configA
- configB
- configC
steps:
- ${{ each configuration in parameters.configurations }}:
- script: |
echo "Running build script for ${{ configuration }}"
# other commands here
displayName: 'Run build script for ${{ configuration }}'
Я также протестировал ваш вариант code
, он работает так, как ожидалось, и его можно использовать, как вы рекомендуете, в зависимости от того, как часто обновляется список конфигурации или насколько чистым я хочу pipeline code
Я приму решение о том, что я буду использовать. Спасибо за ваш вклад.
@Адриан, нет проблем. Во многих случаях просто не стоит жертвовать читабельностью и обслуживанием ради чего-то более динамичного.
Вы не можете создать задачу конвейера динамически, т.е. е. при запуске самого трубопровода.