如何在 azure devops 中解析 yaml 文件

Posted

技术标签:

【中文标题】如何在 azure devops 中解析 yaml 文件【英文标题】:How to possible parse yaml file in azure devops 【发布时间】:2021-12-31 03:40:09 【问题描述】:

如何解析 yaml 文件以从中提取 appVersion ?

我可以将文件内容与文件内容一起读取到变量中以获取所有内容 但我无法解析 yaml 文件以从中提取 appVersion。

powershell 脚本:

# get chart.yaml file content to yamlfilecontent variable.
write-host($env:yamlfilecontent)

# how to parse content ?
write-host($env:yamlfilecontent["appVersion"]) 

chart.yaml

apiVersion: v2
name: asset-api
description: Helm Chart for Kubernetes

# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application

# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 1.5.2

# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
appVersion: "1.0.2"

【问题讨论】:

顺便说一句:Write-Host is typically the wrong tool to use,除非意图是仅写入显示器,绕过成功输出流,并能够将输出发送到其他命令,将其捕获在变量中,将其重定向到文件。要输出一个值,请单独使用它;例如,$value 而不是 Write-Host $value(或使用 Write-Output $value,尽管这很少需要)。另见:***.com/a/50416448/45375的底部 顺便说一句:必须调用 PowerShell 函数、cmdlet、脚本和外部程序像 shell 命令 - foo arg1 arg2 - 不像 C#方法 - foo('arg1', 'arg2')。如果您使用, 分隔参数,您将构造一个命令将其视为单个参数数组。为防止意外使用方法语法,请使用Set-StrictMode -Version 2 或更高版本,但请注意其其他影响。请参阅this answer 了解更多信息。 【参考方案1】:

不幸的是,从 7.2 版开始,PowerShell没有内置支持解析 YAML - 请参阅 GitHub issue #3607 中的相关功能请求。

但是,第三方模块是可用的,例如 powershell-yaml,可从 PowerShell 库here 获得,您可以从中直接将其部署到 Azure 自动化。要在本地安装,请使用Install-Module -Name powershell-yaml

假设模块已安装,以下是如何解析您问题中的 YAML,使用 here-string 定义输入文本:

$yamlText = @'
apiVersion: v2
name: asset-api
description: Helm Chart for Kubernetes

# A chart can be either an 'application' or a 'library' chart.
# ...
version: 1.5.2

# This is the version number of the application being deployed. This version number should be
# ...
appVersion: "1.0.2"
'@

($yamlText | ConvertFrom-Yaml).appVersion

如预期的那样,以上产生1.0.2

ConvertFrom-Yaml 输出一个有序哈希表,它代表 YAML 输入(从技术上讲,是 [System.Collections.Specialized.OrderedDictionary] 类型的实例),其条目 PowerShell 允许您像访问它们是属性(例如.appVersion)或使用index 语法(例如['appVersion'])。

【讨论】:

以上是关于如何在 azure devops 中解析 yaml 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 yaml 中处理 Azure DevOps 管道中的错误?

如何从 azure devops 上的图表 yaml 文件中获取 appVersion?

如何在 azure devops YAML 管道中将单个代理用于多个作业/阶段

合并 PR 后如何限制 Azure DevOps YAML 管道中的关联工作项?

如何在 Azure DevOps yaml 管道中设置 ENVIRONMENT 状态

如何:在 Azure DevOps YAML 中有条件地插入模板?