您好,@DiffEqBot

2019 年 6 月 18 日 | Kanav Gupta

大家好!今天,DiffEq 家族迎来了新成员。让我们欢迎我们的 DiffEqBot - 一个可以帮助运行基准测试并与给定包的当前主分支进行比较的机器人。它还会生成并存储在 仓库 中的报告。最特别的是,它完全是无状态的(根本不涉及数据库,只是在仓库之间切换!)并且没有公开的 URL。尽管受到了 Nanosoldier 的启发,但它拥有完全独特的流程。

  1. 它如何运作?
  2. DiffEqBot 在内部是如何工作的?
  3. 配置机器人
  4. 访问控制和安全
  5. 不足之处和未来展望

它如何运作?

所以,您需要做的就是在 JuliaDiffEq 仓库的 PR 中的评论中调用 @DiffEqBot runbenchmarks,它会为您完成所有工作。它会将您的 pull 请求与当前的主分支进行基准测试,并在作业完成时发布报告链接。在 PR 中发现了错误,现在您不需要完成之前的作业?只需评论 @DiffEqBot abort,它就不会运行。您还需要在仓库的根目录中维护两个文件夹 diagrams(用于生成报告的图表)和 benchmark(用于将结果与主分支进行比较)(如 test 文件夹)。benchmark 文件夹应包含 benchmark/runbenchmarks.jl(它使用 PkgBenchmark 包)和 diagrams 应包含 diagrams/diagrams.jl。您可以将 REQUIRE/Project.toml 存储在 diagrams 文件夹中以专门为 diagrams 生成定义依赖项。

为了收集图表,您只需创建一个名为 DIAGRAMS 的字典并将所有绘图引用保存到该字典中。例如 -

DIAGRAMS = Dict()
sol = solve(prob, Tsit5())
DIAGRAMS["Fig1"] = plot(sol)

目前,DIAGRAMS 不能是递归字典,即字典的元素只能是对绘图的引用。

DiffEqBot 在内部是如何工作的?

DiffEqBot 通过在多个仓库之间跳转来工作,这得益于 GitHub 和 Gitlab 提供的出色 API!我将解释 DiffEqBot 完成特定作业所采取步骤的流程 -

  1. 您在 pull 请求中发表评论以运行基准测试。借助 GitHub Webhook,comment 事件会发布到 Heroku 应用程序上。您会获取该评论所在的仓库名称和 pull 请求编号。它会确保所有健全性检查,例如是否允许该人运行基准测试或仓库是否已注册等。

  1. DiffEqBot 检查是否存在另一个正在等待/正在运行的作业,用于同一个 pull 请求。如果存在,它会拒绝该请求,否则它会接受该作业。它会在 GitHub PR 上发表相应的评论。这是使用 Gitlab 的 作业 API 完成的。(我知道您可能想知道 Gitlab 是从哪里冒出来的;这一点将在下一段中解释)

  1. 现在是关键部分。我们有一个独立的专用 Gitlab 私有仓库,名为 BenchmarkingRepo,它基本上是一个空仓库,但在其中扮演着重要角色,我们将在下面解释。DiffEqBot 会签出名为 REPONAME-PR 的分支,生成 Gitlab CI 配置脚本 (.gitlab-ci.yml) 并对该分支进行提交。该配置的作用是拉取发出请求的 PR,运行基准测试并将结果发布回机器人。基本上脚本如下:

main:
  script:
    - git clone https://github.com/${org}/${repo}
    - cd ${repo}
    - git fetch origin pull/${pr}/head:pr/${pr}
    - git checkout pr/${pr}
    - julia -e "using Pkg;Pkg.clone(pwd());"
    - cd ..
    - julia some_script_to_run_benchmarks.jl "${repo}" "${pr}" "${commit}"

failed_job:
  script:
    - curl "https://endpoint_to_tell_that_report_failed?repo=${repo}&pr=${pr}&commit=${commit}"
  when: on_failure

  1. 一旦我们在 BenchmarkingRepo 的该分支上进行提交,Gitlab CI 就会检测到该推送到该分支的配置脚本,并开始执行。它现在知道需要运行该脚本!它会查找可用的 Gitlab 运行器。我们不使用共享运行器,因为它们不适合基准测试作业。我们为此目的拥有自己的专用 Gitlab 运行器。

  1. some_script_to_run_benchmarks.jl 文件中,我们向 DiffEqBot 发出请求,并在最后以 JSON 格式提供报告。当这种情况发生时,DiffEqBot 会在 GitHub 上的 Reports 仓库中进行提交,提交 Markdown 脚本。

  1. 然后,它会在同一个 PR 上发表评论,通知作业已完成并已生成报告。

太棒了 🎉 工作完成了,都要感谢 DiffEqBot!

配置机器人

DiffEqBot 的所有配置都通过 Heroku Dyno 中的 config.json 文件完成。它包含您需要传递给机器人的所有信息,以便它能够正常工作。这意味着要部署您自己的机器人,您只需要编辑此文件即可。config.json 文件的格式如下:

{
  "admin"               : "kanav99",
  "homepage_url"        : "https://appnameffeqbot.herokuapp.com",
  "org"                 : "JuliaDiffEq",
  "registered_repos"    : ["OrdinaryDiffEq.jl"],
  "benchmarkers"        : ["kanav99", "ChrisRackauckas"],
  "bot_name"            : "DiffEqBot",
  "gitlab_runner_secret": "secret_secret_secret",
  "github_app"          :
    {
      "client_id"           : "github-app-client-id",
      "client_secret"       : "github-app-client-secret",
      "bot_endpoint"        : "/bot/secret/endpoint"
    },
  "gitlab_account"      :
    {
      "benchmarking_repo_id": 12345678,
      "access_token"        : "access_token_of_bot_account_gitlab"
    },
  "github_account"      :
    {
      "access_token"        : "access_token_of_bot_account_gitlab"
    }
}

访问控制和安全

目前,我们只授予组织中某些成员访问权限。我们称这些成员为“基准测试员”。基本上,机器人配置中有一个名为 benchmarkers 的数组。当您在仓库中发表评论时,GitHub Webhook 会为您提供发表评论的人员的句柄,这样您就可以检查此人是否在 benchmarkers 列表中。限制访问权限的主要原因是,您允许来自非成员的代码在您的运行器上运行。这对您的机器来说可能非常糟糕。将运行器容器化可以解决此问题。此外,目前没有提供仓库级访问权限的条款。这很容易做到,并期待很快发布补丁!还需要另一个功能是简单的访问控制 - 您不能每次都编辑 Heroku Dyno。我们可以做的事情是

  1. 为此目的创建一个仓库(再次) - 在其文件(s)中维护分层访问控制。要请求访问权限,您需要在该仓库中创建 PR,一旦获得批准并合并 - 您将获得运行基准测试的权限。

  2. 向 DiffEqBot 添加 addbenchmarker 命令,该命令会将指定的人员设置为基准测试员。在内部,这需要机器人对访问控制仓库进行提交(记住机器人是无状态的)。

不足之处和未来展望

我非常喜欢这个社区的新成员。但它仍然存在一些不足之处。如上所述,由于安全问题,我们只允许组织中某些成员访问权限,以运行基准测试。此外,我们准备了一个简单的前端来显示报告,但更完善的设计将受到欢迎!我们可能还需要为 DiffEqBot 添加比 runbenchmarksabort 更多的命令。所有这些额外的功能都将锦上添花。我还计划将其开源并维护一份完整的文档,以便其他社区也可以将其部署到其用途,并可能帮助开发它!