Ночные сборки: зачем мне это делать?
Зачем мне делать ночные сборки?
16 ответов
Вы должны делать ночные сборки, чтобы гарантировать, что ваша кодовая база остается здоровой.
Побочным эффектом выполнения ночных сборок является то, что это вынуждает команду создавать и поддерживать полностью автоматизированный сценарий сборки. Это помогает гарантировать, что ваш процесс сборки задокументирован и повторяется.
Автоматизированные сборки хороши при обнаружении следующих проблем:
- Кто-то проверил что-то, что ломает вещи.
- Кто-то забыл проверить нужный файл или изменить.
- Ваши сценарии сборки больше не работают.
- Ваша сборочная машина сломана.
Если вы будете делать это каждую ночь, вы обнаружите, что такие проблемы возникают в течение 24 часов с момента их возникновения. Это предпочтительнее, чем обнаруживать все проблемы за 24 часа до того, как предполагается доставить программное обеспечение.
Конечно, вы должны также иметь автоматические модульные тесты, которые запускаются для каждой ночной сборки.
Я лично нашел, что непрерывная интеграция лучше, чем ночные сборки:
http://en.wikipedia.org/wiki/Continuous_integration
Я даже использую его в проектах с одним человеком, просто удивительно, как быстро вы можете выявить проблемы и позаботиться о них прямо сейчас.
Я занимаюсь строительным проектированием (между прочим) в течение 16 лет. Я твердо верю в непрерывную интеграцию на ранней стадии, часто на стадии сборки. Поэтому первое, что я делаю с проектом, это устанавливаю, как он будет построен (Java: Ant или Maven;.NET: NAnt или MSBuild) и как им управлять ( Subversion или какой-либо другой контроль версий). Затем я добавлю непрерывную интеграцию ( CruiseControl или CruiseControl.NET) в зависимости от платформы, а затем позволю другим разработчикам проиграть.
По мере роста проекта и роста потребности в отчетах и документации сборка в конечном итоге займет больше времени. На этом этапе я разделю сборки на непрерывные сборки (запускаемые при регистрации), которые только компилируют и запускают модульные тесты, и ежедневные сборки, которые собирают все, запускают все отчеты и создают любую сгенерированную документацию. Я также могу добавить сборку доставки, которая помечает хранилище и выполняет дополнительную упаковку для доставки клиенту. Я буду использовать детализированные цели сборки для управления деталями, чтобы любой разработчик мог собрать любую часть системы - сервер непрерывной интеграции использует те же этапы сборки, что и любой разработчик. Самое главное, мы никогда не поставляем сборку для тестирования или заказчику, который не был собран с использованием сервера сборки.
Вот что я делаю - вот почему я делаю это (и почему вы тоже должны):
Предположим, у вас есть типичное приложение с несколькими проектами и несколькими разработчиками. Хотя разработчики могут начать с общей согласованной среды разработки (одинаковые ОС, одинаковые исправления, одинаковые инструменты, одинаковые компиляторы), со временем их среды будут расходиться. Некоторые разработчики будут неукоснительно применять все исправления и обновления безопасности, другие не будут. Некоторые разработчики добавят новые (возможно, лучшие) инструменты, другие - нет. Некоторые не забудут обновить свое рабочее пространство перед сборкой; другие будут обновлять только часть проекта, который они разрабатывают. Некоторые разработчики добавляют исходный код и файлы данных в проект, но забывают добавить их в систему контроля версий. Другие будут писать модульные тесты, которые зависят от конкретных особенностей их среды. Как следствие, вы быстро увидите повсеместные оправдания "Ну, он строит / работает на моей машине".
Имея отдельный, стабильный, согласованный, хорошо зарекомендовавший себя сервер для построения вашего приложения, вы легко обнаружите такого рода проблемы, а запуская сборки из каждого коммита, вы сможете точно определить, когда проблема проникла в систему., Что еще более важно, поскольку вы используете отдельный сервер для сборки и упаковки своего приложения, оно всегда будет упаковывать все одинаково, каждый раз. Нет ничего хуже, чем заставить разработчика доставить заказную сборку клиенту, заставить ее работать, а затем не иметь представления, как воспроизвести настройки.
Когда я увидел этот вопрос, сначала я искал ответ Joel Spolsky. Немного разочарован, поэтому я планировал добавить его сюда.
Надеюсь, что все знают о тесте Джоэла на карьере.
Из его блога о тесте Джоэла: 12 шагов к лучшему коду
3. Вы делаете ежедневные сборки?
Когда вы используете систему контроля версий, иногда один программист случайно проверяет что-то, что нарушает сборку. Например, они добавили новый исходный файл, и все прекрасно работает на их компьютере, но они забыли добавить исходный файл в репозиторий кода. Таким образом, они запирают свою машину и уходят домой, забыв и довольные. Но никто больше не может работать, поэтому они тоже должны идти домой несчастными.
Нарушение сборки настолько плохо (и так часто), что помогает делать ежедневные сборки, чтобы гарантировать, что поломка не останется незамеченной. В больших командах один хороший способ убедиться, что поломки устранены сразу, - это выполнять ежедневную сборку каждый день, скажем, в обеденное время. Каждый делает как можно больше проверок перед обедом. Когда они возвращаются, сборка завершена. Если бы это сработало, отлично! Все проверяют последнюю версию исходного кода и продолжают работать. Если сборка завершилась неудачно, вы исправите ее, но каждый может продолжить работу с заранее созданной, неповрежденной версией исходного кода.
В команде Excel у нас было правило, что тот, кто нарушил сборку, как их "наказание", отвечал за присмотр за сборками, пока кто-то другой не сломал его. Это был хороший стимул не нарушать сборку и хороший способ повернуть всех в процессе сборки, чтобы все узнали, как это работает.
Хотя у меня нет возможности делать ежедневные сборки, я большой поклонник этого.
Все еще не убежден? Проверьте краткое изложение здесь в Daily Builds Are Your Friend!
Я бы порекомендовал делать сборки каждый раз, когда вы регистрируетесь. Другими словами, я бы рекомендовал настроить систему непрерывной интеграции.
Преимущества такой системы и другие подробности можно найти в статье Фаулера и в записи в Википедии среди других мест.
По моему личному опыту, это вопрос контроля качества: каждый раз, когда код (или тесты, которые можно рассматривать как форму требований) модифицируются, могут появляться ошибки. Чтобы гарантировать качество, необходимо создать новую версию продукта. как это будет отправлено и выполнить все доступные тесты. Чем чаще это делается, тем менее вероятным ошибкам будет позволено сформировать колонию. Поэтому ежедневные (ночные) или непрерывные циклы являются предпочтительными.
Кроме того, независимо от того, ограничиваете ли вы доступ к своему проекту для разработчиков или для большей группы пользователей, ночная сборка позволяет всем быть в "последней версии", сводя к минимуму трудность объединения своих вкладов обратно в код.
Вы на самом деле не то, что вам нужно, это непрерывная интеграция и автоматическое тестирование (что на шаг дальше ночных сборок).
Если вы сомневаетесь, вам следует прочитать эту статью Мартина Фаулера о непрерывной интеграции.
Подводя итог, вы хотите построить и протестировать как можно раньше и как можно чаще, чтобы сразу обнаруживать ошибки, чтобы их можно было исправить, пока то, что вы пытались достичь, вызвав их, еще свежо в вашем уме.
Вы хотите делать сборки по регулярному расписанию, чтобы уловить проблемы с интеграцией кода между разработчиками. Причина, по которой вы хотите делать это по ночам, а не по неделям или по более длительному графику, состоит в том, что чем дольше вы ждете обнаружения таких проблем, тем труднее будет их решать. Практика создания сборок при каждой регистрации (непрерывная интеграция) сводит процесс ночной сборки к логической крайности.
Побочное преимущество повторяющегося процесса сборки также важно в долгосрочной перспективе. Если вы работаете в команде с несколькими проектами, то в какой-то момент вам понадобится легко воссоздать старую сборку, возможно, для создания патча.:(
Чем больше вы сможете автоматизировать процесс сборки, тем больше времени вы сэкономите для каждой последующей сборки. Это также снимает сам процесс сборки с критического пути доставки конечного продукта, что должно радовать вашего менеджера.:)
В зависимости от сложности вашего продукта непрерывная интеграция может или не может запустить полный набор тестов.
Представьте, что Cisco тестирует маршрутизатор с буквально тысячами различных настроек для тестирования. Для запуска полного набора тестов на некоторых продуктах требуется время. Иногда недели. Так что вам нужны сборки для разных целей. Ночная сборка может стать основой для более тщательного тестирования.
Это также зависит от размера и структуры команды, работающей над вашим проектом. Если есть разные команды, полагающиеся на API-интерфейсы друг друга, может иметь смысл иметь ночные сборки для частой интеграции. Если вы взламываете только одного или двух товарищей по команде, это может или не может стоить этого.
Ну... Я думаю, это зависит от вашего проекта, конечно. Если это просто ваш хобби-проект без выпусков, зависимостей и никто, кроме вас, отправляющего код, это может быть излишним.
Если, с другой стороны, есть команда разработчиков, которые представляют код, автоматические ночные сборки помогут вам обеспечить качество кода в хранилище. Если кто-то делает что-то, что "нарушает сборку" для всех остальных, это быстро заметят. Можно прервать сборку, не заметив, например, забыв добавить новый файл в хранилище, и ночные сборки в централизованном месте обнаружат их довольно быстро.
Есть, конечно, другие возможные преимущества, я уверен, что другие будут их поставлять.:)
Любая автоматизация сборки лучше, чем не автоматизация сборки:-)
Лично я предпочитаю ежедневные сборки - таким образом, если сборка не работает, все готовы ее исправить.
На самом деле, если это вообще возможно, то сборки Continuous Integration - это путь (т. Е. Сборка при каждой регистрации), поскольку это сводит к минимуму количество изменений между сборками и, таким образом, позволяет легко определить, кто нарушил сборку, а также легко исправить сборку.
Я думаю, что они очень важны, особенно в проектах с более чем 1 человеком. Команда должна знать как можно скорее, если кто-то:
- проверяет плохой файл
- не проверяет файл
- ...
Есть несколько причин, некоторые из них будут более применимы, чем другие
- Если над вашим проектом работают два или более человек
- Это хороший способ получить последнюю версию кода, над которой вы не работаете
- Ночная сборка обеспечивает срез во времени текущего состояния кода
- Ночная сборка даст вам стабильную сборку, если вам нужно отправить код людям
Ночные сборки необходимы только для значительно больших проектов (когда их сборка занимает слишком много времени в течение дня). Если у вас есть небольшой проект, который не занимает много времени для сборки, вы можете создать его, выполнив функциональные фрагменты кода, чтобы вы знали, что ничего не испортили в процессе. Тем не менее, в более крупных проектах это невозможно, поэтому важно построить проект так, чтобы вы знали, что все еще в рабочем состоянии.
Ночные сборки идеально подходят для выполнения статического анализа кода (см. Qalab и проекты, из которых он собирает статистику, если вы находитесь в мире Java). К сожалению, это редко делается.
Ночные сборки не всегда нужны - я думаю, что они действительно полезны только в больших проектах. Но если вы работаете над большим проектом, ночная сборка - это хороший способ проверить, что все работает - вы можете запустить все свои тесты (модульные тесты, интеграционные тесты), собрать весь свой код - короче, убедиться, что ничего не работает. сломан в вашем проекте.
Если у вас небольшой проект, время сборки и тестирования будет короче, поэтому вы, вероятно, сможете позволить себе делать более регулярные сборки.