- PVSM.RU - https://www.pvsm.ru -

Команда DevOps инженеров из GitHub поделились своим универсальным решением для проверки качества кода. С ним можно настроить линтер [1] для 17 языков всего в 11 строк:
name: Lint Code Base
on:
push:
branches-ignore:
- 'master'
jobs:
linter:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: docker://github/super-linter:v2.1.0
Код выше является YAML конфигурацией для GitHub Actions [2] (бесплатный CI/CD от GitHub) и далее мы разберемся с его содержимым и принципом работы.
Данный проект изначально является внутренней разработкой GitHub:
GitHub Super Linter был создан командой DevOps GitHub Services для обеспечения согласованности нашей документации и кода для повышения продуктивности взаимодействия и совместной работы в компании.
Лукас Гравли, 2020 [3]
Настройка линтера это важная часть любого проекта, с более чем 1 участником. Он помогает приводить код к единому стандарту, во избежание недопониманий и разногласий между разработчиками.
Я могу судить из мира JS, где настройка линтера и CI/CD занимает 10-20 минут. Устанавливаем eslint [4] (обычно в связке с prettier [5]), и настраиваем список правил. Ничего сложного, но то версия eslint обновилась, то какой-то плагин нужно доустановить, то транспайлер ругается, в общем оставшиеся 9 минут 30 секунд занимаешься отладкой.
Не так уж и страшно и даже полезно потратить 10 минут на ручную настройку, но только вот в случае с монорепо [6], это превращается в ад. Я не являюсь сторонником использования монореп, но они есть и с ними нужно жить и работать ¯(ツ)/¯
Обнародованный в open source super-linter [1] интегрированный в CI/CD может автоматически определять и проверять код на следующих языках:
Следовательно, если в проекте наблюдается смешивание стеков, то вполне рекомендуется посмотреть в сторону super-linter. Достаточно спорный момент насчет его использования в проектах с одним языком/фреймворком. Проекты с претензией на универсальность всегда несут за собой ограничения и потерю гибкости. Вопрос подбора решения немного из области философии, выбор глубины требуемой абстракции может пасть на низкоуровневый ассемблер, или же остановится на JS. Я бы исходил из задачи:
super-linterGitHub Super Linter — это репозиторий исходного кода, упакованный в контейнер Docker и вызываемый из GitHub Actions.
При триггере CI/CD выполняется workflow, описанный конфигом из начала статьи:
# Название
name: Lint Code Base
# Определение триггера для запуска CI/CD
on:
# Триггер на push любого коммита в ветку
push:
# Игнорирование ветки `master`
branches-ignore:
- 'master'
# Задачи к выполнению
jobs:
# Задача
linter:
# Сборка окружения ubuntu-latest
runs-on: ubuntu-latest
# Шаги задачи
steps:
# Переключение на текущую ветку (обязательное действие, если нужен доступ к файлам репозитория)
- uses: actions/checkout@v2
# Вызов Super Linter
- uses: docker://github/super-linter:v2.1.0
Только последняя строка вызывает super-linter, и дальше мяч переходит на его сторону. Внутри происходит примерно следующее:
До банальности просто и работает:

NOTE: Я например для реализации такого же функционала настраивал CI на работу с конкретными папками, содержащими тот или иной тип файлов. У меня не было таких случаев, чтобы в папке с JS, обнаруживались файлы
.cs. Работало так же, и пожалуй более оптимизировано, чем перебор всех файлов, но кто я такой против GitHub DevOps team ;)
Можно дополнительно включать/выключать анализируемые языки, с помощью флагов в конфигурации [26], а также настраивать список правил [27], что обещает нам гибкость. В то же время, данный подход содержит несколько ограничений [28]:
Стратегия Microsoft(GitHub) — публиковать свои наработки в open source очень похвальная затея, хотя у некоторых возникают сомнения на этот счет. Результатом таких действий является и GitHub Super Linter. На мой взгляд это не что-то революционное, а просто еще один проект на GitHub, но с отметкой made with ♡ in GitHub.
P.S. Использование
standardjs[12] в качестве линтера для JS/TS в 2020 году, это как-то обескураживает. Думаю это объяснимо тем, что GitHub === enterprise === legacy, и код опубликован как есть, вот и получили технологию 5-летней давности. Уже создан issue [29], предлагаю поддержать или даже поконтрибьютить.
Автор: Alexandr Tovmach
Источник [30]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/354234
Ссылки в тексте:
[1] линтер: https://github.com/github/super-linter
[2] GitHub Actions: https://github.com/features/actions
[3] Лукас Гравли, 2020: https://github.blog/2020-06-18-introducing-github-super-linter-one-linter-to-rule-them-all/
[4] eslint: https://eslint.org/
[5] prettier: https://prettier.io/
[6] монорепо: https://en.wikipedia.org/wiki/Monorepo
[7] ansible-lint: https://github.com/ansible/ansible-lint
[8] stylelint: https://stylelint.io/
[9] c(offeelint: https://coffeelint.github.io/
[10] dockerfilelint: https://github.com/replicatedhq/dockerfilelint.git
[11] golangci-lint: https://github.com/golangci/golangci-lint
[12] standard js: https://standardjs.com/
[13] jsonlint: https://github.com/zaach/jsonlint
[14] markdownlint: https://github.com/igorshubovych/markdownlint-cli#readme
[15] perl: https://pkgs.alpinelinux.org/package/edge/main/x86/perl
[16] pylint: https://www.pylint.org/
[17] RuboCop: https://github.com/rubocop-hq/rubocop
[18] Shellcheck: https://github.com/koalaman/shellcheck
[19] tflint: https://github.com/terraform-linters/tflint
[20] LibXML: http://xmlsoft.org/
[21] YamlLint: https://github.com/adrienverge/yamllint
[22] dotenv-linter: https://github.com/dotenv-linter/dotenv-linter
[23] устанавливает: https://github.com/github/super-linter/blob/master/Dockerfile#L7-L109
[24] собираются: https://github.com/github/super-linter/blob/master/Dockerfile#L111-L152
[25] Запускается Bash скрипт: https://github.com/github/super-linter/blob/master/Dockerfile#L157
[26] флагов в конфигурации: https://github.com/github/super-linter#environment-variables
[27] настраивать список правил: https://github.com/github/super-linter#template-rules-files
[28] несколько ограничений: https://github.com/github/super-linter#limitations
[29] issue: https://github.com/github/super-linter/issues/175
[30] Источник: https://habr.com/ru/post/507528/?utm_source=habrahabr&utm_medium=rss&utm_campaign=507528
Нажмите здесь для печати.