Is there a short 7-digit version of $(SourceVersion) in Azure Devops?

|▌冷眼眸甩不掉的悲伤 提交于 2020-12-25 09:22:25

问题


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?


回答1:


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.




回答2:


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.)

Update: Improved version

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



回答3:


- 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:

  1. Split 7-characters from Pre-defined GitHash
  2. Assign it to Pipeline variable. Don't confuse $(azure_pipeline_variable) with ${bash_shell_variable} or $bash_shell_variable.
  3. Use it by $(commitHash)

Read more:

  1. Assign variable in Azure pipeline
  2. Using script in Azure pipeline



回答4:


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?



来源:https://stackoverflow.com/questions/56973612/is-there-a-short-7-digit-version-of-sourceversion-in-azure-devops

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!