Love it or hate it, you've got to admit that YAML build pipeline scripts can be a brittle. One little bit of whitespace out of place and -- boom! -- you staring at a ton of errors. I ran into two related errors yesterday while I was working on an Azure DevOps pipeline script: "bad indentation of a mapping entry" and "can not read an implicit mapping pair; a colon is missed".
Here's the YAML that was causing the problem:
- task: AzureAppServiceSettings@1
inputs:
azureSubscription: 'connection-to-yaml-test'
appName: 'bdcyaml'
resourceGroupName: 'rg-yamltest'
appSettings: |
[{ "name": "MiscSettings__BuildVersionMessage", "value": "$(Build.DefinitionName) - $(Build.BuildNumber)","slotSetting": true }, { "name": "ConnectionStrings__default", "value": "$(connectionstring-prod)", "slotSetting": true }]
I'm just about 100% certain that that preformatted YAML text isn't going to format correctly in a browser and it's going to be hard to read and see what's going. It's not a whole lot easier when you're reading it in Visual Studio Code either.
What's happening? What's the fix?
Well, I'm using the pipe symbol '|' to deal with a long string value. In YAML, the pipe operator indicates a string literal which can optionally span multiple lines.
It's subtle but I somehow lost a single space character ' ' before the value. If you use the YAML pipe '|' to indicate a literal string, each line of that value needs to be indented by one space under the value that you're setting. In my case, I'm passing a string value to the "appSettings:" property but the value is at the same indentation level as the property declaration.
The solution is easy. Just add a space.
I hope this helped.
-Ben
-- Looking for help with your Azure DevOps build and release pipelines? Trying to wrap your head around YAML? Tricky continuous integration or continuous deployment (CI/CD) builds got you down? We can help. Drop us a line at info@benday.com.