Azure Devops 中是不是存在 $(SourceVersion) 的 7 位短版本?

Posted

技术标签:

【中文标题】Azure Devops 中是不是存在 $(SourceVersion) 的 7 位短版本?【英文标题】:Is there a short 7-digit version of $(SourceVersion) in Azure Devops?Azure Devops 中是否存在 $(SourceVersion) 的 7 位短版本? 【发布时间】:2019-11-20 06:03:49 【问题描述】:

我正在尝试将我们的构建名称设置为...的格式

$(BuildDefinitionName)_$(versionMajor).$(versionMinor).$(versionPatch)+$(SourceBranchName).$(SourceVersion) 例如 OurBigLibraryCI_1.2.3+master.10bbc577

但是,我找不到任何包含“短”(7 位)版本的提交哈希的预定义变量。 $(SourceVersion) 保存完整的 SHA-1 哈希。

如何在基于 yaml 的管道中缩短它?

【问题讨论】:

【参考方案1】:

你可以使用gitversion,它会在你运行gitversion任务后暴露$(GitVersion.ShortSha)变量下的shortsha。

另一方面,shortsha 只是真正 sha 的前 7 个字符,因此您可以使用某种 bash\powershell 脚本将长 sha 拆分为短 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

替换已弃用的扩展

【讨论】:

GitVersion.ShortSha 不作为预定义变量存在,此答案不正确。 请注意,上面引用的扩展现在已弃用 可能还有一个不是 上面提到的扩展尽管被弃用了仍然有效,但是有一个新的。添加到答案中。【参考方案2】:

如何在基于 yaml 的管道中缩短它?

在 Azure Devops 中没有现成的变量来获取 $(SourceVersion) 的 7 位版本。因为ShortSha8-digit 版本。

所以,要解决这个问题,就像@4c74356b41 说的,我们必须使用 bash\powershell 脚本将长 sha 拆分为短 sha。

您可以查看我的以下示例了解更多详细信息:

steps:

- script: |
   echo $(Build.SourceVersion)

   set  TestVar=$(Build.SourceVersion)

   set MyCustomVar= %TestVar:~0,7%

   echo %MyCustomVar%

  displayName: 'Command Line Script'

结果:

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

所以,我们可以得到 $(SourceVersion) 的 7 位版本是cb12453

希望这会有所帮助。

【讨论】:

我在 Azure Devops 中有一个构建管道,其中一个步骤是一个内联 powershell 脚本,用于在一个名为 shortCommitId 的变量中提取 SourceVersion 的 7 位版本。但是我还没有弄清楚如何在下一步“发布工件”中使用这个变量。在 powershell 步骤中,我在输出变量部分设置了一个引用名称:ps。然后在 Publish Artifact 步骤中,我使用 $(ps.shortCommitId) 但生成的工件名称使用字符串 $(ps.shortCommitId) 而不是 powershell 脚本中设置的值。我错过了什么? @erik,由于该主题已关闭,我建议您打开一个新主题,详细介绍您的问题,该论坛上的更多社区成员可能会进一步查看您的问题并提供更多建议。跨度> 【参考方案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.

这是 vmImage 的示例:“ubuntu-latest”。步骤:

    从预定义的 GitHash 中拆分 7 个字符 将其分配给管道变量。不要混淆$(azure_pipeline_variable) with $bash_shell_variable or $bash_shell_variable。 通过 $(commitHash) 使用它

阅读更多:

    Assign variable in Azure pipeline Using script in Azure pipeline

【讨论】:

【参考方案4】:

假设代码在$(Build.SourcesDirectory)中签出,您可以通过反引号使用传统的命令替换来获取短git哈希(SHA-1):

  - 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

输出:

Full git hash:  f8d63b1aaa20cf348a9b5fc6477ac80ed23d5ca0
Short git hash: f8d63b1

管道中的以下步骤可以通过变量$(short_hash) 使用短哈希。

(这比手动将完整的 git 哈希缩减为七个字符要好,因为如果需要唯一标识提交,这会添加额外的数字,请参阅https://***.com/a/21015031/1447415.)

更新:改进版

以下改进版本检查 git 哈希是否匹配(完整哈希以短哈希开头),否则该步骤失败:

  - 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

【讨论】:

您编辑的代码 - 为什么检查很重要?似乎是多余的。 @sommmen:我已经有一段时间没有看到这个了,但我记得,可能会发生 git 哈希($(Build.SourceVersion)git rev-parse HEAD)不匹配的情况。我认为,例如,如果在 Azure 作业启动后立即推送一些新代码,就会发生这种情况,以便该作业拉下一些错误/意外的代码。在这种情况下,我相信我们希望构建失败,以便可以在新代码上重新启动它。

以上是关于Azure Devops 中是不是存在 $(SourceVersion) 的 7 位短版本?的主要内容,如果未能解决你的问题,请参考以下文章

Azure DevOps REST API - 创建工作项 - “需要一个值”

Azure Devops Repos - 恢复到以前的提交,就像最近的提交从未存在过一样

[getPersonalAccessTokenHandler在ES2015模块中使用azure-devops-node-api时不是函数

将文件上传到 azure devops

在 Azure DevOps 中是不是有一种 GUI 方法可以禁用基于 YAML 的管道中的任务?

Azure Devops:是不是可以将 yaml 模板嵌套在另一个 yaml 模板中?