Forum Discussion

blashmet's avatar
blashmet
Copper Contributor
Oct 28, 2023

Variables in Resources:Repositories:Repository:Ref

According to this documentation, the "Resources:Repositories:Ref" property supports template expressions, so that one can parameterize the ref property as follows:

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

For our use case, this is so that we can check out the same branch across dependency repos in the pipeline:

 

MainRepo (develop)
DependencyRepo1 (develop)
DependencyRepo2 (develop)

or...

MainRepo (release)
DependencyRepo1 (release)
DependencyRepo2 (release)

 

Using ref: ${{ variables['Build.SourceBranch'] }} works great when the pipeline is triggered manually through the ADO GUI: if the develop branch is selected, the dependency repos also check out the develop branch and likewise for release.

 

The problem occurs with PR build triggers, since ${{ variables['Build.SourceBranch'] }} resolves to refs/pull/1/merge, rather than develop or release.

 

The dependency repos, naturally, do not have a corresponding refs/pull/1/merge branch, but even if they did, we want ${{ variables['Build.SourceBranch'] }} to resolve to the PR's target branch (either develop or release, so that the dependency repo's develop or release branch will also be checked out).

 

So, we have tried many ways to conditionally set the value for ref, for example, using a variable:

variables:
- name: DependencyBranch
${{ if eq(variables['Build.Reason'], 'Manual') }}:
value: $[variables.SourceBranchName]
${{ elseif eq(variables['Build.Reason'], 'PullRequest') }}:
value: $[variables.System.PullRequest.targetBranch] *this sets the correct value for PRs
${{ else }}:
value: develop 
resources:
repositories:
- repository: templates
   type: git
   name: Templates
   ref: $(DependencyBranch)
 
This also works great for manual builds, but PR triggers still do not resolve the correct value.
 
Is there any way to implement support for checking out the same branch across dependency repos, for both Manual and PR builds?
  • roderickbant74's avatar
    roderickbant74
    Copper Contributor

    Hi blashmet ,

     

    Thanks for your great question. I see in your example that in the Manual case your reference SourceBranchName and in the PR case your reference targetBranch without the Name suffix in the variable name. In the documentation on system variables it describes how the `System.PullRequest.targetBranchName` variable contains the branch name and the `System.PullRequest.TargetBranch` variable contains the full ref. This behaviour is the same for the `Build.SourceBranch` and `Build.SourceBranchName` variables. Where again the first contains the full ref and the other just the branch name.

     

    So in your case I would try to use `System.PullRequest.targetBranchName` instead of `System.PullRequest.targetBranch`. Hope that helps in solving your issue.

     

    See Predefined variables - Azure Pipelines | Microsoft Learn for details on the variations

Resources