Няня вашей системы непрерывной интеграции


22

Одна из моих ролей в моей команде - это человек, занимающийся сборкой . Я отвечаю за поддержание / обновление наших сценариев сборки и за то, чтобы мы работали «гладко» на сервере непрерывной интеграции. Я обычно не возражаю против этой работы, хотя часто мне кажется, что я постоянно присматриваю за сервером CI.

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

Я знаю, что многие зрелые команды используют Непрерывную Интеграцию, но там не так много материала о хороших практиках.

Мои проблемы указывают на то, что наша непрерывная интеграция не очень зрелая, или это просто часть работы?

Каковы некоторые хорошие практики для подражания? Каковы характеристики зрелой непрерывной интеграции ?

Обновить

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

Читая ответы каждого, мы чувствуем две основные проблемы.

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

Что усложняет ситуацию в моей команде, так это то, что у нас большая команда (более 10 разработчиков) И у нас есть пара оффшорных членов команды, которые берут на себя обязательства, даже когда мы не на работе. Поскольку команда большая, и мы установили, что частые, небольшие коммиты предпочтительнее, у нас иногда бывает очень много активности в день.


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

2
@Alison: Может быть , это так, хотя «нарушение сборки» для меня означает совершение код , который не строить . Неудачный тест - гораздо менее важная проблема; обычно это не мешает другим разработчикам выполнять свою работу.
Аарона

1
@ Лично я видел в этом противоположность: код, который компилируется, все равно может не пройти автоматическое тестирование и, следовательно, «нарушить сборку».
Арманд

2
Процитирую звуковой фрагмент Мартина Фаулера: если это больно, делайте это чаще.
rwong

1
Кто-то (если я правильно помню, это был Уорд Каннингем) во время лекции рассказал мне о практике своей команды: тот, кто сломал сборку, должен был носить футболку на весь день со словами «Я сломал сборку» на ней. , Он также упомянул, что футболка никогда не стиралась.
Док Браун

Ответы:


29

Прежде всего: каждый человек несет ответственность за процесс сборки . Похоже, что члены вашей команды еще не достигли зрелости ... Никто не может написать код и отправить его на сервер CI, надеясь, что он работает. Перед фиксацией кода он должен быть протестирован на их локальной машине. Вы должны быть уверены, что код, который вы проверяете, не сломает сборку. Конечно, бывают случаи, когда сборка прерывается непреднамеренно (например, если файл конфигурации был изменен или был сделан небрежный коммит).

Большинство CI-серверов (я использовал только Hudson) будут отправлять автоматические электронные письма с подробным описанием совершенных коммитов, которые привели к поломке сборки. Единственная часть вашей роли - стоять за ними, выглядя жестко, пока подозреваемый не исправит то, что сломал.


3
Что произойдет, если будет поздно, и они уйдут с работы? Должно ли быть правило, которое вы не можете зафиксировать, если не уверены, что оно привело к успешной сборке?
c_maker

4
Я боюсь, что угрозы будут поощрять крупные всеобъемлющие коммиты вместо мелких, которые предпочтительнее.
c_maker

3
@c_maker: Разве маленькие, сфокусированные коммиты с меньшей вероятностью сломают сборку? Для меня это проблема дисциплины, а не проблемы процесса.
Аарона

6
Любой, кто нарушает сборку, должен получить кофе / пирожное / любую конфету, предпочитаемую вашей командой для всех. Или принести кофе всем в течение всего дня, или ... Есть много мер, которые вы можете придумать, которые делают нарушение сборки нежелательным, но не настолько угрожающим, чтобы заставить людей избегать подчинения. Последнее также может быть несколько решено, требуя, чтобы каждый по крайней мере представлял свои изменения один раз в неделю. (Один раз в день слишком часто, когда работаешь над чем-то более существенным.)
Марьян Венема

5
Кого волнует, кто ломает сборку, если они исправляют ее?

21

Ваша команда ошиблась в одном:

Быть ответственным за сервер сборки - это не то же самое, что отвечать за сборку .

