Непрерывная интеграция за доллар в день

в 8:46, , рубрики: continuous integration, непрерывная интеграция, Песочница, разработка, метки: ,

Данная статья является переводом статьи James Shore "Continuous Integration on a Dollar a Day". Ссылка на эту статью попалась мне в книге "Непрерывное развертывание ПО".

Есть более простой и дешёвый способ осуществления непрерывной интеграции, чем использование сервера сборки подобно CruiseControl. На самом деле, это настолько просто, что вы можете начать её выполнять прямо в эту секунду и прекратить плохо себя чувствовать из-за отдела IT, пока ещё не одобрившего ваш запрос на сервер сборки.
(Хотите небольшой неэтичный секрет? То, что я собираюсь вам рассказать, лучше, чем использование CruiseControl!)

Шаг 1: Найдите старый компьютер разработки

Найдите свободный системник, который вы раньше использовали для разработки. Не слишком старый… он должен быть в состоянии выполнить сборку. Добудьте паршивенький монитор и свободный угол. Подключите монитор. Разместите перед ним старый, сломанный стул. Комфорт не требуется… вы не будете находиться здесь подолгу.

Шаг 2: Приобретите резинового цыпленка

Нет, правда.
Изображение компьютера с подключённым к нему резиновым цыплёнком
Мой офис, примерно 2001 год

Вы можете использовать что-то другое, например, чучело животного, если хотите. Сделайте его забавой и убедитесь, что он не выколет никому глаза, если вы «случайно» бросите его слишком сильно (особенно, если вы девушка). Если у вас нет ничего подходящего, пусть это вас не останавливает. Импровизируйте. Развлекайтесь.
Я думал, что это поможет мне «оформить» фасад, но это только заставило меня чувствовать себя некомпетентным, так что можете забыть.

Шаг 3: Купите настольный звоночек

Он делает «дзинь», когда вы касаетесь его. Нет, не останавливайтесь, потому что у вас нет настольного звонка. Приобретите его позже. Сейчас у вас есть импульс. Паршивый компьютер — есть. Подключения — есть. Смешная игрушка — имеется. Вы в нескольких шагах от непрерывной интеграции. (Если вы очень, очень ограничены в средствах, то вы можете полностью пропустить этот шаг.)

Шаг 4: Автоматизируйте сборку

Ох! Это самая сложная часть. Хорошая новость: одной из лучших вещей в CruiseControl является то, что он заставляет вас автоматизировать сборку. Ещё лучшая новость: непрерывная интеграция — то, что вы собираетесь сделать — это нечто большее, чем просто автоматизированная сборка CruiseControl, и я собираюсь помочь вам получить все эти вкусности. Но вам все ещё необходимо автоматизировать сборку.
Ладно, это тяжело, я знаю. Если до этого вы применяли вашу IDE для сборки, то создание автоматизированной сборки, вероятно, покажется большой работой. На данный момент, вероятно, можно создать пакетный файл, который запускает вашу IDE и просит её произвести сборку. Это не является достаточно хорошим в долгосрочной перспективе, так что потом придётся вернуться и сделать всё правильно.
Если у вас есть автоматические модульные тесты, такие как тесты JUnit/NUnit, то также включите их в сборку.
Прежде, чем мы двинемся дальше, подойдите к хилому компьютеру сборки (см. шаг №1) и убедитесь, что сборка нормально выполняется с последним кодом из системы контроля версий. Вообще не используете систему управления версиями? Хм… ладно… положите клавиатуру и отойдите от компьютера. Теперь повторяйте за мной: «Прости меня, мир, ибо я согрешил. Я никогда больше не буду программировать без системы управления версиями. Я сейчас же пойду и загружу TortoiseSVN, установлю его и начну использовать. Я отрекаюсь от всего порочного с этого момента.» Спасибо.
Если запущенная начисто автоматическая сборка занимает больше десяти минут, остановите её. Вы пока не готовы к непрерывной интеграции. Вам необходимо поработать над ускорением сборки. Вы можете сделать что-то из описанного ниже, или вы можете использовать CruiseControl, но реальная непрерывная интеграция не должна быть Вашей целью на сегодня.

Шаг 5: Постройте всех под своими знамёнами

