Что означает «автоматическая сборка»?

15

Я пытаюсь добавить непрерывную интеграцию в проект.

Согласно Википедии , одним из основных элементов CI является автоматизированная сборка. Однако я не совсем понимаю, что именно это означает, поскольку статьи о КИ и автоматизации сборки, похоже, не согласны.

Особенности путаницы: что означает «автоматизированная сборка» в контексте:

  • проект, использующий интерпретируемый язык, такой как Python или Perl?
  • строить из источника на компьютере конечного пользователя?
  • приложение, которое имеет зависимости, которые нельзя просто предварительно скомпилировать и распространить, например, базу данных в СУБД, локальной для компьютера пользователя?

источник
2
Я пометил оба, buildsи buildпотому что я не знал, какой из них использовать.

Ответы:

14

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

  • Процесс для артефактов источника преобразования (код, схема базы данных, документация и т. Д.), Развернутых для конечного пользователя.
  • Применение мер обеспечения качества во время указанного преобразования

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

Этапы трансформации:

  • компиляция
  • соединение
  • упаковка
  • развертывание
  • Перенос данных
  • Резервный
  • уведомление

Этапы обеспечения качества:

  • Предупреждения / ошибки компилятора
  • Модульные тесты
  • Интеграционные тесты
  • Системные тесты
  • Проверка подлинности развертывания

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

Стивен Гросс
источник
21

Автоматическая сборка - это описание процесса, которое должно охватывать следующие основы:

  1. Получить последнюю версию кода из Source Control
  2. Скомпилируйте последний код в исполняемый файл
  3. Выполнять тесты (модульные тесты, системные тесты, интеграционные тесты) скомпилированного кода
  4. Разверните завершенный исполняемый файл в известном месте для развертывания.
  5. Опубликовать результаты сборки.
    5.1 Успешная компиляция, успешное тестирование

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

Шелдон Варкентин
источник
3
Поскольку это было задано явно, вы могли бы упомянуть, что шаги, которые не применяются, являются необязательными. Например, если ваше приложение представляет собой набор скриптов Python, шаг 2 может быть ничем, или это может быть что-то такое же простое, как архивирование кода в одном файле. Вполне допустимо не иметь этапа компиляции.
Брайан Оукли
@BryanOakley Это честно. Эквивалент отсутствия компиляции для сценариев может гарантировать, что все ваши зависимости, если они у вас есть, будут правильно собраны на этом этапе. Например, любые дополнительные сторонние библиотеки, необходимые для вашего скрипта Python, должны быть включены, чтобы они включались во все следующие шаги. Я полагаю, что в этом тоже нет необходимости, если известно, что на целевой машине и машине сборки всегда есть все необходимые библиотеки.
Шелдон Варкентин
2

На мой взгляд, автоматизированная сборка - это то, что

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

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

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

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

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

прецизионный самописец
источник
Также может быть полезно иметь запланированную сборку и позволить разработчикам запускать автоматическую сборку одним действием (если это два действия, это не совсем автоматизировано, не так ли?) В нашем случае сборка для некоторых систем слишком Стремитесь к запуску каждого коммита, так что это по расписанию и по запросу.
Дэвид Торнли
@DavidThornley: Да. Это полезно Большинство инструментов CI позволяют начать сборку за пределами установленного графика. Но опять же, это не перестает быть автоматической сборкой, потому что эта опция не существует. Это перестало бы быть автоматической сборкой, если бы разработчику всегда приходилось ее запускать.
фунтовые
1
a project using an interpreted language, such as Python or Perl?

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

строить из источника на компьютере конечного пользователя?

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

приложение, которое имеет зависимости, которые нельзя просто предварительно скомпилировать и распространить, например, базу данных в СУБД, локальной для компьютера пользователя?

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

rjzii
источник
1

То, что вы обсуждаете в своем вопросе, - это на самом деле 3 разных понятия:

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

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

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

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

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

Майкл Браун
источник
1
Замечательные моменты ... это очень плохо, что большинство людей не читают до конца темы и не голосуют.
hotshot309
0

«Автоматизированная сборка» означает, что вы можете перейти от исходного кода к отправляемому пакету одним (планируемым) действием (обычно сценарием оболочки или пакетным файлом).

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

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

  • компилирование, компоновка
  • запуск автоматизированных тестов
  • создание установочных пакетов
  • установка
  • изменение базы данных
  • создание резервных копий (на случай необходимости отката)
tdammers
источник