Это обязанность человека, проверяющего код, заставить его «работать» (для некоторой ценности работы). Единственная причина наличия сервера сборки - это уловить упущения в этом процессе. Любой заслуживающий внимания сервер сборки может уведомить людей, которые зарегистрировались в коде с момента последней сборки (а также всех, кто интересуется), следующую информацию:

  • Сборка сломалась!
  • Что пошло не так при сборке!
  • Что изменилось с момента последней сборки!

Это очень часто происходит по электронной почте. Важно, что это происходит довольно быстро после каждой регистрации.

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

Итак, чтобы ответить на ваш вопрос: зрелая среда CI НЕ требует участия уборщика в его нормальной работе.

Кроме того, если «странные условия существуют» случаются очень часто, выясните причину этого и сделайте систему более устойчивой.


9

Изменить процесс. Если коммит нарушает сборку, автоматически откатывает этот коммит и уведомляет разработчика, который его нарушил. Глупо допускать, чтобы ошибка одного члена команды замедляла работу остальной команды. Или вместо того, чтобы интеграционные сборки выполнялись автоматически, разработчики могут проверить машину интеграции, и, если сборка завершится успешно, они могут выполнить фиксацию. Непрерывная интеграция не означает «проверяйте, какой мусор вам нравится, и кто-то за вас это исправит».

Стратегия «золотой ветки» не работает, если не существует привратника для золотой ветви.

DVCS как Git может помочь; вместо фиксации разработчик может просто отправить набор изменений для интеграции на сервер CI, а затем сервер может попытаться интегрировать набор изменений. Если интеграция завершается успешно, набор изменений объединяется, а если нет, он отклоняется.


8

Одна проблема, которую я часто вижу, заключается в том, что разработчики не могут выполнить локальную сборку, которая имеет точно такие же шаги, как сборка CI. То есть сервер CI настроен на включение дополнительных шагов, таких как модульные / интеграционные тесты, покрытие и т. Д., Которые не могут быть выполнены локально. Неизбежно, что разработчики будут укушены одним из шагов, которые они не могут выполнить локально, и начнут сомневаться, почему они вообще не хотят создавать релиз локально до регистрации.

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

Дополнительные преимущества этого подхода включают в себя:

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

PS. вся концепция няни сборки нелепа, но другие это уже освещали.


аминь. просто потому, что что-то можно сделать, не значит, что это всегда нужно делать.
gbjbaanb

7

Во-первых, разработчики не должны регулярно ломать сборки - они должны создавать и запускать тесты локально, прежде чем переходить в ветку CI. Это должно быть признаком позора, чтобы сломать сборку, и важно обеспечить это. Я сделал это, публикуя статистику, и видел, что у других команд есть «пакет сборки», в который вы вкладываете доллар каждый раз, когда ломаете сборку. В конце проекта эти деньги идут на пиво.

Если стыд / личная гордость не работают, вам, возможно, придется перейти к более тяжелым вещам (например, к угрозе увольнения). Нарушение сборки перед уходом на день должно быть серьезным нарушением. И каждый разработчик должен иметь уведомление о статусе сборки на своем рабочем столе. Лучшая часть всего этого - то, что это поощряет меньшие коммиты, которые все равно предпочтительнее.

Тем не менее, сборка будет иногда ломаться (например, по причинам конфигурации CI). И иногда люди облажаются и уходят на день с нарушенной сборкой. Вот почему вы должны стремиться к процессу, который обеспечивает быстрый и легкий откат к известным хорошим версиям. Если вы всегда можете откатиться до последней удачной сборки (и развернутая версия будет развернута во всех необходимых местах), то в наихудшем сценарии разбитой сборки, когда виновник ушел на вечер, вы можете откатить вернуться к последней хорошей версии и кричать на него утром.

Я не могу рекомендовать книгу « Непрерывная доставка» . Если вы ищете руководство по совершенствованию процесса CI, попробуйте.


2
Договорились о нарушении сборки перед отъездом. Вы вносите изменения, ждете завершения сборки, чтобы знать, что это сработало. Это не сработало? Отмените изменения или исправьте их, прежде чем уйти. Не хочешь этого делать? Не вносите изменения в последнюю очередь в день.
Carson63000

