Reputation: 4648
I am trying to set our build names to a format of...
$(BuildDefinitionName)_$(versionMajor).$(versionMinor).$(versionPatch)+$(SourceBranchName).$(SourceVersion)
e.g.
OurBigLibraryCI_1.2.3+master.10bbc577
However I coudn't find any predefined variable holding the "short" (7-digit) version of the commit hash. $(SourceVersion)
holds the full SHA-1 hash.
How would one shorten that in yaml based pipeline?
Upvotes: 29
Views: 19136
Reputation: 449
You can create a variable that can be used in the pipeline name
:
name: My Pipeline - $(SHORT_SHA)
variables:
- name: SHORT_SHA
value: $[ substring(variables['Build.SourceVersion'], 0, 7) ]
Upvotes: 1
Reputation: 7482
As the docs say you can't use $(Build.SourceVersion) variable directly in the build name, nor is there an in-built substring Expression
But you can update the Build Number variable dynamically:
pool:
vmImage: 'ubuntu-latest' #'windows-latest' - works on either
steps:
- checkout: none
- powershell: |
$shortHash = "$(Build.SourceVersion)".Substring(0, 7)
Write-Host "##vso[task.setvariable variable=shortHash]$shortHash"
displayName: Set Short Hash
- powershell: Write-Host $(shortHash)
displayName: Display Short Hash
- powershell: Write-Host "##vso[build.updatebuildnumber]$(Build.DefinitionName)_AnyOtherValues_$(shortHash)"
displayName: Update Build Number
- powershell: Write-Host $(Build.BuildNumber)
displayName: Display Build Number
Upvotes: 4
Reputation: 72191
you could use gitversion for that, it would expose shortsha under $(GitVersion.ShortSha)
variable after you run the gitversion task.
on the other hand shortsha is just first 7 characters of a real sha, so you can just use some sort of bash\powershell script to split long sha into short sha
In Git, what is the difference between long and short hashes?
- task: gittools.gittools.setup-gitversion-task.gitversion/setup@0
displayName: gitversion/setup
inputs:
versionSpec: 5.x
- task: gittools.gittools.execute-gitversion-task.gitversion/execute@0
displayName: gitversion/execute
replacement for the deprecated extension
Upvotes: 2
Reputation: 343
You can use traditional command substitution via backticks to obtain the short git hash (SHA-1), assuming that the code is being checked out in $(Build.SourcesDirectory)
:
- bash: |
short_hash=`git rev-parse --short=7 HEAD` ## At least 7 digits, more if needed for uniqueness
echo ""
echo "Full git hash: $(Build.SourceVersion)"
echo "Short git hash: $short_hash"
echo "##vso[task.setvariable variable=short_hash]$short_hash" ## Store variable for subsequent steps
workingDirectory: $(Build.SourcesDirectory)
displayName: Get short git hash
Output:
Full git hash: f8d63b1aaa20cf348a9b5fc6477ac80ed23d5ca0
Short git hash: f8d63b1
The following steps in the pipeline can then use the short hash via the variable $(short_hash)
.
(This is better than manually trimming down the full git hash to seven characters, since this will add extra digits if needed to uniquely identify the commit, see https://stackoverflow.com/a/21015031/1447415.)
The following improved version checks that the git hashes match (that the full hash starts with the short hash) and fails the step otherwise:
- bash: |
short_hash=`git rev-parse --short=7 HEAD`
echo ""
echo "Full git hash: $(Build.SourceVersion)"
echo "Short git hash: $short_hash"
echo ""
## Fail step if full hash does not start with short hash
if [[ $(Build.SourceVersion) != $short_hash* ]]; then
echo "--> Hashes do not match! Aborting."
exit 1
fi
echo "--> Hashes match. Storing short hash for subsequent steps."
## Store variable for subsequent steps
echo "##vso[task.setvariable variable=short_hash]$short_hash"
workingDirectory: $(Build.SourcesDirectory)
displayName: Get short git hash
Upvotes: 10
Reputation: 1948
- script: |
echo $sourceVersion
commitHash=${sourceVersion:0:7}
echo $commitHash
echo "##vso[task.setvariable variable=commitHash]$commitHash" ## Set variable for using in other tasks.
env: { sourceVersion: $(Build.SourceVersion) }
displayName: Git Hash 7-digit
workingDirectory: #workingDirectory
- task: Docker@2
displayName: Build & Push image
inputs:
command: 'buildAndPush'
containerRegistry: '$(myRegistry)'
repository: $(myContainerRepository)
Dockerfile: $(myDockerfile)
buildContext: '$(myBuildContext)'
tags: $(commitHash) ## The variable was defined above.
Here's example for vmImage: "ubuntu-latest". Step:
$(azure_pipeline_variable) with ${bash_shell_variable} or $bash_shell_variable
.Read more:
Upvotes: 11
Reputation: 76870
How would one shorten that in yaml based pipeline?
There is no out of box variable to get the 7-digit version of $(SourceVersion) in Azure Devops. Because the ShortSha
is 8-digit version.
So, to resolve this issue, just like @4c74356b41 said, we have to use bash\powershell script to split long sha into short sha.
You can check my following sample for some more details:
steps:
- script: |
echo $(Build.SourceVersion)
set TestVar=$(Build.SourceVersion)
set MyCustomVar= %TestVar:~0,7%
echo %MyCustomVar%
displayName: 'Command Line Script'
The result:
========================== Starting Command Output ===========================
##[command]"C:\WINDOWS\system32\cmd.exe" /D /E:ON /V:OFF /S /C "CALL "C:\VS2017Agent\_work\_temp\be5f6293-77d8-41b7-a537-49e3b2e7bc6c.cmd""
cb124539c4cb7f19dc8e50e1b021f93c5ffaf226
cb12453
##[section]Finishing: Command Line Script
So, we could get the 7-digit version of $(SourceVersion) is cb12453
.
Hope this helps.
Upvotes: 6