GitHub Actions на страже порядка вашего кода
Современная разработка настолько сложна, что уже просто невозможно всё держать в голове, особенно различные практики по написанию кода. И тут нам на помощь приходят линтеры, которые помогают придерживаться определенных стандартов на проекте и держать кодовую базу в порядке.
Мы в компании Evrone разрабатываем проекты на разных языках программирования, таких как: Ruby, Go, Rust, Python, Elixir
Reviewdog
Нам очень важно, чтобы результат работы линтеров всегда был виден на GitHub, например в виде комментариев к Pull Requests. Для этого мы используем reviewdog, который позволяет автоматизировать проверку кода и предоставляет бесшовную интеграцию любого линтера с GitHub. Чем так хорош reviewdog:
- Написан на Go. Можно скомпилировать в бинарный файл и подключить к любому проекту, вне зависимости от языка программирования;
- Может работать с любыми линтерами, достаточно лишь перенаправить результат работы линтера на вход reviewdog и определить формат вывода линтера, например:
$ dotenv-linter | reviewdog -efm="%f:%l %m"
- Поддерживает большое количество линтеров из коробки, такие как:
dotenv-linter , rubocop и другие.
GitHub Actions
Каким бы классным не был reviewdog, нам всё равно приходилось тратить время на настройку
Перейдя на GitHub Actions, мы решили написать свои экшены для запуска популярных линтеров. Этим мы хотели упростить процесс подключения линтеров к любому проекту и вот что у нас получилось:
- action-rubocop
- action-brakeman
- action-reek
- action-fasterer
- action-hadolint
- action-dotenv-linter
Все наши экшены могут публиковать замечания линтеров в двух режимах.
1. В виде аннотации к коду (github-pr-check
)
2. И в виде комментариев к Pull Requests (github-pr-review
)
Ruby Actions
Первые 4 экшена: .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 }}
Для экшенов
- Пустое значение или без версии — установится последняя версия;
gemfile
— установится версия изGemfile.lock
.1.0.0
— установится указанная версия.
Ещё rubocop-rails
, rubocop-performance
, rubocop-rspec
, rubocop-i18n
, rubocop-rake
, но это можно переопределить с помощью атрибутаrubocop_extensions
.
Dockerfile Action
Следующий экшен — Dockerfile
и проверяет их с помощью линтера hadolint. Пример использования:
# .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
И последний экшен, но не по значению — .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 Actions вы сможете найти на странице GitHub Marketplace.
Мы активно поддерживаем Open Source сообщество и применяем разработанные нами инструменты на клиентских проектах. Если вы тоже хотите поделиться с сообществом интересным инструментом — заполните форму ниже и мы свяжемся с вами.