1
«Должен» - это хорошо, но любой человеческий фактор - ненулевой шанс. Если сборка имеет решающее значение, то используйте один или несколько серверов промежуточной сборки.

3

Я слышал о том, что делает Microsoft (может быть?), Которая заключается в том, чтобы роль сборочной няни в команде. То, как они это делают, заключается в том, что когда кто-то ломает сборку (что, вероятно, должно включать проверку чего-то, что не проходит тесты), он принимает на себя роль. Это делает людей ответственными за последствия своих действий самым непосредственным образом. И учитывая, что это несколько раздражающая работа, это побуждает их больше не ломать сборку.

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

Обратите внимание, что, как говорит Торбьерн, ответственность за сборку - это не то же самое, что ответственность за сервер сборки. Ответственность за сервер может быть возложена на одного или нескольких членов команды, склонных к инфраструктуре, при этом ответственность за сборку меняется.

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

Если у вас есть некоторые члены команды, которые с большей вероятностью сломают сборку (и, основываясь на моем собственном опыте, я в основном думаю о членах в другой стране), и если вы используете какой-то хороший современный контроль версий, такой как Mercurial или Git, вы можете сделать так, чтобы они зарегистрировались в другой ветви для остальной части команды, запустили отдельный процесс CI для этого и автоматически объединяли изменения из этой ветви в транк после успешной сборки (обратите внимание, что вам придется запустите вторую сборку и протестируйте после слияния, прежде чем проверять слияние!). Так как автоматическое объединение не всегда успешно, это в конечном итоге оставит ветку, требующую ручного внимания, что может быть настоящей болью. Впрочем, это может быть менее болезненно, чем проверка взломанного кода для остальной части команды.


2

Как сказал Джонатан Ку, вы все должны нести ответственность за сервер сборки и скрипт сборки. Есть три причины:

  1. На данный момент у вас есть случай «Bus of 1», что означает, что если вас перебросит автобус, тогда все знания о сервере сборки и сценариях сборки будут потеряны.
  2. Сценарии, которые были написаны вами (правильно или неправильно), имели только ваш вклад. Как и в любом другом коде, чем больше людей задействовано, тем шире база знаний, которую можно применить к нему.
  3. Наконец, когда что-то идет не так, только ты чувствуешь боль. Боль это хорошо, но не тогда, когда она изолирована. В данный момент вы имеете дело с болью, но если бы у всех были боли, то вы бы обнаружили, что в конечном итоге они будут более жесткими в тестировании кода перед фиксацией.

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

  1. Сценарии сборки должны выполняться не только на CI-серверах, но и на локальных машинах разработки. Они должны выдавать одинаковые выходные данные, запускать одинаковые тесты и давать сбой по тем же причинам. Это позволяет разработчикам запускать сценарий перед фиксацией их кода.
  2. Если кто-то нарушает сборку, сделайте ее общедоступной, используя всплывающие окна в панели задач, электронные письма, мигающие огни, шумы и т. Д. Он служит не только для того, чтобы смущать членов команды, но и для всех остальных членов команды, что позволяет ему подпрыгивать и помощь.
  3. Какое-то время избегайте исправления сборки. Получить кого-то еще, чтобы сделать это. Если никто больше не подпрыгивает, подождите, пока не произойдут плохие вещи, и используйте это как точку обучения для всей команды, чтобы понять, почему сервер CI важен.
  4. Старайтесь, чтобы ваш сервер сборки и машины разработки были максимально лишены установленных сторонних компонентов, особенно содержите GAC в чистоте. Положитесь на сторонние компоненты, находящиеся в папке библиотеки проектов. Это помогает быстрее идентифицировать недостающие компоненты.

Я категорически не согласен с смущением кого-либо. Хотели бы вы, чтобы ваш компилятор выдавал сигнал тревоги при возникновении синтаксической ошибки?

@ Thorbjørn Это CI-сервер, а не ваш локальный блок разработки. Дело в том, что команда должна сделать все возможное, чтобы предотвратить проверку кода, который нарушает сборку. Надеюсь, что люди работают в веселой дружеской обстановке, и смущение, о котором я говорю, не значит подлый дух, но оно заставляет людей думать в следующий раз, прежде чем они совершат. Но у нас есть забавный звук, который играет, когда сервер сборки ломается.
Бронумски

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

