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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:42:02