CI/CD管道Azure DevOps自动合并发布后部署

8

我有一个如下的典型环境设置:

我有两个分支:DevelopMaster

在Azure DevOps中是否有设置以下规则的方法:

  1. 当在dev环境(在azure devops的发布管道中定义)上成功部署时------>自动创建一个将develop合并到Masterpull request

  2. 或者另一种情况:如果develop分支Build成功------->自动创建一个将develop合并到Masterpull request

任何帮助都将不胜感激。

3个回答

12

编辑:

我刚刚上传了一个能够实现此功能的扩展: https://marketplace.visualstudio.com/items?itemName=ShaykiAbramczyk.CreatePullRequest


您可以使用 Azure DevOps Rest API 来创建一个拉取请求,在建立 / 发布的末尾添加一个 PowerShell 任务来执行它,例如:

$body =  @{
             sourceRefName= "$(Build.SourceBranch)"
             targetRefName = "refs/heads/master"
             title = "PR from Pipeline"
     }

$head = @{ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"  }
$json = ConvertTo-Json $body
$url = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/git/repositories/$(Build.Repository.Name)/pullrequests?api-version=5.0"
Invoke-RestMethod -Uri $url -Method Post -Headers $head -Body $json -ContentType application/json

Photo3

您需要允许脚本访问OAuth令牌(在代理任务选项中勾选复选框):

Photo1

结果:

enter image description here

我将基本参数放在主体中(从分支,到分支,标题),但您可以添加更多参数,例如评审人,请查看此处的文档。


如果在发布管道中运行脚本时收到“您需要Git的'PullRequestContribute'权限才能执行此操作”错误,那么您应该授予这些权限给谁? - Dicky Moore
1
@DickyMoore 对于构建服务账户,即使您启用了“允许脚本访问......”,您是否仍然遇到了错误? - Shayki Abramczyk
1
如文档所述,您可以使用以下代码添加评审人:"reviewers": [{"id": "d6245f20-2af8-44f4-9451-8107cb2767db"},那如何获取我想要添加为评审人的用户ID呢? - Mohamad Mousheimish
@ShaykiAbramczyk 这个问题只在使用 YAML 时出现,当我使用经典编辑器时,它按预期工作。 - MANZARBEITIA
@MANZARBEITIA 和设置一样吗?请在我的 GitHub 上开一个问题 https://github.com/shayki5/azure-devops-create-pr-task/issues - Shayki Abramczyk
显示剩余3条评论

0

使用Python和DevOps REST API,你可以像这样做。

# Tested in python 3.10
# pip install requests
import base64
import requests

# Fill the following variables with real values
personal_access_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'  # https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&viewFallbackFrom=vsts&tabs=Windows
organization = "myorganization"
project_id = "00000000-0000-0000-0000-000000000000"
repository_id = "00000000-0000-0000-0000-000000000000"

authorization = str(base64.b64encode(bytes(f":{personal_access_token}", "ascii")), "ascii")
headers = {"Content-type": "application/json", "Authorization": f"Basic {authorization}"}

prs_url = f"https://dev.azure.com/{organization}/{project_id}/_apis/git/repositories/{repository_id}/pullrequests?api-version=5.1"

# create PR
response = requests.post(
    f"{prs_url}",
    headers=headers,
    data=json.dumps({
        "sourceRefName": "refs/heads/release",
        "targetRefName": "refs/heads/master",
        "title": "release to master",
    }),
)

0
  1. 没有内置的任务可以完成这个功能,但是您可以使用oauth令牌或自己的身份验证来编写脚本并针对api发出请求。
  2. 在这里可以使用几乎相同的方法,或者您可以使用分支策略来强制要求在将拉取请求合并到主分支之前进行验证(在我看来更好,因为在每次提交时从开发分支合并到主分支是毫无意义的)。

谢谢您的回答,能否请提供更多关于此事的细节: "你可以使用 OAuth 令牌自己编写脚本,或者使用自己的认证对 API 发出请求。" 谢谢。 - Haithem KAROUI
1
我一直在使用github,你只需要调用合并的API:https://developer.github.com/v3/repos/merging/ - 4c74356b41

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接