You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CI/CD管道:检测配置转换失败日志并忽略指定提示

配置转换失败时触发CI/CD管道失败的PowerShell脚本问题

我需要实现当Web.Live.Config无法完成配置转换时,CI/CD管道自动失败。转换失败时日志会出现字符串No element in the source document matches,但要忽略针对'/configuration/connectionStrings'的特定提示。

我尝试用PowerShell的-ne、-notmatch、-notlike等操作符处理日志,但一直没成功——哪怕日志里出现了warning : No element in the source document matches '/configuration/appSettings/add[@key='anotherKEY']'这类提示,管道也没触发失败。下面是我几次尝试的代码:

第一次尝试

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
}

7/22/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
}

相关输出内容

07/26/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]'

07/29/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

修复方案及脚本

之前的尝试存在几个关键问题:

  1. 第一次尝试错误地对$pattern字符串本身进行过滤,而非处理$msbuildOutput的内容;
  2. 第二次尝试中,$matches已经是提取后的行文本,后续过滤无需再用$_.Line;
  3. 第三次尝试的换行拆分方式可能引入空行或无效行干扰匹配逻辑。

下面是修正后的脚本,逻辑简洁可靠:

Write-Host "Verifying build configuration transforms…"
# 执行MSBuild命令并捕获输出
$msbuildOutput = & $MSBUILD_PATH "$Our_ASMX_PROJECT_PATH" /Target:Rebuild /property:Configuration=Live /T:Package 

# 定义匹配规则:包含目标字符串,但排除connectionStrings相关的提示
$errorLines = $msbuildOutput | Where-Object {
    $_ -match "No element in the source document matches" -and
    $_ -notmatch "No element in the source document matches '/configuration/connectionStrings'"
}

# 如果存在符合条件的错误行,触发管道失败
if ($errorLines) {
    Write-Host "##[error]Build failed: Missing configuration key or transformation error detected."
    # 输出错误详情便于排查
    $errorLines | ForEach-Object { Write-Host "##[error]$_" }
    exit 1
}

脚本说明

  • 直接对$msbuildOutput过滤,PowerShell会自动将命令输出按行处理为数组,无需额外拆分;
  • 使用-match和-notmatch正则匹配,比-like更精准;
  • 用##[error]标记输出,让CI/CD系统(如GitLab CI)更清晰识别错误;
  • 额外输出错误详情,方便后续排查问题。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:55:55