是否可以在资源的 ref 属性中使用变量:Azure DevOps YAML 的存储库?

Mar*_*otH 7 yaml azure azure-devops

我有两个 AzureDevOps Git 分支:

master
feature/mybranch
Run Code Online (Sandbox Code Playgroud)

我在 yaml 中定义了一个多阶段构建管道,其中一些步骤被模板化为单独的 .yml 文件。

在我的外部 azure-pipelines.yml 中,我引用了我的模板 .yml 所在的存储库:

resources:
  repositories:
    - repository: templates
      type: git
      name: MyProject/MyRepo
Run Code Online (Sandbox Code Playgroud)

当我在“master”分支中构建时,一切都很好,因为默认情况下,存储库将在 refs/heads/master 中查找。

当我在功能分支中工作并且我想测试我的模板 .yml 文件的实验性更改时,我不希望它从主分支中获取它们,我希望它使用我正在工作的分支中的文件在。

以下工作并允许我这样做:

resources:
  repositories:
    - repository: templates
      type: git
      name: MyProject/MyRepo
      ref: refs/heads/feature/mybranch
Run Code Online (Sandbox Code Playgroud)

但是,当我将其合并回 master 时,我显然不希望 'ref:' 仍然指向功能分支,因此我想使用变量动态生成 'ref:' 的值。

我试过使用ref: $(Build.SourceBranch)where $(Build.SourceBranch)should expand to'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)."
Run Code Online (Sandbox Code Playgroud)

sco*_*pio 6

不要在资源中引用 repo,而是按照此处所述使用内联结帐

https://docs.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
Run Code Online (Sandbox Code Playgroud)

这个 yaml 元素允许使用使用变量、参数的模板表达式,例如

- checkout: git://$(System.TeamProject)/$(repoName)@${{ variables.branchRef }}
Run Code Online (Sandbox Code Playgroud)

或者

 - checkout: git://$(System.TeamProject)/$(repoName)@${{ parameters.branchRef }}
Run Code Online (Sandbox Code Playgroud)

你可以动态改变它

或者另一种选择是使用脚本任务如下

- 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
      git clone https://$(System.AccessToken)@$(System.CollectionUri)/$(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 }}
    
Run Code Online (Sandbox Code Playgroud)


Mer*_*SFT 1

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

对于这个问题,答案是肯定的,有可能。

关于为什么您收到该错误消息,只是$(Build.SourceBranch)您使用的变量()不正确。你应该使用$(Build.SourceBranchName).

通常,对于 ref,我们应该输入 master 或任何其他功能分支。例如

ref: refs/heads/master
Run Code Online (Sandbox Code Playgroud)

这可能会让您认为这与 的值相同$(Build.SourceBranch)。我知道,它看起来一样,但又不同。事实上,对于服务器来说,它会读取准确的分支名称而不是分支路径,我们可以使用经典的编辑器类型清楚地弄清楚这一点:

在此输入图像描述

根据经典的编辑器类型,我们可以知道这里应该输入准确的分支名称。

因此,正如预定义变量所定义的那样, 的值$(Build.SourceBranch)是分支路径,但对于$(Build.SourceBranchName),它代表了一个确切的分支名称。

所以,如果你想执行成功,你需要使用 : $(Build.SourceBranchName)。这对我来说很有效。

希望这也能帮助您远离错误消息。

编辑:

对我有用的完整脚本是:

resources:
  repositories:
    - repository: templates
      type: git
      name: MyApp/MyconApp
      ref: $(Build.SourceBranchName)
Run Code Online (Sandbox Code Playgroud)