获取持续部署发布的拉取请求 ID [Azure Pipelines]

Get the pull request ID of a continuous deployment release [Azure Pipelines]

我正在尝试设置 azure 管道以在每次 PR 更新时触发构建,并在每次合并时触发发布。由于合并 PR 时的几个原因,我需要访问由 PR 的最新验证版本保存的数据。

但是要做到这一点,我需要在发布管道的 运行 期间使用 PRid。如何才能做到这一点?

在 Release Pipeline 中,您可以使用变量 $(RELEASE.ARTIFACTS.<<Source alias name>>.PULLREQUEST.ID) 来获取 Pull Request ID。

注意:Source 别名是在发布工件中设置的名称。

顺便说一下,如果您在脚本中使用默认变量,您必须先将默认变量名称中的 . 替换为 _

例如:$env:RELEASE_ARTIFACTS_<<Source alias name>>_PULLREQUEST_ID

这是关于 the Release variables 的文档。

希望对您有所帮助。

根据您的情况,据我所知,在您的版本中获取相关构建信息很复杂。此外,如果不涵盖所有可能的情况,可能会导致意想不到的结果。

我建议你可以参考下面的步骤:

  1. 删除发布 build/pipeline 工件或不必要的任务,只保留验证任务,这将节省大量时间。 (因为,一般来说,验证构建会被触发太多次,浪费太多时间发布无用的工件或其他数据)
  2. 创建新的构建管道并为目标分支(例如 master)启用持续集成
  3. 添加发布build/pipeline工件任务
  4. 编辑发布管道和link 这个构建管道并启用持续部署。 (可以添加额外的过滤器)

通过这种方式,在完成拉取请求后,将触发这个新的构建管道并发布必要的工件,然后触发发布。

对于拉取请求验证构建,他们只是执行任务来验证代码(例如构建项目),而不是发布工件。

节省时间的简单场景:

一个拉取请求有 50 个验证构建

  • 旧方法:发布每个工件需要 1 分钟,那么总时间为 50 分钟
  • 新方式:新管道做构建和发布的任务,只需要运行一次,可能只需要10分钟。

那你可以节省40分钟。

您可以从发布中检索触发构建的提交 ID。 然后在已完成的 PR 列表中搜索 commitId 并检索您的 PR 编号。

$commitId = "$(RELEASE.ARTIFACTS.{YOURARTIFACTALIAS}.SOURCEVERSION)"
$repoId = "$(RELEASE.ARTIFACTS.{YOURARTIFACTALIAS}.REPOSITORY.ID)"

$pullRequestsUri = "https://dev.azure.com/{organization}/{project}_apis/git/repositories/" + $repoId + "/pullrequests?searchCriteria.status=completed&api-version=5.1"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f "", "$(System.AccessToken)")))

$pullRequests = Invoke-RestMethod -Uri $pullRequestsUri -Method GET -ContentType "application/json" -Headers @{Authorization = "Basic $base64AuthInfo" }

foreach ($value in $pullRequests.value) {
    if ($value.lastMergeCommit.commitId -eq $commitId) {
        $pullRequestId = $value.pullRequestId
    }
}

Write-Host $pullRequestId