Обновление пакетов при CI/CD

Время от времени в проекте желательно обновлять пакеты через Composer и Yarn. Иногда это происходит без ошибок. К счастью, у нас в этот раз оказалось не так :)

Это хороший повод рассмотреть семантическое версионирование и произвести минорные и мажорные обновления зависимостей. Покажем, что делать, если появилось много ошибок. И найдём способ непрерывно обновлять зависимости при следовании философии CI/CD прямо в master так, чтобы это не ломало код, не стопорило разработку проекта и не порождало веток с устаревающим кодом.

  • 00:02:39 - Удаление символической ссылки
  • 00:03:54 - Удаление Docker Compose
  • 00:05:36 - Команда api-check
  • 00:07:00 - Просмотр списка новых пакетов
  • 00:08:24 - Семантическое версионирование
  • 00:14:31 - Пробный запуск
  • 00:15:46 - Способы работы с ошибками
  • 00:17:32 - Страх обновлений
  • 00:18:04 - Проблема подхода с feature-branches
  • 00:20:13 - Следование принципам CI и CD
  • 00:21:47 - Постепенный подход
  • 00:22:33 - Пакеты с зависимостями
  • 00:24:38 - Исправление ErrorHandler
  • 00:32:14 - Композиция или наследование
  • 00:34:16 - План обновления Psalm
  • 00:36:06 - Работа с группами компонентов
  • 00:37:42 - Обновление Psalm
  • 00:38:20 - Если ошибок много
  • 00:41:01 - Исправление типа
  • 00:45:03 - Обновление PHPUnit
  • 00:47:28 - Исправление аннотации covers
  • 00:55:00 - Пакеты UUID и линтера
  • 00:56:16 - Поиск помех обновлению
  • 00:59:20 - Общее обновление
  • 01:00:26 - Переход на Doctrine Migrations 3.0
  • 01:08:05 - Обновление фронтенда
  • 01:09:27 - Конфликт ESLint
  • 01:10:58 - Testing Library
  • 01:11:32 - Обновление Cucumber

Следующие эпизоды продолжим после скринкастов о React.

Скрытый контент (код, слайды, ...) для подписчиков. Открыть →
Дмитрий Елисеев
elisdn.ru
Комментарии (18)
Arunas

Спасибо, высший класс, (как всегда).

Ответить
Руслан

Спасибо!

Ответить
fedot

Спасибо, а будет ли про подключение внешних хранилищ типа Амазона и репликацию между распреденными базами данных?

Ответить
Arunas

Да, хотелось бы :)

Ответить
Дмитрий Елисеев

Хранилища будут для загрузки фотографий с эмуляцией для девелоперского окружения.

Ответить
fedot

ну отлично, спасибо

Ответить
fedot

Есть вопрос все же, к примеру поменял кто то одну строчку в стиле, как ее быстро доставить на прод, минуя всю цепочку?

Как делаются быстрые изменения и как получить доступ к файловой системе запущенного контейнера?

Ответить
Дмитрий Елисеев

Как делаются быстрые изменения и как получить доступ к файловой системе запущенного контейнера?

Никак. Цепочка как раз и строится для того, чтобы ничто не поступило в прод без тестов в обход неё.

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

Работу с PHP в Docker воспринимайте теперь как работу с любым компилируемым языком. Там исходники есть только в репозитории и у вас, а для прода нужно скомпилировать всё в один файл и закинуть на сервер.

Ответить
fedot

Иначе любое неосторожное ручное действие в проде вроде неверно поставленной запятой или незакрытой скобки в конфиге мгновенно сломает весь сайт.

Для этого в деве есть тесты, после их прогона, если изменение незначительно, таких проблем быть не должно. Кстати есть ли линтеры для Makefile? Там лишний пробел в лево в право, расстрел сразу. Еще раз хочу поблагодарить, за прекрасный курс, кучу проблем решить помогло, ты настоящий гений.

Ответить
Дмитрий Елисеев

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

Тесты в деве не проверяют контейнеры прода.

А так если нужны эксперименты на сервере в полуреальном времени без тестов, то сделайте отдельную ветку вроде drafts с отдельным сервером и в pipeline для неё через branch != draft отключите все шаги кроме build и deploy-draft.

Но как предложил ниже, проще показать заказчику свой экран, чем давать ломать продакшен ради ведения разработки по-живому.

Ответить
Дмитрий Елисеев

Есть вопрос все же, к примеру поменял кто то одну строчку в стиле, как ее быстро доставить на прод, минуя всю цепочку?

Если стиль кнопки поменяется в проде не мгновенно, а через три минуты, то это мало кого расстроит.

Если с ростом проекта возникает неудобство, что цепочка становится слишком медленная, то либо повышают мощность сборочного сервера, либо оптимизируют запуск, либо делят проект на части.

Например, с коммитом из прошлой успешной сборки по git diff ${env.GIT_PREVIOUS_SUCCESSFUL_COMMIT} api можно понять, изменились ли файлы в папке api. И если не изменились, то сделать пропуск шагов. Тогда при изменении стилей фронтенда не будут запускаться линтеры, анализаторы и тесты api.

Помимо этого при желании можно будет вынести фронтенд в отдельный репозиторий или разбить api на более мелкие микросервисы, живущие в отдельных репозиториях. Но это сложнее.

Ответить
fedot

Если стиль кнопки поменяется в проде не мгновенно, а через три минуты, то это мало кого расстроит.

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

Все же считаю, что должна быть возможность оперативного вмешательства, мы мельком коснулись DFS, а что если бы файлы проекта лежали на ней с доступом через SSH?

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

Понятно, что такой доступ всем не дается.

Ответить
Дмитрий Елисеев

Если это нужно только для разработки, а не посетителям сайта, то незачем это делать в проде.

Тогда сразу после просмотра проще показать ему свой экран через Zoom или дать покликать через TeamViewer.

Ответить
fedot

Кстати да, тоже вариант, спасибо.

Ответить
Александр

Дмитрий подскажите пожалуйста как решить проблему с psalm и doctrine. Я использую метод orX в который передаю несколько параметров $q->where($q->expr()->orX('u.type = ?1', 'u.role = ?2')); При проверке репозитория psalm получаю следующую ошибку Too many arguments for method Doctrine\ORM\Query\Expr::orx - saw 5. Заранее спасибо.

Ответить
Дмитрий Елисеев

Либо самому подавить ошибку аннотацией в своём коде или в конфигурации <issueHandlers> для метода orX класса ExpressionBuilder, либо глобально подключить doctrine-psalm-plugin.

Ответить
Андрей

Теперь на сервере при каждом деплое будет создаваться новая папка site_{$BUILD_NUMBER}. А старые мы не удаляем...

Ответить
Дмитрий Елисеев

В этой папке хранится только файл docker-compose.yml и, возможно, файлы с ключами.

Если размер папки 10КБ, то при 10 деплоях в день за год три тысячи папок займут всего 30МБ.

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий

Или войти через:

Google
GitHub
Yandex
MailRu