RSS Telegram YouTube Apple Яндекс Spotify Amazon Почта

81. Continuous Integration

15.12.2024

Скачать

К списку выпусков

Ссылки выпуска:

Языку программирования Go исполнилось 15 лет!

За последние пять лет пользовательская база Go утроилась - Go самый быстрорастущий ЯП. В облачных решениях Go сохраняет свою высокую популярность.

Одно из самых заметных изменений в языке с тех пор - это переменная цикла for. Начиная с Go 1.22 переменные, объявленные в цикле for, видны только внутри одной итерации цикла.

Continuous Integration by Martin Fowler

Статья Мартина Фаулера, который применяет CI на протяжении более 20 лет.

Continuous Integration (CI) - это практика, при которой разработчики объединяют свои изменения в центральный репозиторий как минимум раз в день. Каждое объединение сопровождается автоматической сборкой и запуском набора тестов. Намного проще интегрировать код, написанный за 2 часа, чем за 2 дня и тем более за 2 недели.

Integration is not a painless process

Интеграция работы нескольких разработчиков — это долгий и непредсказуемый процесс. Pre-Release Integration. Проект разбивается на слабосвязанные unit'ы и на финальном этапе они сливаются в одну кодовую базу. Другой популярный подход - это feature branching. При таком подходе разработчики работают над своими фичами в отдельных ветках и интегрируют их в основную ветку как только их фича завершена.

Вот частые проблемы, если заниматься раздельное разработкой и потом интегрировать:

  1. Изменения в основной ветке вынуждают адаптировать свою feature ветку.
  2. Переключение на следующую задачу отягощено поддержкой code review пул-реквеста прошлой задачи.
  3. Редкий рефакторинг, т.к. он приводит к большому расхождению в коде и триггерит проблемы выше.

Идея CI - не "убегать" от основной ветки разработки более чем на несколько часов (максимум день) разработки. Слияние (интеграция) будет в таком случае легким.

Как выглядит процесс разработки при CI у обычного разработчика вроде нас с тобой? Мы делает git pull главной ветки (mainline). Билдим проект, запускаем тесты, чтобы убедиться, что у нас рабочая версия (всякое бывает). Вносим правки. Спустя пару часов, перед пушем, подтягиваем изменения и видим, что коллеги внесли свои коммиты. Мы проверяем все ли ок работает с учетом новых коммитов и, наконец, пушим изменения в main-ветку. CI агент замечает, что появились новые коммиты в репозитории на сервере и запускает сборку проекта и его тесты. По итогу нам приходит нотификация, что все выполнилось успешно на сервере.

Ключевые практики Continuous Integration

Использование системы контроля версии.

Автоматизация билда приложения.

Писать self-testing код.

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

Если билд сломался, то чиним его немедленно. Т.е. все случается в mainline, то билд проекта в этой ветке должен работать. Самым быстрым и простым решением будет revert последнего комита, который сломал билд. Также на уровне CI Service можно настроить pre-tested commits (варианты Pending Head могут отличаться по названию). При этом комит попадает в систему контроля версий строго после успешного билда/тестов.

Билд должен быть быстрым. Разработчики при CI должны получать фидбек максимально быстро. CI цикл (билд/тест) должен случаться не более чем за 10 минут.

Скрывать незаконченные фичи. При таком итеративном подходе, когда мы пушим изменения как только небольшая порция готова и билд не падает неизбежно у нас будут фичи, которые еще рано показывать пользователю. Скрываем их либо с помощью feature flags, либо просто не добавляя в UI.

Integration is primarily about communication
The interplay between self-testing code, Continuous Integration, and Refactoring is particularly strong.

Границы применимости CI

В проекта с открытым исходным кодом лучше подходит feature brunching, т.к. участники плохо знают друг друга