В моем первом вопросе целью было намеренно вызвать сбой конвейера CI/CD, если преобразование в Web.Live.Config невозможно. Мне пришлось сохранить сборку в переменной. Если трансформация невозможна,
строка "No element in the source document matches"
появляется в журнале. Но: Хотя в файлах конфигурации нет ключа с «connectionString», странным образом появляется строка "No element in the source document matches '/configuration/connectionStrings'"
. Я хотел проигнорировать это.
Может ли кто-нибудь помочь мне найти в журнале строку, но игнорировать "No element in the source document matches '/configuration/connectionStrings'"
? Я попробовал -ne
, -notmatch
и -notlike
, но это не помогло.
Несмотря на появление строки " ... warning : No element in the source document matches '/configuration/appSettings/add[@key='anotherKEY']'"
, конвейер не выходит из строя.
Я новичок в PowerShell и буду признателен за вашу помощь.
- echo "Verifying build…"
- |
$msbuildOutput = & $MSBUILD_PATH "$Our_ASMX_PROJECT_PATH" /Target:Rebuild /property:Configuration=Live /T:Package
$pattern = "No element in the source document matches"
$ignorePattern = "No element in the source document matches '/configuration/connectionStrings'" # ignore the specific message
$relevantMatches = $pattern | Where-Object { $_ -notmatch $ignorePattern }
if ($relevantMatches)
{
Write-Host "Build failed due to missing configuration key or transformation."
exit 1
}
Еще одна попытка:
- echo "Verifying build…"
- |
$msbuildOutput = & $MSBUILD_PATH "$Our_ASMX_PROJECT_PATH" /Target:Rebuild /property:Configuration=Live /T:Package
$pattern = "No element in the source document matches"
$ignorePattern = "No element in the source document matches '/configuration/connectionStrings'" # ignore the specific message
$matches = $msbuildOutput | Select-String -Pattern $pattern | ForEach-Object { $_.Line }
$relevantMatches = $matches | Where-Object { $_.Line -notlike "*$ignorePattern*" }
if ($relevantMatches)
{
Write-Host "Build failed due to missing configuration key or transformation."
exit 1
}
Попытка 22.07.2024
- |
Write-Host "Verifying build…"
$msbuildOutput = & $MSBUILD_PATH "$Our_ASMX_PROJECT_PATH" /Target:Rebuild /property:Configuration=Demo /T:Package
$pattern = "No element in the source document matches"
$IgnorePattern = "No element in the source document matches '/configuration/connectionStrings'"
# Split the long string into an array of lines
$msbuildOutputLines = $msbuildOutput -split "(\r\n)"
$errors = $msbuildOutputLines | Where-Object { $_ -like "*$pattern*" -and $_ -notlike "*$IgnorePattern*" }
if ($errors)
{
Write-Host "Build failed due to missing configuration key or transformation."
exit 1
}
26.07.2024 Вывод (анонимизировано, отрывок)
''
''
'"D:\gitlab-runner-ps\builds\BuildNumber\0\aNamespace\anotherNamespace\Project\OurDirectory\ProjectName.vbproj" (Rebuild;Package Ziel) (1) ->'
'"D:\gitlab-runner-ps\builds\BuildNumber\0\aNamespace\anotherNamespace\Project\AnotherDirectory\AnotherProjectName.csproj" (Standardziel) (3:3) ->'
'"D:\gitlab-runner-ps\builds\BuildNumber\0\aNamespace\anotherNamespace\Project\EvenAnotherDir\EvenAnotherProjectName" (Standardziel) (13:5) ->'
' D:\gitlab-runner-ps\builds\BuildNumber\0\aNamespace\anotherNamespace\Project\AnotherDir\FileName.cs(72,30): warning CS0168: Die Variable "e" ist deklariert, wird aber nie verwendet. [D:\gitlab-runner-ps\builds\BuildNumber\0\aNamespace\anotherNamespace\Project\AnotherDir\ProjectName.csproj]'
Редактировать 29.07.2024, показаны ошибки
Showing errors:
C:\Windows\TEMP\build_scriptSomeNumber\script.ps1 :
D:\gitlab-runner-ps\builds\AnotherNumber\0\aNamespace\aNamespace\Project\OurProjectPath\Web.Live.config(204,10): warning : No element in the source document matches '/configuration/appSettings/add[@key='THATKEY']'
[D:\gitlab-runner-ps\builds\AnotherNumber\0\aNamespace\aNamespace\Project\Namespace\OurProjectPath.vbproj]
D:\gitlab-runner-ps\builds\AnotherNumber\0\aNamespace\aNamespace\Project\OurCompany.ANamespace.Project.AsmxService\Web.Live.config(204,10): warning : No element in the source document matches '/configuration/appSettings/add[@key='THATKEY']'
[D:\gitlab-runnerps\builds\AnotherNumber\0\aNamespace\aNamespace\Project\OurCompany.ANamespace.Project.AsmxService\OurProjectPath.vbproj]
In Zeile:1 Zeichen:1
+ C:\Windows\TEMP\build_scriptSomeNumber\script.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,script.ps1
У меня нет файла журнала, и я не должен его писать.
Добавьте к своему скрипту строку Set-StrictMode -Version latest
, чтобы увидеть некоторые (скрытые) ошибки, сохраняя значение $ErrorActionPreference
по умолчанию (Continue
)…
Предполагая, что каждое предупреждение будет в отдельной строке, вы можете использовать это:
$MsBuildOutput = & $MSBUILD_PATH "$Our_ASMX_PROJECT_PATH" /Target:Rebuild /property:Configuration=Live /T:Package
$pattern = "No element in the source document matches"
$IgnorePattern = "No element in the source document matches '/configuration/connectionStrings'"
$errors = $MsBuildOutput -split "`n" | where { $_ -notlike "*$IgnorePattern*" -and $_ -like "*$pattern*" }
if ($errors) { Write-Error -ErrorAction Stop -Message "$errors" }
В этом коде предполагается, что каждое предупреждение находится на отдельной строке.
Здравствуйте, ваше решение работает в онлайн-инструменте. Когда я удаляю «Ни один элемент в исходном документе не соответствует», блок if не выполняется, а когда я добавляю «Ни один элемент в исходном документе не соответствует», он выполняется. Однако в реальном конвейере сборка не завершается сбоем в любом случае. Кроме того, сегодня я написал еще немного кода, который вскоре отредактирую в своем вопросе. И здесь трубопровод не выходит из строя.
@Daniel Итак, вы говорите, что Write-Error -ErrorAction Stop
выделяется, но трубопровод не выходит из строя?
Блок If не выполняется, как если бы §errors
не было правдой.
@Daniel, так этот порт $errors = $MsBuildOutput | where { $_ -notlike "*$IgnorePattern*" -and $_ -like $pattern }
не работает? как результаты в $MsBuildOutput
? это несколько строк или одна строка? и если да, то это одна строка или многострочная строка?
Да, $errors что-то присвоено, потому что $MsBuildOutput что-то возвращает. Это одна многострочная строка. Я распечатал результат в качестве теста.
@Daniel, если это одна многострочная строка, вам нужно сначала ее разделить, я обновил свой ответ.
Я уже разделился. Смотрите Attempt 7/22/2024
в моем вопросе.
@Daniel Итак, дважды проверьте, есть ли что-то в $errors
, запустите $errors | Out-Host
и покажите нам результаты.
Хорошо, теперь я написал отрывок из ответа на вопрос.
@Daniel Похоже, вы показываете вывод $MsBuildOutput
, но что такое вывод $errors
или $MsBuildOutput -split "`n" | where { $_ -notlike "*$IgnorePattern*" -and $_ -like "*$pattern*" }
?
ошибка System.Object[]" cannot be converted to the type "System.String" required for the parameter "Message". The specified method is not supported.
@Daniel Хорошо, я обновил код, изменил $errors
на "$errors"
.
Эй, да, я добавил вывод ошибки в свой вопрос. В сообщении об ошибке проблема упоминается только в строке 1, символ 1... @y-y
@Daniel Хорошо, выглядит великолепно, PowerShell улавливает строки с warning : No element in the source document matches '/configuration/appSettings/
и игнорирует строку с No element in the source document matches '/configuration/connectionStrings
, а Write-Error фактически выдает ошибку завершения, так в чем же ваша проблема сейчас?
Привет @y-y, твой код теперь работает. Если ключ в LiveConfig не найден, появляется сообщение об ошибке, и конвейер завершается с ошибкой, как ожидалось. Я добавил Write-Host «Сборка не удалась из-за отсутствия ключа конфигурации или преобразования». к коду. Если ни один ключ не пропущен, конвейер работает успешно, несмотря на сообщение с /configuration/connectionStrings
. Это хорошо. Спасибо за вашу помощь и за ваши настойчивые комментарии в течение последних нескольких дней. Моя проблема несколько дней назад заключалась в том, что конвейер проходил, даже если ключ отсутствовал.
Пожалуйста, отредактируйте свой вопрос, чтобы улучшить минимально воспроизводимый пример. В частности, покажите код, где определен
$matches
. Более того, поделитесь (при необходимости очистив) соответствующей частью файла журнала…