[В оригинале автор использует идиоматическое выражение «Drink the Kool-Aid ®» (англ.) — «Хлебнуть Kool-Aid», которое на американском жаргоне означает фанатичное следование за лидером. — Прим. переводчика]

Это, абсолютно бесспорно, 100% самый важный шаг в этом списке. Соберите всех членов вашей команды вместе в одной комнате.
Если кто-нибудь спросит, то нет, это не совещание. Вы приходите, что-то делаете и возвращаетесь через пять минут. Полезно. Коротко. По этим причинам, это не совещание.
Теперь, не причиняя телесных повреждений, заставьте всех согласиться со следующим:

«С сегодняшнего дня наш код в системе управления версиями будет всегда успешно собираться и проходить все тесты.»

Если кто-то жалуется на то, что это слишком сложно, дайте им знать, что с непрерывной интеграцией это будет просто. Хм, проще. Если они всё еще ​​думают, что это слишком сложно, вежливо напомните им, что их работа заключается в, вы знаете, создании программного обеспечения.
Ох, слишком резко. Не говорите этого. Дерьмо, я просто потерял десять потенциальных клиентов. Упс, уходит ещё один. Одиннадцать.
На самом деле, действительно важно, чтобы «все согласились, что это хорошая идея". Вы видите, способность по-настоящему положиться на вашу систему сборки программного обеспечения, в любой момент времени, это действительно революционная часть непрерывной интеграции. Представьте, насколько проще была бы жизнь, если бы вы знали, что код, который вы только что получили из системы контроля версий, просто будет работать.
Позвольте мне рассказать вам небольшую историю. Я занимаюсь поддержкой части программы с открытым исходным кодом под названием NUnitAsp. В прошлом году я читал о ней курс. Во время занятия кто-то спросил меня об особенности, которой не было в NUnitAsp. Я посмотрел на код и обнаружил, что изменить его просто. Так что я внёс изменения (это заняло несколько минут). Затем я выполнил сборку и 96 секунд спустя появился новый релизный файл, который я и раздал. Правдивая история. У нас даже была программа поощрения. Мы назвали ее «Найди ошибку — выиграй кружку». (Мы были хороши: мы дали кружки всем, даже если они не нашли никаких ошибок).
Ладно, вы, вероятно, не были там. Вам необходимы замечательные автоматизированные тесты для сборки и выпуска версий подобно описанному. Так, позвольте мне рассказать другую историю. На другом проекте, не таком успешном, мы все работали над различными частями кода. Мы делали всё возможное для ежедневных или около того проверок, но мы не собирали весь проект и не запускали тесты. (Тесты? У нас не было никаких автоматизированных тестов.) Шесть месяцев спустя мы попытались объединиться в одно целое, но ничего не совмещалось друг с другом. Нам потребовалась неделя только на то, чтобы заставить программу работать. Я не буду даже начинать описывать, насколько много ошибок имел тот проект. Непрерывная интеграция, даже без больших тестов, означает, что вы никогда не будете сталкиваться с этим кошмаром снова.
Я не хочу пытаться убеждать людей, что эта штука — хорошая идея. Я ведь не говорю, чтобы вы чистили зубы, не так ли? Тем не менее, вы всё же делаете это. Это хорошо для вас. Не хотите этого делать? Не делайте этого! Не моя проблема.
Двенадцать… тринадцать… четырнадцатьпятнадцатьшестнадцать… дерьмо.
В любом случае, если вы не добьётесь того, что каждый согласится это делать, то процесс не будет работать. Что вы ожидаете за доллар?

Шаг 6: Начинайте!

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

  • Компьютер сборки? Есть.
  • Смешная игрушка? Есть.
  • Назойливый звоночек? Факультативно.
  • Автоматизированная сборка? Есть.
  • Согласие группы? Есть.

