【问题标题】:Can we raise and merge a pull request from Azure Devops pipelines?我们可以从 Azure Devops 管道提出和合并拉取请求吗?
【发布时间】:2021-05-31 18:18:04
【问题描述】:

我有一个发布分支,通过它我正在执行 CI/CD yaml 管道并将应用程序部署到 AKS 上的不同环境中。

一旦我的 UAT 部署阶段完成,我想创建一个拉取请求并在没有冲突的情况下合并分支,从发布分支到主分支。并且仅在完成 ​​Pull Request 后,应该开始 PROD 部署阶段。

是否有任何任务/脚本可以帮助我实现目标?

我已经检查了Create Pull Request 扩展,但目前它只支持 Windows 机器。

我还阅读了有关创建拉取请求的 Azure DevOps REST API,但有人提到该 API 仅支持 2 次提交。

如有任何帮助,我们将不胜感激。

【问题讨论】:

    标签: git azure-devops azure-pipelines pull-request azure-pipelines-yaml


    【解决方案1】:

    您可以使用 Pull Requests - Create Rest Api 创建一个拉取请求,正如 Shayki Abramczyk 提到的那样。见example

    但是,有一种更简单的方法是在附加代理作业中使用创建拉取请求扩展并在 Windows 代理上运行此作业。请参阅以下步骤:

    1,在您的 UAT 部署阶段添加另一个代理作业。

    2、添加Create Pull Request任务来创建Pull request。

    如果您希望在拉取请求完成时自动启动 PROD 部署阶段。您可以考虑在 PROD 部署阶段使用 Invoke rest api Gate。有关 Gate 的更多信息,请参阅here。您可以参考以下步骤:

    1,创建通用服务连接以连接到您的 azure devops 项目。

    导航到项目设置-->服务连接-->新建服务连接-->通用

    服务器网址:https://dev.azure.com/OrgName/ProjName

    密码:个人访问令牌

    2、为PROD部署阶段添加一个invoke rest api Gate。

    invoke rest api Gate 将调用Pull Requests - Get Pull Requests rest api 来获取在 UAT 阶段创建的 Pull 请求。而且只有在Pull请求完成后才能通过gate。

    网址后缀和参数:/_apis/git/repositories/{RepoId}/pullrequests?searchCriteria.sourceRefName=refs/heads/{sourceBranchName}&searchCriteria.targetRefName=refs/heads/{TargetBranchName}&$top= 1&api-version=6.1-preview.1

    成功标准:not(root['value'][0])

    更新:

    要在 yaml 管道中使用上述调用 rest api。您需要使用 deployment job 并为您的环境定义批准和检查。

    更多信息请参见approvals and checks

    查看here了解有关环境的更多信息,

    看到这个帖子Implementing Gates in Azure YAML Pipelines

    【讨论】:

    • 感谢您的建议。我没有使用发布管道,而是使用 YAML 管道。将检查我们如何将上述方法集成到 YAML 中
    • @ShrijitNarkar 您可以通过部署作业使用上述调用 rest api 任务,并为您的环境定义批准和检查。请参阅上面的更新。
    • 我尝试在我的生产环境变量中添加 Invoke REST API Gate。我现在面临的问题是,大门没有通过。它继续等待满足成功标准。我使用的 URL 后缀是:/_apis/git/repositories/$(Build.Repository.Name)/pullrequests?searchCriteria.sourceRefName=refs/heads/demo_release&searchCriteria.targetRefName=refs/heads/demo_master&$top=1&api-version =5.0 这个变量 $(Build.Repository.Name) 是否在审批门中得到解决?在您的示例中,您直接提供了 repo id。
    • @ShrijitNarkar 您能否检查一下 Invoke REST API Gate 的日志中是否有任何错误消息?
    【解决方案2】:

    在 Linux 中,您可以使用 PowerShell corerest API 创建 PR:

    $body =  @{
                 sourceRefName= "refs/heads/feature"
                 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
    

    【讨论】:

    • 谢谢!我会测试并回复
    • 我通过在 Windows VM 上执行你的任务来使用它,它已经工作了。现在,我正在尝试添加 Levi Lu 在他的回答中建议的批准门,以通过调用 REST API 检查 PR 是否已合并。 CreatePullRequest 任务在变量 $(pullRequestId) 的响应中提供 PullRequestId。您能否指导我如何在 Invoke REST API Approval Gate 的 URL 后缀中使用此变量?我尝试了以下 URL 后缀:/_apis/git/repositories/$(Build.Repository.Name)/pullrequests/$(pullRequestId)?api-version=5.0 但它似乎不起作用。
    • 我不认为$(pullRequestId) 在门中可用:/它仅在任务中可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多