在Azure DevOps中创建“基于差异”的拉取请求入口

Create "diff-based" pull request gate in Azure DevOps

提问人:nrofis 提问时间:11/16/2023 最后编辑:nrofis 更新时间:11/16/2023 访问量:61

问:

我有一个门(构建验证/状态检查),可以运行我编写的一些基准测试。基准测试运行新代码并返回新代码的总运行时间。

我想让这个门成为基于差异的指标,而不是像“如果时间小于 10 秒”这样的硬编码阈值,以查看新建议的代码与来自该分支的分支提交结果之间的运行时间差异百分比(通常在代码覆盖率门中完成)main

是否有内置方法可以在Azure DevOps上制作“基于差异”的门?

azure-devops 持续集成 azure-pipelines 拉取请求

评论

0赞 Kevin Lu-MSFT 11/16/2023
对于拉取请求入口,你的意思是Azure DevOps中的拉取请求功能吗?据我所知,Azure DevOps使用分支策略来验证拉取请求。如果可能,您能否共享拉取请求门的当前设置?
1赞 nrofis 11/16/2023
拉取请求门 - 生成验证或状态检查,如代码覆盖率。我想创建一个将验证拉取请求但具有百分比差异的请求
0赞 Kevin Lu-MSFT 11/16/2023
在Azure DevOps中,没有内置方法可以实现它。为了解决,我们可以设置 Pipeline and Branch Policy -> Build Validation 来获得类似的功能。请检查答案,我已经分享了一些步骤。

答:

1赞 Kevin Lu-MSFT 11/16/2023 #1

恐怕没有内置方法可以在Azure DevOps中制作“基于差异”的门。

解决方法是,您可以通过 Branch 策略中的 Build Validation 运行 Pipeline,以获取 Pull Ruqeust 预合并代码的运行时间和 main 分支的运行时间。最后,通过自定义脚本获取百分比。

步骤如下:

Step1:创建 Build Pipeline(YAML 类型),并使用 repo 资源检出当前 repo 的 main 分支。

例如:

resources:
  repositories:
  - repository: mainbranchrepo
    type: git
    name: sqlite-dotnet-core.git
    ref: main
    

pool:
  vmImage: ubuntu-latest

steps:
- checkout: self
  path: s/PullRequest
- checkout: mainbranchrepo
  path: s/MainBranch

在这种情况下,一旦 Pull Request 触发了流水线,它将同时检出预合并的分支和主分支。

Step2:添加步骤以在 Pull Request Branch 和 Main Branch 上运行基准测试。然后,您可以收集基准测试的两个运行时

Step3:添加自定义脚本以获取运行时的百分比差异。

例如:

resources:
  repositories:
  - repository: mainbranchrepo
    type: git
    name: sqlite-dotnet-core.git
    ref: main


pool:
  vmImage: ubuntu-latest

steps:
- checkout: self
  path: s/PullRequest
- checkout: mainbranchrepo
  path: s/MainBranch
-  run benchmark tests on Pull Request Branch
-  run benchmark tests on Main Branch

- script: custom script to get the % result

步骤 4:添加生成验证分支策略以使用上面的 YAML 管道。

当 Pull Request 触发 Pipeline 时,它将显示以下分支:

enter image description here

注意:如果需要在自定义脚本中使 Pipeline 失败或将运行时值传递给下一个任务。您可以使用 logging 命令

评论

0赞 nrofis 11/16/2023
谢谢你的回答。但我并不完全理解。如何一个接一个地使用两个,如何在正确的分支中运行基准测试?checkout
1赞 Kevin Lu-MSFT 11/16/2023
在结帐步骤中,我们可以设置每个分支的路径。然后,分支将签出到单独的文件夹。运行基准测试时,可以使用特定文件夹中的代码。例如:转到目标文件夹并运行基准测试。
1赞 Kevin Lu-MSFT 11/16/2023
由于它来自同一个存储库,如果我们不设置结帐分支的路径,则后面的签出分支将覆盖上一个签出的分支。所以这是必需的。答案 abobee 中的路径值:s/PullRequest = $(build.sourcesdirectory)/PullRequest
1赞 nrofis 11/16/2023
啊,现在我明白了。谢谢!