@ Thorbjørn Идеальное право на несогласие и несогласие в определенной степени хорошо, так как позволяет нам обсуждать разные идеи. С нетерпением жду возможности снова не согласиться с вами, теперь я должен вернуться к принижению младших разработчиков :)
Бронумски

1

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

Вы можете попробовать использовать такие инструменты, как Catlight или BuildNotify . Они показывают текущее состояние важных сборок в области трея. Каждый раз, когда разработчик смотрит на часы, он видит, что существует сломанная сборка, которую необходимо исправить.

Статус предупреждения Catlight build в трее

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

введите описание изображения здесь


0

Одна стратегия состоит в том, чтобы использовать множество небольших веток для множества небольших проектов. Затем, когда кто-то ломает сборку, он просто ломает сборку для себя. Таким образом, они получают раздраженное электронное письмо от сервера сборки, и они должны беспокоиться об этом.

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


«Много маленьких веток» не работает хорошо, когда у вас есть одно большое приложение, которому все способствуют.
c_maker

2
нет, это работает хорошо Однако вы переносите боль со времени разработки на время слияния. Если вы регулярно объединяете небольшие рабочие пакеты, то это совсем не повредит.
gbjbaanb

@gbjbaanb: Да, именно поэтому я указал небольшие филиалы и небольшие проекты. В качестве дополнительного бонуса, если основная сборка будет сломана в течение часа, есть вероятность, что другие люди, вероятно, смогут продолжить работу, потому что их сборки не были нарушены.
Btilly

@c_maker: каждая стратегия имеет ряд компромиссов, и ни одна из них не подходит для всех ситуаций. Однако то, что я вам дал, сейчас используется с большим успехом во многих организациях.
Btilly

0

Я собираюсь порвать с хором здесь и сказать, что на самом деле, иногда ломать сборку не так уж плохо, так как это показывает, что настоящая работа выполняется. Да, разработчики должны создавать и тестировать до того, как они выполнят свои обязательства, но основное бремя тестирования должно нести средства автоматизации разработки, включая сервер непрерывной интеграции. Инструменты должны быть использованы, и если сборка не будет прерываться время от времени, неясно, что вы продвигаетесь так сильно, как могли. Однако я считаю, что сборка никогда не должна оставаться поврежденной в течение какого-либо значительного промежутка времени и даже предпочтет автоматические откаты или многоэтапный процесс фиксации, если это поможет поддержать двойные цели быстрой обратной связи от централизованных автоматизированных средств тестирования, плюс "зеленый" багажник.


0

Имейте в виду вещи:

  1. Вашей команде нужен набор стандартов, которым нужно следовать
  2. Вы должны получить управление на борту с идеей чистого кода и стремиться к улучшению практики кода.
  3. Тест тест тест! Всегда проверяйте, прежде чем проверить.
  4. Хотя я согласен с тем, что можно сломать сборку, это редкий случай, и я имею в виду крайне редкий случай, который был бы приемлемым. Если это будет ежедневно, я буду искать дверь или говорить с моим боссом о стандартах.

В целом, вам, ребята, нужно установить, написать стандарты, основанные на лучших практиках, а не на ваших индивидуальных практиках (очевидно, они не работают). Когда все согласятся со стандартами, начните процесс проверки кода и обеспечения соблюдения стандартов. Похоже, что руководство ушло в отпуск и больше не вернулось. Это вещи, которые, честно говоря, довольно просты для любого магазина. Основа хорошего кода начинается с хороших стандартов, определяющих код команды и способ ее написания. Просто мои мысли. Недавно я попал в похожую ситуацию на своей новой работе, и я поговорил с моим боссом. Ему объяснили, что XYZ нужно завершить, потому что он влияет на ABC. Две недели спустя я написал список стандартов кода, которым нужно следовать, и представил его. Вслед за тем, что мои коллеги внесли свой вклад, и примерно через 2 месяца у нас были стандарты, которые разрешили тонны проблем.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.