CTO Vetmanager, PHP Developer, Ironman 70.3

Makefile для людей, а не для роботов

Посмотрел на подлодке доклад Дмитрия Еслисеева “Как правильно выстроить CI workflow и встроить тестирование”. Доклад очень крутой, но я не согласен с тем как он использует Makefile.

Хотел написать большую и подробную статью с примерами, но что-то мне не пишется. Основная мысль, что он в конфигах CI(jenkins, github-actions) использует команды из Makefile и composer.json.

Я может и сам иногда так грешу, но считаю, что лучше так не делать. Эти файлы для людей, а не для машин.

make init, make up, make tests - прекрасное сокращение для человека. Нам не нужно каждый раз писать что-то длинное типа docker compose run --rm api-php-cli composer test -- --testsuite=unit. А у машины нет ограничений в скорости печати или памяти, мы можем в конфиг CI написать полную команду для запуска тестов docker compose run --rm api-php-cli /app/vendor/bin/phpunit --colors=always. Делайт так, не тяните make команды в места, которые запускаются роботом.

Что это нам даёт?

  1. В Makefile и composer.json не будет специальных команд для ci типа как make init-ci. Редко, можно обойти без таких команд. Часто запуск в CI отличается от локального. Причем, в разных CI могут быть свои особенности. Как бы вам не пришлось делать make init-jenkins + make init-gitlab + make init-travis.

  2. Нужно помнить, что там где будут запускаться команды нужен еще make как зависимость. Уже все образы из docker-hub нам подходят, но это еще нужно понять когда всё упало при первой сборке.

  3. Не нужны костыли. К примеру, в Makefile у Дмитрия docker-pull: docker compose pull --ignore-pull-failures игнорируются ошибки, потому что в локальном окружении нет кеша(или по другой причине, не помню в точности доклад). Типичный костыль. Можно пропустить важное сообщение и долго и мучительно дебажиться просто потому, что наш Makefile сделан для робота, а не для человека.

Минусы?

  1. Нарушается DRY, со всеми вытекающими. Общий код, нужно не забывать исправлять в двух местах.
  2. Страдает читаемость CI файлов. Или не страдает, иногда нужно видеть всю команду шага всю и не идти за ней в отдельный файл. А если Makefile еще и composer scripts использует, то нужно просмотреть 3 файла(CI, Makefile, composer.json), вместо одного.