Теперь давайте сделаем это!
Для начала регистрируйте изменения по крайней мере дважды в день. Это часть «непрерывности». Когда набьёте руку, регистрируйте каждые час или два.
Перед тем как взять последний код из системы контроля версий, проверьте, не взял ли кто-нибудь резинового цыпленка. Если кто-то работает, подождите, пока он не завершит регистрацию изменений.
Когда вы регистрируете изменения, выполните следующие действия:

  1. Запустите сборочный/тестовый скрипт локально и убедитесь, что он проходит на 100%.
  2. Заберите резинового цыпленка с его места отдыха. Если его там нет, найдите человека, который его забрал, и донимайте его, пока он не завершит регистрацию изменений.
  3. Получите последнюю версию кода из репозитория и запустите скрипт сборки на всякий случай ещё раз. Если сборка не проходит, то вы знаете, что есть некоторые проблемы интеграции с кодом, который вы только что получили. Нойте и стоните, положите курицу обратно и добудьте человека, который последним внёс изменения, чтобы он помог вам. Начните сначала, когда вы будете готовы.
  4. Зарегистрируйте ваш код.
  5. Подойдите к компьютеру сборки, получите последнюю версию кода из репозитория и снова запустите скрипт сборки. Если он не пройдёт, верните (отмените) вашу регистрацию. Вы установили некоторые новые программы, или изменили переменные окружения, или установили параметр реестра, или забыли добавить файл в хранилище, или что-то ещё. В любом случае, вам нужно решить проблему на вашем компьютере и попробовать снова. Вы можете подержаться за цыплёнка одно мгновение, но отдайте его (и начните заново), если кто-то в нём нуждается.
  6. Позвоните в колокольчик. (Для всех остальных это сигнал, чтобы поаплодировать или выразить радость как-то ещё. «Йеэээй»). Положите цыпленка на место. Вы закончили.

Кстати, когда не удаётся шаг 5, у вас будет соблазн просто решить эту проблему непосредственно на машине сборки. Но если вы сделаете это, то следующий бедный недотёпа, получивший последний код, будет не в состоянии его собрать.
Последнее, но не менее важное: сохраняйте время сборки не большим десяти минут. Меньше, чем пять минут, ещё лучше. Если она идёт слишком долго, то этот процесс перестанет быть приятным полуденным/послеполуденным перерывом и начнёт быть реальной болью в заднице. Малое время сборки хорошо для вас в любом случае, потому что медленные сборки часто означают дефекты в подходе к тестированию.

Почему это лучше, чем CruiseControl

  • Код в системе контроля версий всегда собирается и проходит испытания. Точка.
  • Если что-то идёт не так, вы знаете, в чём проблема. Это либо ваш код (неудачный шаг 1), либо интеграция с чужим кодом (неудачный шаг 3), либо изменения в окружающей среде (неудачный шаг 5). Вы узнаёте о ней сразу же, что делает её исправление более простым.
  • Вам не придётся исправлять чьи-то ошибочные сборки из-за того, что ребята уехали на обед, не дожидаясь завершения CruiseControl.
  • Вы сохраняете короткое время сборки (ничто так не мотивирует на изменения, как долгая интеграция), что означает лучшие тесты, что приведёт к лучшему дизайну проекта.

Продвинутый класс

Как только вы получили основы работы, вы можете перейти к реальному совершенствованию использования непрерывной интеграции. Один из вариантов состоит в том, чтобы сделать вашу сборки автономной. Иными словами, всё, что вам нужно собрать, находится в системе управления версиями, и как только вы получили код, вы можете отключиться от сети, чтобы выполнить сборку. Это хорошо, потому что это делает сборку более достоверной, что позволяет без труда производить сборку старых версий. Это также помогает избавиться от ошибок конфигурации базы данных и миграции.
Действительно восхитительные тесты также являются хорошим выбором. Если у вас есть действительно восхитительные тесты, то вы можете публиковать продукт без колебаний.
Мне также нравиться делать так, чтобы мой скрипт сборки создавал и установочный пакет. Люди часто упускают установщик из своего тестирования и методов интеграции… затем страдают, когда приходит время для создания пакета установки. Это одна из тех вещей, которые гораздо легче сделать, если вы создаёте её постепенно. Однако автоматическое тестирование установщиков всё же является болезненным.
И… Я ненавижу признаваться в этом… но установка CruiseControl также может быть хорошей идеей. Но только если вы закончили продвинутый класс. К этому времени вы получаете действительно хорошую основу (согласие команды, быстрые тесты, отсутствие сбоев при сборке) и менее вероятно, что вы соскользнёте в плохую практику.
Удачи! И не забудьте прислать мне мой доллар.

Автор: iReset

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js