有没有办法从 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,以便我们可以对其执行正则表达式 (?&lt;=&lt;Version&gt;).*?(?=&lt;\/Version&gt;)') 是一个正则表达式,它找到 &lt;Version&gt;x.x.x&lt;/Version&gt; 标签而不消耗标签,所以它只打印里面的内容

【讨论】:

试过了,但构建失败并出现以下错误:grep: -P supports only unibyte and UTF-8 locales 您是在基于 linux 的构建代理中吗? 是的,此解决方案适用于基于 linux 的代理。我会把它添加到我的帖子中。

以上是关于有没有办法从 Azure DevOps YAML 读取文件?的主要内容,如果未能解决你的问题,请参考以下文章

azure devops 构建管道将超时减少到 30 分钟

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

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

Azure DevOps YAML 管道从传递的变量中删除引号和双反斜杠

有没有办法在 Azure DevOps 中将 PR 从特定分支限制到另一个分支

Azure DevOps YAML - 手动恢复多个项目