Посмотрел на подлодке доклад Дмитрия Еслисеева “Как правильно выстроить 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 команды в места, которые запускаются роботом.
Что это нам даёт?
-
В Makefile и composer.json не будет специальных команд для ci типа как
make init-ci
. Редко, можно обойти без таких команд. Часто запуск в CI отличается от локального. Причем, в разных CI могут быть свои особенности. Как бы вам не пришлось делатьmake init-jenkins
+make init-gitlab
+make init-travis
. -
Нужно помнить, что там где будут запускаться команды нужен еще make как зависимость. Уже все образы из docker-hub нам подходят, но это еще нужно понять когда всё упало при первой сборке.
-
Не нужны костыли. К примеру, в Makefile у Дмитрия
docker-pull: docker compose pull --ignore-pull-failures
игнорируются ошибки, потому что в локальном окружении нет кеша(или по другой причине, не помню в точности доклад). Типичный костыль. Можно пропустить важное сообщение и долго и мучительно дебажиться просто потому, что наш Makefile сделан для робота, а не для человека.
Минусы?
- Нарушается DRY, со всеми вытекающими. Общий код, нужно не забывать исправлять в двух местах.
- Страдает читаемость CI файлов. Или не страдает, иногда нужно видеть всю команду шага всю и не идти за ней в отдельный файл. А если Makefile еще и composer scripts использует, то нужно просмотреть 3 файла(CI, Makefile, composer.json), вместо одного.