使用 GitHub Actions 保护您的工作流
现代开发非常复杂,根本不可能记住所有事情,尤其是编写代码的各种实践。 于是各种 Linter 工具应运而生。 它们有助于维护项目中的某些标准,并保持代码库井然有序。
在 Evrone,我们会使用各种编程语言开发项目,包括Ruby、Go、Rust、Python、Elixir 等,并且会为每个项目连接不同的 Linter。 为了确保我们的代码符合所有质量标准,我们使用 CI 服务为提交到 GitHub 的每个提交运行 Linter。
Reviewdog
对于我们来说,能够始终在 GitHub 上看到 Linter 的工作结果非常重要,例如,以注释的形式拉取请求。 为此,我们使用了 reviewdog,它能够自动进行代码审查,并提供任何 Linter 与 GitHub 的无缝集成。 下面是 Reviewdog 如此出色的原因:
- 它用 Go 语言编写,可以编译成二进制文件并连接到任何项目,而无需考虑编程语言。
- 它可以和任何 Linter 一起使用,只需将 Linter 结果重定向到 Reviewdog 输入并定义 Linter 输出格式,例如
$ dotenv-linter | reviewdog -efm="%f:%l %m
" - 它支持大量开箱即用的 Linter,如 dotenv-linter, rubocop 和其他。
GitHub Actions
虽然 Reviewdog 很棒,但我们仍然需要花费时间设置 CI 服务来为每个项目运行 Linter。 但当 GitHub 发布 GitHub Actions 后,一切都改变了,GitHub Actions, 是一款用于自动化工作流的新工具。 简而言之,这是一个功能强大且成熟的 CI/CD 服务,允许您创建自己的操作并与社区共享。
切换到 GitHub Actions 后,我们决定编写自己的操作来运行流行的 Linter。 这样,我们就可以简化将 Linter 连接到任何项目的过程。 下面是我们最终得到的结果:
- action-rubocop
- action-brakeman
- action-reek
- action-fasterer
- action-hadolint
- action-dotenv-linter
我们的所有操作都能以两种模式发布 Linter 注释。
1.作为代码中的注解 (github-pr-check
)
2.以注释的形式拉取请求 (github-pr-review
)
Ruby Actions
前 4 个操作(action-rubocop、action-brakeman、action-reek 和 action-fasterer)允许您运行来自 Ruby 社区的流行 Linter:rubocop, brakeman, reek, 和 fasterer. 要将这些操作连接到您的项目,只需创建一个 .github/workflows/linters.yml
文件并在其中包含以下内容:
# .github/workflows/linters.yml
name: linters
on: [pull_request]
jobs:
linters:
name: runner / linters
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v1
- name: rubocop
uses: reviewdog/action-rubocop@v1
with:
rubocop_version: gemfile
rubocop_extensions: rubocop-rails:gemfile rubocop-rspec:gemfile
github_token: ${{ secrets.github_token }}
- name: brakeman
uses: reviewdog/action-brakeman@v1
with:
brakeman_version: gemfile
github_token: ${{ secrets.github_token }}
- name: reek
uses: reviewdog/action-reek@v1
with:
reek_version: gemfile
github_token: ${{ secrets.github_token }}
- name: fasterer
uses: vk26/action-fasterer@v1
with:
github_token: ${{ secrets.github_token }}
对于 action-rubocop、action-brakeman 和 action-reek,可以指定 Linter 版本。 有 3 种选择:
- 空值或无版本 - 将安装最新版本。
gemfile
- 将安装来自Gemfile.lock
的版本。1.0.0
- 将安装指定版本。
Action-rubocop 还提供了安装其他扩展的能力。 默认安装以下扩展 rubocop-rails
, rubocop-performance
, rubocop-rspec
, rubocop-i18n
, rubocop-rake
. 但这可以使用 rubocop_extensions
属性进行覆盖。
Dockerfile Action
下一个操作,action-hadolint,会寻找项目中的所有 Dockerfile
并使用 hadolint Linter 检查它们。 用法示例:
# .github/workflows/hadolint.yml
name: hadolint
on: [pull_request]
jobs:
hadolint:
name: runner / hadolint
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v1
- name: hadolint
uses: reviewdog/action-hadolint@v1
with:
github_token: ${{ secrets.github_token }}
hadolint_ignore: DL3008
Dotenv-linter Action
最后,但同样重要的是 action-dotenv-linter。 您可以用它来轻松简单地检查项目上的所有 .env
文件。 用法示例:
# .github/workflows/dotenv_linter.yml
name: dotenv-linter
on: [pull_request]
jobs:
dotenv-linter:
name: runner / dotenv-linter
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v1
- name: dotenv-linter
uses: dotenv-linter/action-dotenv-linter@v2
with:
github_token: ${{ secrets.github_token }}
dotenv_linter_flags: --skip UnorderedKey
在 GitHub Marketplace 页面上可以找到更多 GitHub Actions,如果您需要项目开发方面的帮助,请联系我们。