如何获取PR标题并将其存储在变量中

时间:2020-02-14 03:56:07

标签: azure-devops azure-pipelines

我希望能够获得PR消息并将其存储为Azure Devops中的变量,因此我可以将标题更改为具有** SKIP TEST **并在管道中进行扫描,而不是通过变量UI手动。

我想我只需要执行某种REST API调用,因为我已经有了PR ID和其他标识信息。然后使用读取输出并将值存储到变量的工具。

2 个答案:

答案 0 :(得分:1)

我想我只需要执行某种REST API调用,因为我已经有了PR ID和其他标识信息。

既然您已经有了PR ID,我建议使用Pull Requests - Get Pull Request By Id

使用此api:

GET https://dev.azure.com/{organization}/{project}/_apis/git/pullrequests/{pullRequestId}?api-version=5.1

您可以在文档response sample中看到title

  ...
  "creationDate": "2016-11-01T16:30:31.6655471Z",
  "title": "A new feature",
  "description": "Adding a new feature",
  ...

将其存储在变量中

关于如何将其存储在变量中,我建议您可以创建一个变量,然后对其进行更新。

请参考下面的演示,使用powershell任务调用Rest Api并更新变量值,然后在下一个cmd任务中使用它:

变量:

enter image description here

Powershell任务:

enter image description here

Powershell脚本:

$personalToken="******************************"
$token=[System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($personalToken)"))
$header=@{authorization="Basic $token"}
$projectUrl ="https://dev.azure.com/{organization}/{project}/_apis/git/pullrequests/{PRid}?api-version=5.1"
$content=Invoke-RestMethod -Uri $projectUrl -Method GET -contentType "application/json" -Headers $header
Write-Host "##vso[task.setvariable variable=myTitle;]$content"

CMD任务:

enter image description here

CMD结果:

enter image description here

答案 1 :(得分:0)

要在YAML管道(而不是Classic)上执行此操作

steps:
  - bash: |
      PR_TITLE="$(curl --silent -u azdo:$SYSTEM_ACCESSTOKEN \
       $(System.CollectionUri)_apis/git/repositories/$(Build.Repository.ID)/pullRequests/$(System.PullRequest.PullRequestId)?api-version=5.1 \
       | jq -r .title)"
      echo "##vso[task.setvariable variable=Pr.Title]$PR_TITLE"
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)
    displayName: Extract pull request title
    condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'))

  - bash: |
      echo "running test"
    displayName: Run test
    condition: and(succeeded(), not(startsWith(variables['Pr.Title'], '**SKIPTEST**')))

下面是一个示例,其中所有内容都在一行中,但我更喜欢上面的示例,因为新手更容易阅读

steps:
  - bash: |
      echo "##vso[task.setvariable variable=Pr.Title]"$(curl --silent -u azdo:$SYSTEM_ACCESSTOKEN $(System.CollectionUri)_apis/git/repositories/$(Build.Repository.ID)/pullRequests/$(System.PullRequest.PullRequestId)?api-version=5.1 | jq -r .title)
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)
    displayName: Extract pull request title
    condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'))

  - bash: |
      echo "running test"
    displayName: Run test
    condition: and(succeeded(), not(startsWith(variables['Pr.Title'], '**SKIPTEST**')))

标签

此外,如果您更喜欢“标签”而不是更改标题(我自己更喜欢标题,因为它在任何地方都清晰可见),则可以使用以下脚本提取标签

steps:
- bash: |
    LABELS=$(curl --silent -u azdo:$SYSTEM_ACCESSTOKEN $(System.CollectionUri)_apis/git/repositories/$(Build.Repository.ID)/pullRequests/$(System.PullRequest.PullRequestId)/labels?api-version=5.1-preview.1 | jq .value[].name)
      echo "##vso[task.setvariable variable=Pr.Labels]$LABELS"
  env:
    SYSTEM_ACCESSTOKEN: $(System.AccessToken)
  displayName: Get Pull Request Labels
  condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'))
- bash: |
    echo "running test"
  displayName: Run test
  condition: and(succeeded(), not(contains(variables['Pr.Labels'], '"skip-test"')))

请注意,我没有在JQ上使用-r来引用值。这样可以更明确地检查字符串,而不是匹配可能包含文本作为子字符串的标签。