使用Pronto和GitHub Actions的自动代码审查|Everyday Rails

165 阅读4分钟

在传统应用程序上使用Ruby风格和格式化工具(如Standard或rufo)是很棘手的。你对一个现有的文件做了一个小改动,运行linter来检查你的工作,然后--当。这么多的样式预先存在的风格违反了!如此嘈杂的git提交!这就是为什么我非常喜欢Pronto--它只检查你的特定改动,而不是整个文件,所以你可以把改动控制在范围内。

我在过去写过关于用 Pronto 在本地自动审查代码的文章,以及我喜欢围绕代码审查采取的心态(无论是作为审查者还是被审查者)。在这篇文章中,我将更进一步,展示如何通过将 Pronto 与 CI 管道(特别是GitHub Actions)集成来提升自动化代码审查。

这里显示的设置是针对 GitHub Actions 的,但 Pronto 也可以与 GitLab 或 Bitbucket 集成。详情请参考Pronto 的 README 文件

如何用 GitHub Actions 设置 Pronto

我假设你的项目已经在 GitHub 上了。我建议在一个新的分支中进行这项工作,而不是直接推送到你的项目的默认分支,这样你就可以用一些故意的坏代码来测试集成。

添加一个配置文件,告诉GitHub Action在每个拉动请求上扫描代码。这几乎是逐字照搬 Pronto README 中提供的例子,但我对其进行了修改,以分享我最常用的运行程序,并加上注释来帮助解释几个步骤。

把文件放在*.github/workflows目录中。你可以把文件命名为任何你想要的,只要它以.yml*结尾即可:

name: Code quality
# Run this workflow when a pull request is created.
on: [pull_request]

jobs:
  pronto:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      # Pronto docs suggest limiting the depth of the clone
      # to speed things up.
      - run: |
          git fetch --no-tags --prune --depth=10 origin +refs/heads/*:refs/remotes/origin/*

      # If your project only specifies its Ruby version in its
      # Gemfile, you'll need to specify a version for the
      # action to use. See documentation for the
      # ruby/setup-ruby action for details.
      - name: Setup Ruby
        uses: ruby/setup-ruby@v1

      # Install the runners you'd like Pronto to use on each
      # scan. This setup includes the Standard Ruby style
      # guide, and Brakeman security analyzer
      - name: Set up Pronto
        run: gem install pronto pronto-standardrb pronto-brakeman

      # Perform a scan on the diff between your branch and
      # your PR's target branch (e.g, staging, main ...)
      - name: Run Pronto
        run: pronto run -f github_status github_pr -c origin/$
        env:
          PRONTO_PULL_REQUEST_ID: $
          PRONTO_GITHUB_ACCESS_TOKEN: "$"

我一直把我的Pronto设置放在应用程序的Gemfile之外,以限制与应用程序的依赖关系的交叉。这个例子也是如此--它没有使用 Bundler 来安装 Pronto 和它的 runners。我可能有一天会重新审视这个问题。

我喜欢Standard(而不是直接的Rubocop),因为它是一个有观点的风格指南,而且我几乎赞同它的所有观点。在我的书中,任何能引导你走向更清洁的提交的风格指南都是一个大赢家。我还把Brakeman放在这里,因为它很容易集成,而且可以发现你的应用程序中容易被忽视的安全漏洞。无论你对Rails的经验水平如何,我都推荐这些作为起点。

测试一下吧!

现在是有趣的部分。让我们来看看设置的实际效果。要测试新的 GitHub Actions 工作流,请从用于添加工作流的特性分支创建一个新的临时分支。(如果你愿意使用 Git 来清理和强制推送特性分支的变化,也完全可以使用同一个开发分支。)如果你使用的是Standard,那么故意把缩进弄坏(用三个空格代替两个空格,用制表符代替空格),或者用单引号代替双引号,都是这个设置的好测试案例。

把你的分支推到GitHub上,打开一个拉动请求,给工作流程几分钟的时间来完成它的工作。你应该会收到一封通知你成功或失败的邮件,每个运行器(本例中是Standard和Brakeman)都会通过或不通过PR。但这里是我最喜欢的部分。Pronto 会将每个发现的违规行为作为你的 PR 代码中的行内注释来报告!在这里,你可以修复违规行为。

在那里,你可以修复这些违规行为(最好是使用fixup commits,你可以在合并前自动加引号),或者使用GitHub的协作工具,与队友讨论报告的违规行为。不幸的是,github-actions机器人还没有聪明到可以和你进行对话。

结论/下一步

通过一个文件,这个GitHub Actions和Pronto的集成为任何Rails应用程序添加了一个很好的安全网,以帮助防止未来的不良代码违规。违规行为的报告方式,对开发者来说是足够碍眼的。把这个集成看作是你的超级细节导向的机器人队友,他可以发现那些小的风格问题,这样你就可以在把审查工作交给人类队友之前把它们修好。

还有更多的Pronto运行器,你可能希望检查并添加到你自己的设置中。谢谢你的阅读!