代码之家  ›  专栏  ›  技术社区  ›  cdie

有没有方法从Azure DevOps YAML读取文件?

  •  0
  • cdie  · 技术社区  · 7 年前

    当我在azuredevops上使用YAML文件格式进行CI时,我试图读取csproj文件来提取关于版本的信息,以创建遵循csproj版本的NuGet包。

    NuGetCommand@2 用于包装(因为 versioningScheme: byPrereleaseNumber )

    ?

    1 回复  |  直到 7 年前
        1
  •  3
  •   4c74356b41    7 年前

    我很确定这里面没有什么内置的,但是你可以使用任何你喜欢的脚本语言来解析这个文件,然后把你需要的任何东西作为一个构建变量“输出”出来,然后再使用它。以下是我一直在做的:

    - 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

        2
  •  1
  •   Rico    6 年前

    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文件。然后我使用了francomora发布的同一个regex将值从文件中取出并存储在$version变量中。最后一行是将$version的值写入YAML中定义的projectVersion变量。

        3
  •  1
  •   Francoimora    5 年前

    基于Linux的代理解决方案

    您可以添加以下内容作为提取csproj标记的第一步:

    - script: echo "##vso[task.setvariable variable=version]$(cat 'ProjectDirectory/MyProject.csproj' | grep -oP '(?<=<Version>).*?(?=<\/Version>)')"
    

    然后你就可以通过打电话使用它了 $(version) 任何地方都可以。

    • echo "##vso[task.setvariable variable=version] 意思是“设置一个可以在之后使用的变量”
    • cat 'ProjectDirectory/MyProject.csproj' | grep 获取您的csproj内容,然后将其传递给grep,以便我们可以对其执行正则表达式
    • (?<=<Version>).*?(?=<\/Version>)') <Version>x.x.x</Version> 标记而不使用标记,因此它只打印内部内容