有没有办法从 Azure DevOps YAML 读取文件?
Posted
技术标签:
【中文标题】有没有办法从 Azure DevOps YAML 读取文件?【英文标题】:Is there a way to read file from Azure DevOps YAML? 【发布时间】:2019-06-29 16:47:23 【问题描述】:在使用 YAML 文件格式在 Azure DevOps 上执行 CI 时,我试图读取我的 csproj 文件以提取有关版本的信息,以创建将遵循 csproj 版本的 NuGet 包。
我使用NuGetCommand@2
进行包装(因为versioningScheme: byPrereleaseNumber
)
是否有内置任务或方法可以从 csproj 文件中提取此信息作为正则表达式并将它们传递给 NuGetCommand@2
?
【问题讨论】:
【参考方案1】:我很确定没有任何内置功能,但是您可以使用任何您喜欢的脚本语言来解析文件并“吐出”您需要的任何内容作为构建变量并稍后使用它。这是我一直在做的事情:
- script: echo "##vso[task.setvariable variable=dp]$(cat $(Build.Repository.LocalPath)/deployment/dp)"
- script: az group delete -n $(dp)-k8s -y --no-wait
您显然可以在脚本步骤中执行任何自定义操作,并以您喜欢的方式使用结果。
https://github.com/Microsoft/azure-pipelines-tasks/blob/master/docs/authoring/commands.md
【讨论】:
好的,有时间我会尝试在js中做这个 好问题,也需要同样的问题 - 你有没有得到任何地方,可以发布一个示例以从 csproj 中提取major.minor.patch 版本信息?【参考方案2】:这里的其他答案对我不起作用,但我确实在我的管道定义中拼凑了一个替代解决方案:
variables:
projectVersion: '0.0'
buildNumber: '$(Build.BuildId)'
versionNumber: '$(projectVersion).$(buildNumber)'
steps:
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
$input_path = (Get-ChildItem -Path "YourDirectory\" -Include SampleLibrary.csproj -File -Recurse -ErrorAction SilentlyContinue)
$regex = '(?<=<Version>).*?(?=<\/Version>)'
$version = Select-String -Path $input_path -Pattern $regex -AllMatches | % $_.Matches | % $_.Value
Write-Output "##vso[task.setvariable variable=projectVersion]$version"
这会将版本号设置为一个不错的值,例如“1.1.8.547”,但显然您可以根据需要省略内部版本号。
这里的 PowerShell 脚本的要点是它会首先检索指定目录中的 .csproj 文件。然后我使用 Francoimora 发布的相同正则表达式从文件中提取值并将其存储在 $version 变量中。最后一行是将 $version 的值写入 YAML 中定义的 projectVersion 变量。
从 .NET Standard 中的类库中删除 AssemblyInfo.cs 文件似乎真的很麻烦,而且没有任何收获……希望我们能得到一些更好的管道任务/变量,这些任务/变量适合这些类型未来的项目。
【讨论】:
【参考方案3】:基于 Linux 的代理解决方案
您可以将其添加为提取 csproj 标记的第一步:
- script: echo "##vso[task.setvariable variable=version]$(cat 'ProjectDirectory/MyProject.csproj' | grep -oP '(?<=<Version>).*?(?=<\/Version>)')"
然后,您可以通过在 yaml 中的任何位置调用 $(version)
来使用它。
说明:
echo "##vso[task.setvariable variable=version]
表示“设置一个我可以在之后使用的变量”
cat 'ProjectDirectory/MyProject.csproj' | grep
获取您的 csproj 内容,然后将其传递给 grep,以便我们可以对其执行正则表达式
(?<=<Version>).*?(?=<\/Version>)')
是一个正则表达式,它找到 <Version>x.x.x</Version>
标签而不消耗标签,所以它只打印里面的内容
【讨论】:
试过了,但构建失败并出现以下错误:grep: -P supports only unibyte and UTF-8 locales
您是在基于 linux 的构建代理中吗?
是的,此解决方案适用于基于 linux 的代理。我会把它添加到我的帖子中。以上是关于有没有办法从 Azure DevOps YAML 读取文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 azure devops YAML 管道中将单个代理用于多个作业/阶段
如何从 azure devops 上的图表 yaml 文件中获取 appVersion?
Azure DevOps YAML 管道从传递的变量中删除引号和双反斜杠