Azure DevOps YAML解析错误:无法读取块映射条目问题求助
Azure DevOps流水线YAML解析错误:
can not read a block mapping entry; a multiline key may not be an implicit key 我在Azure DevOps中写了个自动修改项目buildNumber的流水线,结果碰到错误:can not read a block mapping entry; a multiline key may not be an implicit key。查了一堆相关问题还是没解决,以下是我的azure-pipeline.yml代码:
# Starter pipeline # Start with a minimal pipeline that you can customize to build and deploy your code. # Add steps that build, run tests, deploy, and more: # https://aka.ms/yaml trigger: - main - major/* - feat/* - patch/* pool: vmImage: window-latest steps: - task: PowerShell@2 displayName: 'increment Version' inputs: targetType: 'inline' script: | function Increment-MajorVersion(){ [int[]]$build = $(Build.BuildNumber) -split "." [int]$major = $build[0] [int]$minor = $build[1] [int]$patch = $build[2] $major += 1 [string]$buildVersion = "$($major).$($minor).$($patch)" return $buildVersion } function Increment-MinorVersion(){ [int[]]$build = $(Build.BuildNumber) -split "." [int]$major = $build[0] [int]$minor = $build[1] [int]$patch = $build[2] $minor += 1 [string]$buildVersion = "$($major).$($minor).$($patch)" return $buildVersion } function Increment-PatchVersion(){ [int[]]$build = $(Build.BuildNumber) -split "." [int]$major = $build[0] [int]$minor = $build[1] [int]$patch = $build[2] $patch += 1 [string]$buildVersion = "$($major).$($minor).$($patch)" return $buildVersion } if($(Build.SourceBranchName) -match "major"){ [string]$buildVersion = Increment-MajorVersion Write-Host "##vso[task.setvariable variable=buildNumber]$buildVersion" } if($(Build.SourceBranchName) -match "feat"){ [string]$buildVersion = Increment-MajorVersion Write-Host "##vso[task.setvariable variable=buildNumber]$buildVersion" } if($(Build.SourceBranchName) -match "patch"){ [string]$buildVersion = Increment-MajorVersion Write-Host "##vso[task.setvariable variable=buildNumber]$buildVersion" } - task: UseDotNet@2 displayName: 'Use .NET 6' inputs: packageType: 'sdk' version: '6.x.x' includePreviewVersions: false - task: NuGetCommand@2 displayName: 'Restore NuGet Packages' inputs: command: 'restore' restoreSolution: '**/*.sln' feedsToUse: 'config' - task: VSBuild@1 displayName: Build Projekt inputs: solution: '**\*.sln'
问题原因及修复方案
这个错误是YAML格式不规范导致的,同时还有几个功能逻辑和配置的小问题,一起修复如下:
1. YAML缩进错误(核心问题)
script: |之后的所有PowerShell代码必须统一缩进,原代码里函数定义没有缩进,YAML解析器会把它当成新的配置项,直接触发解析错误。给所有脚本内容加4个空格缩进即可。
2. 版本分割的正则错误
-split "."里的.是正则通配符,会匹配任意字符,改成-split "\."才能正确按点分割版本号。
3. 分支版本递增逻辑错误
原代码里feat、patch分支都调用了Increment-MajorVersion,完全不符合预期,对应改成Increment-MinorVersion和Increment-PatchVersion。
4. 虚拟机镜像名称拼写错误
window-latest少了s,改成windows-latest才能找到正确的构建虚拟机。
5. 代码块闭合缩进错误
最后一个if块的闭合}没有对齐,调整缩进保持统一。
修复后的完整YAML代码
# Starter pipeline # Start with a minimal pipeline that you can customize to build and deploy your code. trigger: - main - major/* - feat/* - patch/* pool: vmImage: windows-latest steps: - task: PowerShell@2 displayName: 'increment Version' inputs: targetType: 'inline' script: | function Increment-MajorVersion(){ [int[]]$build = $(Build.BuildNumber) -split "\." [int]$major = $build[0] [int]$minor = $build[1] [int]$patch = $build[2] $major += 1 [string]$buildVersion = "$($major).$($minor).$($patch)" return $buildVersion } function Increment-MinorVersion(){ [int[]]$build = $(Build.BuildNumber) -split "\." [int]$major = $build[0] [int]$minor = $build[1] [int]$patch = $build[2] $minor += 1 [string]$buildVersion = "$($major).$($minor).$($patch)" return $buildVersion } function Increment-PatchVersion(){ [int[]]$build = $(Build.BuildNumber) -split "\." [int]$major = $build[0] [int]$minor = $build[1] [int]$patch = $build[2] $patch += 1 [string]$buildVersion = "$($major).$($minor).$($patch)" return $buildVersion } if($(Build.SourceBranchName) -match "major"){ [string]$buildVersion = Increment-MajorVersion Write-Host "##vso[task.setvariable variable=buildNumber]$buildVersion" } if($(Build.SourceBranchName) -match "feat"){ [string]$buildVersion = Increment-MinorVersion Write-Host "##vso[task.setvariable variable=buildNumber]$buildVersion" } if($(Build.SourceBranchName) -match "patch"){ [string]$buildVersion = Increment-PatchVersion Write-Host "##vso[task.setvariable variable=buildNumber]$buildVersion" } - task: UseDotNet@2 displayName: 'Use .NET 6' inputs: packageType: 'sdk' version: '6.x.x' includePreviewVersions: false - task: NuGetCommand@2 displayName: 'Restore NuGet Packages' inputs: command: 'restore' restoreSolution: '**/*.sln' feedsToUse: 'config' - task: VSBuild@1 displayName: Build Projekt inputs: solution: '**\*.sln'
内容的提问来源于stack exchange,提问作者Tobs
相关产品推荐
相关产品推荐

