【问题标题】:Is it possible to read the PR tag on a pipeline task?是否可以读取管道任务的 PR 标签?
【发布时间】:2020-07-20 15:27:48
【问题描述】:

我的问题基本上是标题。我在阅读this page 和搜索网络时找不到此类信息。

我的场景如下:每当我创建一个 PR 到 master 时,我都会添加一个带有一些信息的标签,比如这里看到的 lib 版本:

然后,在构建过程中,我生成发行说明并希望在任务中访问该 PR 标签,就像我在此处使用 $(Build.BuildId) 所做的那样:

我怎样才能做到这一点?类似$(PullRequest.Tag) 谢谢!

【问题讨论】:

  • 在尝试我的解决方法时如果有任何问题请告诉我~(在我的测试中效果很好)
  • 在该任务中硬编码 URL 怎么样? $url = "https://dev.azure.com/YourOrgName/YourProjectName/_apis/git/repositories/YourRepoName/pullRequests/$($env:SYSTEM_PULLREQUEST_PULLREQUESTID)/labels?api-version=5.1-preview.1"

标签: azure-devops azure-pipelines


【解决方案1】:

我怎样才能做到这一点?类似 $(PullRequest.Tag) 谢谢!

Pull Request 标签有 no 预定义变量。 (我在 CMD 任务中使用printenv 命令来确认这一点!)

这是我的解决方法:

使用Powershell task调用this rest api,响应将包含特定PR的标签

$url = "$($env:SYSTEM_TEAMFOUNDATIONSERVERURI)$env:SYSTEM_TEAMPROJECTID/_apis/git/repositories/$($env:BUILD_REPOSITORY_NAME)/pullRequests/$($env:SYSTEM_PULLREQUEST_PULLREQUESTID)/labels?api-version=5.1-preview.1"
$response = Invoke-RestMethod -Uri $url -Method Get -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}

Write-Host "##vso[task.setvariable variable=PullRequestTag;isOutput=true]$($response.value.name)"

然后将变量$response.value.name(来自rest api响应,名称代表标签名称)传递给输出变量PullRequestTag(自定义变量),以便下一个任务可以访问返回的标签名称。

注意事项:

1.确保包含 Powershell 任务的作业允许脚本访问 OAuth 令牌,因为我的脚本使用 OAuth 令牌而不是 PAT 来调用 rest api。 (单击代理作业名称=>其他选项)

2.既然是output variable,我们应该使用$(referenceName.variablename)的格式。

之后,我们可以在接下来的任务中使用$(PS.PullRequestTag)来访问标签名。

3.由于您的场景是在 PR 触发的管道运行中,所以实际上 Powershell 任务应该只在当前管道由 PR 触发而不是手动运行/CI 时运行。

在 PS 任务的控制选项中使用and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'))。请参阅 conditionsBuild.Reason 变量。

更新:

如果我在创建 PR 时添加了几个标签:

$(PS.PullRequestTag) 的值为:

【讨论】:

  • 谢谢 Lance,我现在就试试看是否有效。感谢您提供详细的过程。
  • 谢谢你,它非常彻底,因为这对我来说是一个全新的领域,我很感激详细的回答。我已经设置好所有东西,并会在几个小时内对其进行测试,但我有一个问题。如果标签是一个数组呢?我应该对此负责吗?这对我来说不是什么大问题,因为我可以为所有制作 PR 的开发人员设置一个规则,始终只使用版本作为标签。我只需要知道才能正确处理问题。
  • @eestein 你的意思是向 PR 添加几个标签,如果是这样,变量将表示一个字符串变量,如:Tag1 Tag2 Tag3 格式。(见我上面的更新)。如果我误解了你的意思的数组,请用一个简单的例子纠正我,这样我就可以在我这边测试它:)
  • 知道了,谢谢!我今天将完成我的测试并将其标记为答案。再次感谢
  • Lance,谢谢你,但我的要求有一个小的变化。个人CI 是触发器。这是实际情况(对不起,我忘记了)。我有一个 CI,它会在合并之前检查一切是否正常,然后它会触发一张 CD,该 CD 将实际生成注释并从 PR 中读取标签。这张 CD 是否可以访问 PR?
【解决方案2】:

我怀疑拉取请求标签是否存在预定义变量,但您可以使用 REST API 实现目标。例如,您可以有一个构建任务(例如 PowerShell 脚本):

【讨论】:

  • 谢谢严,感谢您的指导。
猜你喜欢
  • 2020-11-10
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
相关资源
最近更新 更多