【问题标题】:Get changes from all commits in an Azure DevOps YAML pipeline从 Azure DevOps YAML 管道中的所有提交中获取更改
【发布时间】:2022-01-28 11:59:05
【问题描述】:

我正在编写一个 ADO YAML 管道,该管道在将文件推送到存储库时进行一些修改。到目前为止一切正常,除了我无法一次处理多个提交。 我需要获取自上次推送到推送(触发器)最初来自的分支以来所有更改文件的列表。

Build.SourceVersion 只返回最新提交,我找不到任何其他内置变量

没有可用于 REST API (https://docs.microsoft.com/en-us/rest/api/azure/devops/git/commits/get-push-commits?view=azure-devops-rest-6.0) 的 PushId

在 Github 操作中,前一个和最新的提交 ID 作为变量公开,然后我可以使用这些变量来获取自上次推送以来的更改,但我在 ADO 中找不到类似的东西

还有其他方法可以获取这些信息吗?

【问题讨论】:

  • 您可能希望缩小此处使用的标签集,以便获得有用的(ADO 特定的)答案,如果这些答案甚至存在的话......

标签: azure azure-devops yaml push commit


【解决方案1】:

DevOps API 中有一个方法可以get all the changes associated with a specific build

这是我用于类似目的的脚本中的 sn-p:

$changes = Invoke-RestMethod -Method Get -Headers $headers "https://dev.azure.com/$organization/$project/_apis/build/builds/$buildId/changes?api-version=5.1" -verbose

$changedPaths = @()
if ($changes.count -gt 0) {
    $commitId = $changes.value[$changes.value.length - 1].id
    write-verbose "first change: $commitId" -Verbose

    $commitId = $changes.value[$changes.value.length - 1].id
    $head = $changes.value[0].id
    
    $changedPaths = git diff "$($commitId)~1" $head --name-only
}

【讨论】:

    【解决方案2】:

    感谢来自 qbik 的输入,我想出了以下 YAML 任务,该任务在推送之前和之后获取 GIT 提交 ID,并将这些值写入环境变量以在以下脚本中使用:

    - task: PowerShell@2
      displayName: Get GIT Commit-IDs before and after Push
      inputs:
        targetType: 'inline'
        script: |
          # print Information stream
          $InformationPreference = "Continue"
    
          $headers = @{ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN" }
          $uri = "$env:SYSTEM_TEAMFOUNDATIONSERVERURI$env:SYSTEM_TEAMPROJECT/_apis/build/builds/$($env:BUILD_BUILDID)/changes?api-version=5.1"
          $changes = Invoke-RestMethod -Method Get -Headers $headers -Uri $uri -Verbose
    
          if ($changes.count -gt 0) {
              $commit_id_before = $changes.value[$changes.count - 1].id
              $commit_id_after = $changes.value[0].id
    
              Write-Information "Commit ID before push: $commit_id_before"
              Write-Information "Commit ID after push:  $commit_id_after"
    
              Write-Host "##vso[task.setvariable variable=GIT_EVENT_BEFORE]$commit_id_before"
              Write-Host "##vso[task.setvariable variable=GIT_EVENT_AFTER]$commit_id_after"
          }
          else {
            Write-Warning "No changes found in Build $buildId"
          }
        pwsh: true
      env:
        SYSTEM_ACCESSTOKEN: $(System.AccessToken)
    

    【讨论】:

    【解决方案3】:

    类似的东西

    git log --pretty=format:"" --name-only <oldCommitHash>..<newCommitHash> | sort -u
    

    它将查找上次推送和当前推送之间的所有提交,输出每个更改文件的列表(--pretty=format:"" 是为了防止提交元数据输出,--name-only 将 diff 变成仅仅是一个列表更改的文件),sort -u 将有助于重新排序和摆脱双打/空白。

    【讨论】:

    • 当然可以,这也是我在 Github 操作中使用的方法,但是如何在 Azure DevOps 中获取 oldCommitHash?
    • 啊,我没明白 this 是你要问的那部分。
    • 抱歉不清楚 - 我刚刚更新了最初的问题
    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 2022-11-14
    • 2020-05-23
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多