Если мы ведём разработку всего проекта в одном монорепозитории, то сталкиваемся с неудобством долгого запуска Pipeline. При малейшей правке файлов фронтенда у нас запускаются линтеры и тесты для всего проекта, а не только для фронтенда.
Сегодня мы оптимизируем наш Pipeline в Jenkins так, чтобы он запускал проверки только для изменённого кода. Для этого научим его пользоваться командами git diff и docker-compose images для отслеживания изменений кода и софта. При этом рассмотрим нюансы, с которыми можно столкнуться при внедрении такой автоматизации:
Это нам будет полезно в следующих эпизодах, где мы будем делать регистрацию на фронтенде.
Чтобы не пропускать новые эпизоды подпишитесь на наш канал @deworkerpro в Telegram
Спасибо.
Спасибо за отличный урок! Есть вопрос по оптимизации, например если есть проект в 10к файлов, то при сборке контейнера докер, если один файл изменился, в контейнер будут копироваться все 10к файлов или только один? как у нас сделано сейчас, я малость запутался, не могу найти ответ в коде что-то.
Да, сейчас одной командой:
копируются все файлы в один слой.
Для оптимизации можно разбить копирование:
поместив в начале списка редко меняющиеся директории.
Понял, спасибо, тогда там тоже надо получается смастерить что то вроде темы урока и копировать только измененное, тогда все будет быстро конечно.
Парни, проблемы со сборкой дженкинса ни у кого не возникает? Там, насколько я понимаю, в pip добавили зависимость от rust, а в репозиториях alpine нет rust нужной версии, в итоге, если запустить сборку дженкинса, то докер падает с ошибкой:
Есть варианты как-то установить в образ rust нужной версии или собрать контейнер без него?
Отвечу сам себе, вдруг кому-нибудь еще пригодится. Решение проблемы - ставить раст не из репозиториев а собирать в контейнере В итоге у меня получился такой Dockerfile для дженкинса:
pip3 install docker-compose
долго ставитсяМожно проще:
А когда обновят версию alpine перейти на
rust cargo
:Да, такой вариант намного лучше, спасибо большое.
Да, неделю у всех так.
Спасибо Дмитрий, примерно когда ждать следующий урок?
Уже записываю следующие два. Отвлёкся на написание статей на elisdn.ru
Дмитрий, спасибо огромное за статьи и Ваш труд!
Здравствуйте, Дмитрий!
Хотел бы уточнить один интересный вопрос касаемо рефакторингa Makefilе...
В данном проекте практически всё делится на небольшие, понятные куски кода и файлы, вводится оптимизация, однако Makefile почему то это не касается... Я знаю, что у него есть возможность подключать другие Makefile, то почему бы для каждого сервиса (api, frontend, cucumber...) не сделать свои Makefile и вызывать их из главноего Makefile в корне. Так же у него есть возможность не запускать уже исполненные команды и запускать процессы в несколько потоков
make -j<количество потоков>
. Почему рефакторинг не затрагивает этот Makefile? Ведь это было бы удобнее и понятнее.У Makefile есть стандартные команды all, install, clear, uninstall. Почему не используются эти команды, а придумали свои вроде init? Как раз если разделить файлы на разные отвественности будет логично использовать make install (для api и других сервисов) или просто make. По умолчанию цель all, но можно её заменить на
.DEFAULT_GOAL: init
, например, как описано тут http://pushorigin.ru/bash/make Спасибо!)Можно, но разбивка будет не всегда удобна для работы. Либо придётся каждый раз в консоли через
-f
указывать используемый в данный момент файл, либо делать прокидывание всех команд из основного Makefile вручную или динамически.Инициализация проекта у нас производит не только установку, но и остановку с очисткой предыдущего мусора. Остановку проекта мы можем производить как есть по down и с очисткой по down-clear. У нас намного больше действий, поэтому примитивного стандартного списка из all, install, clear и uninstall нам не хватит. И будет непонятно, что именно делает all. Поэтому всегда удобнее придумывать свои более понятные названия команд вместо стандартных.
Дима, добрый день,
сейчас на продакшене мы вызываем установку зависимостей в докер образе через:
а затем в Jenkinsfile на шаге Init снова запускаем composer install (make init-ci -> api-init -> api-composer-install):
подскажите, это оптимально, или что я упустил?
Спасибо!
В девелоперском окружении
make init
нам нужны все пакеты c линтерами и тестами, а для боевой сборки поmake build
нужны только продакшеновские с флагами--no-dev --optimize-autoloader
.Поэтому у нас две установки, где девелоперская папка
vendor
игнорируется через.dockerignore
, чтобы она не попадала в продакшеновскую сборку.Дим, добавьте пожалуйста отображение уже просмотренных ссылок: a:visited
Или войти через: