是否可以在resources:repository的ref属性中使用Azure DevOps YAML的变量?

ddrv8njm  于 2023-08-07  发布在  其他
关注(0)|答案(4)|浏览(101)

我有两个AzureDevOps Git分支:

master
feature/mybranch

字符串
我在yaml中定义了一个多阶段构建管道,其中一些步骤被模板化到单独的.yml文件中。
在我的外层azure-pipelines.yml中,我引用了一个存储库,其中我的template .yml存在:

resources:
  repositories:
    - repository: templates
      type: git
      name: MyProject/MyRepo


当我在'master'分支中构建时,一切都很好,因为默认情况下,仓库将在refs/heads/master中查找。
当我在功能分支工作时,我想测试我的template .yml文件的实验性更改,我不希望它从master分支获取它们,我希望它使用我正在工作的分支中的文件。
下面的代码可以让我做到这一点:

resources:
  repositories:
    - repository: templates
      type: git
      name: MyProject/MyRepo
      ref: refs/heads/feature/mybranch


然而,当我将其合并回master时,我显然不希望'ref:'仍然指向特性分支,所以我希望使用变量动态生成'ref:'的值。
我尝试使用ref: $(Build.SourceBranch),其中$(Build.SourceBranch)应该扩展为'refs/heads/feature/mybranch'
但这不管用。错误代码:

62638: "/azure-pipelines.yml: Could not get the latest source version for repository MySolution hosted on Azure Repos using ref refs/heads/$(Build.SourceBranch)."

z31licg0

z31licg01#

不要引用资源中的repo,而是使用这里描述的内联 checkout
https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#checking-out-a-specific-ref

- checkout: git://MyProject/MyRepo@features/tools

字符串
并且这个yaml元素允许使用模板表达式使用变量、参数,例如

- checkout: git://${{ variables.repoName}}@${{ variables.branchRef }}


- checkout: git://${{ parameters.repoName}}@${{ parameters.branchRef }}


你可以动态地改变它
或者另一种选择是使用脚本任务如下

- script: |
      # note checkout: git://$(System.TeamProject)/${{ parameters.repoName }}@${{ parameters.repoRef }} this does not work if this task is run multiple times in same pipeline
      # see here for more details :https://developercommunity.visualstudio.com/t/checkout-fails-with-an-error-occurred-while-loadin/1005991#T-N1270459
      repoDir=$(Agent.BuildDirectory)/${{ parameters.repoName }}
      /bin/rm -rf $repoDir
      url_with_token=$(echo $(System.CollectionUri) | sed -e "s/https\:\/\//https\:\/\/$(System.AccessToken)\@/g")
      git clone $url_with_token/$(System.TeamProject)/_git/${{ parameters.repoName }} $repoDir
      cd $repoDir
      git fetch origin '${{ parameters.repoRef }}':'localBranch'
      git checkout localBranch
    name: clone_script
    displayName: Checkout using script ${{ parameters.repoName }}@${{ parameters.repoRef }}


我已经添加了上面作为一个模板和它的用法在一个要点,使它易于重用。
希望能帮上忙
https://gist.github.com/scorpionlion/1773d08b62ca5875cc2fd6dcdd0394d2

dy2hfwbg

dy2hfwbg2#

是否可以在resources:repository for Azure DevOps YAML的ref属性中使用变量?
对于这个问题,答案是肯定的,这是可能的。
关于为什么会收到该错误消息,只是您使用的变量($(Build.SourceBranch))不正确。您应该使用$(Build.SourceBranchName)
通常,对于ref,我们应该输入master或任何其他特征分支。比如说

ref: refs/heads/master

字符串
这可能会让你认为这与$(Build.SourceBranch)的值相同。看起来一样,我知道,但不一样。实际上,对于server,它将读取的是分支名称而不是分支路径,这一点我们可以通过经典的编辑器类型清楚地弄清楚:


的数据
根据经典的编辑器类型,我们可以知道在这里我们应该输入准确的分支名称。
因此,正如预定义变量所定义的,$(Build.SourceBranch)的值是分支路径,但对于$(Build.SourceBranchName),它表示的是一个确切的分支名称。
因此,如果要成功执行,则需要用途:$(Build.SourceBranchName),我这边也是
希望这也能帮助你远离错误信息。

编辑:

完整的脚本是为我工作的是:

resources:
  repositories:
    - repository: templates
      type: git
      name: MyApp/MyconApp
      ref: $(Build.SourceBranchName)

93ze6v8z

93ze6v8z3#

Azure文档状态
变量不能用于在YAML语句中定义存储库。
所以这似乎对你在这里能做的事情施加了一些限制。也许有一种变通方法仍然允许你做你想做的事情。

r8uurelv

r8uurelv4#

根据https://learn.microsoft.com/en-us/azure/devops/release-notes/2022/sprint-212-update#template-expressions-in-repository-resource-definition,您需要使用 Template Expressions。我遇到过this工作(使用变量)的情况,而在其他管道中,使用变量不工作

resources:
  repositories:
    - repository: templates
      type: git
      name: MyApp/MyconApp
      ref: $(Build.SourceBranchName)

字符串
如果不起作用,更改为模板表达式可以起作用

resources:
  repositories:
    - repository: templates
      type: git
      name: MyApp/MyconApp
      ref: ${{ variables['Build.SourceBranch'] }}

相关问题