Главная/ Блог/ GitHub Actions

GitHub Actions на страже порядка вашего кода

February 2021

Современная разработка настолько сложна, что уже просто невозможно всё держать в голове, особенно различные практики по написанию кода. И тут нам на помощь приходят линтеры, которые помогают придерживаться определенных стандартов на проекте и держать кодовую базу в порядке.

Мы в компании Evrone разрабатываем проекты на разных языках программирования, таких как: Ruby, Go, Rust, Python, Elixir и т. д. И в каждый такой проект мы подключаем различные линтеры. Чтобы быть полностью уверенными, что наш код соответствует всем стандартам качества, мы запускаем линтеры с помощью CI-сервисов на каждый коммит, отправленный в GitHub.

Reviewdog

Нам очень важно, чтобы результат работы линтеров всегда был виден на GitHub, например в виде комментариев к Pull Requests. Для этого мы используем reviewdog, который позволяет автоматизировать проверку кода и предоставляет бесшовную интеграцию любого линтера с GitHub. Чем так хорош reviewdog:

 

  • Написан на Go. Можно скомпилировать в бинарный файл и подключить к любому проекту, вне зависимости от языка программирования;
  • Может работать с любыми линтерами, достаточно лишь перенаправить результат работы линтера на вход reviewdog и определить формат вывода линтера, например: $ dotenv-linter | reviewdog -efm="%f:%l %m"
  • Поддерживает большое количество линтеров из коробки, такие как: dotenv-linter, rubocop и другие.

GitHub Actions

Каким бы классным не был reviewdog, нам всё равно приходилось тратить время на настройку CI-сервисов для запуска линтеров под каждый проект. Но всё изменилось, когда GitHub анонсировал GitHub Actions — крутой инструмент для автоматизации рабочих процессов. Если говорить проще, то это полноценный CI/CD-сервис с большими возможностями, который позволяет создавать свои экшены и делиться ими с сообществом.

Перейдя на GitHub Actions, мы решили написать свои экшены для запуска популярных линтеров. Этим мы хотели упростить процесс подключения линтеров к любому проекту и вот что у нас получилось:

  • action-rubocop
  • action-brakeman
  • action-reek
  • action-fasterer
  • action-hadolint
  • action-dotenv-linter

Все наши экшены могут публиковать замечания линтеров в двух режимах.

1. В виде аннотации к коду (github-pr-check)

github example

2. И в виде комментариев к Pull Requests (github-pr-review)

example github pr

Ruby Actions

Первые 4 экшена: action-rubocop, action-brakeman, action-reek и action-fasterer позволяют запускать популярные линтеры из Ruby сообщества — 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 есть возможность указать версию линтера. Доступно 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. Пример использования:

# .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 Actions вы сможете найти на странице GitHub Marketplace.

Мы активно поддерживаем Open Source сообщество и применяем разработанные нами инструменты на клиентских проектах. Если вы тоже хотите поделиться с сообществом интересным инструментом — заполните форму ниже и мы свяжемся с вами.

GitHub Actions - крутой инструмент для автоматизации рабочих процессов, полноценный CI/CD-сервис с большими возможностями, который позволяет создавать свои экшены и делиться ими с сообществом. Мы написали свои экшены для запуска популярных линтеров, чтобы упростить процесс подключения линтеров к любому проекту.
Михаил Грачёв
Backend-разработчик и DevOps-инженер Evrone
Будем на связи
Прикрепить файл
Максимальный размер файла: 8 МБ.
Допустимые типы файлов: jpg jpeg png txt rtf pdf doc docx ppt pptx.