Непрерывная интеграция ( CI ) — это практика частой интеграции изменений исходного кода и обеспечения работоспособности интегрированной кодовой базы.
Обычно разработчики объединяют изменения в интеграционную ветку , а автоматизированная система собирает и тестирует программную систему . [1] Часто автоматизированный процесс запускается при каждом коммите или запускается по расписанию, например, один раз в день.
Грэди Буч впервые предложил термин CI в 1991 году [2] , хотя он не выступал за интеграцию несколько раз в день, но позже CI стал включать этот аспект. [3]
Самой ранней известной работой (1989) по непрерывной интеграции была среда Infuse, разработанная GE Kaiser, DE Perry и WM Schell. [4]
В 1994 году Грейди Буч использовал фразу «непрерывная интеграция» в своей книге « Объектно-ориентированный анализ и проектирование с приложениями» (2-е издание) [5], чтобы объяснить, как при разработке с использованием микропроцессов «внутренние релизы представляют собой своего рода непрерывную интеграцию системы и существуют для принудительного закрытия микропроцесса».
В 1997 году Кент Бек и Рон Джеффрис изобрели экстремальное программирование (XP) во время работы над проектом Chrysler Comprehensive Compensation System , включая непрерывную интеграцию. [1] [ самостоятельно опубликованный источник ] Бек опубликовал статью о непрерывной интеграции в 1998 году, подчеркнув важность личного общения по сравнению с технологической поддержкой. [6] В 1999 году Бек более подробно изложил эту тему в своей первой полной книге об экстремальном программировании. [7] CruiseControl , один из первых инструментов непрерывной интеграции с открытым исходным кодом, [8] [ самостоятельно опубликованный источник ] был выпущен в 2001 году.
В 2010 году Тимоти Фиц опубликовал статью, в которой подробно описывалось, как инженерная группа IMVU создала и использовала первую практическую систему CD. Хотя его пост изначально был встречен скептически, он быстро прижился и нашел широкое применение [9] как часть методологии бережливой разработки программного обеспечения , также основанной на IMVU.
Основные действия CI заключаются в том, что разработчики часто размещают изменения кода в общей интеграционной области и что полученная интегрированная кодовая база проверяется на корректность. Первая часть обычно включает слияние изменений в общую ветку управления версиями. Вторая часть обычно включает автоматизированные процессы, включая: сборку, тестирование и многие другие процессы.
Обычно сервер часто строит из области интеграции; т. е. после каждого коммита или периодически, например, раз в день. Сервер может выполнять проверки контроля качества , такие как запуск модульных тестов [10], и собирать метрики качества программного обеспечения с помощью таких процессов, как статический анализ и тестирование производительности.
В этом разделе перечислены передовые практики от практиков по другим практикам, которые улучшают КИ.
Автоматизация сборки — это лучшая практика. [11] [12]
CI требует, чтобы система контроля версий поддерживала атомарные фиксации , то есть все изменения разработчика обрабатываются как одна фиксация.
При внесении изменений в код разработчик создает ветку, которая является копией текущей кодовой базы . Поскольку другие изменения фиксируются в репозитории , эта копия расходится с последней версией.
Чем дольше продолжается разработка в ветке без слияния с интеграционной веткой, тем больше риск множественных конфликтов интеграции [13] и сбоев, когда ветка разработчика в конечном итоге будет объединена обратно. Когда разработчики отправляют код в репозиторий, они должны сначала обновить свой код, чтобы отразить изменения в репозитории с тех пор, как они взяли свою копию. Чем больше изменений содержит репозиторий, тем больше работы должны выполнить разработчики, прежде чем отправлять свои собственные изменения.
В конце концов, репозиторий может настолько отличаться от базовых показателей разработчиков, что они попадают в то, что иногда называют «адом слияния» или «адом интеграции» [14] , где время, необходимое для интеграции, превышает время, необходимое для внесения первоначальных изменений. [15]
Сторонники CI предлагают разработчикам использовать разработку через тестирование и убедиться, что все модульные тесты проходят локально, прежде чем передавать их в интеграционную ветку, чтобы работа одного разработчика не нарушала работу другого разработчика.
Незавершенные функции можно отключить перед фиксацией с помощью переключателей функций .
Непрерывная поставка гарантирует, что программное обеспечение, зарегистрированное в ветви интеграции, всегда находится в состоянии, пригодном для развертывания у пользователей, а непрерывное развертывание автоматизирует процесс развертывания.
Непрерывная доставка и непрерывное развертывание часто выполняются совместно с CI и вместе образуют конвейер CI/CD.
Сторонники CI рекомендуют хранить все файлы и информацию, необходимые для сборки, в системе контроля версий (для git — в репозитории ); система должна быть готова к сборке из новой версии и не требовать дополнительных зависимостей.
Мартин Фаулер рекомендует всем разработчикам придерживаться одной и той же ветки интеграции. [16]
Инструменты автоматизации строительства автоматизируют строительство.
Сторонники CI рекомендуют, чтобы одна команда имела возможность построить систему.
Автоматизация часто включает в себя автоматизацию интеграции, которая часто включает в себя развертывание в среде , похожей на производственную . Во многих случаях скрипт сборки не только компилирует двоичные файлы, но и генерирует документацию, страницы веб-сайта, статистику и дистрибутивные носители (например, файлы Debian DEB , Red Hat RPM или Windows MSI ).
Разработчики могут сократить усилия по разрешению конфликтующих изменений, синхронизируя изменения друг с другом часто; по крайней мере ежедневно. Проверка недельной работы сопряжена с риском конфликта как по вероятности возникновения, так и по сложности разрешения. Относительно небольшие конфликты значительно легче разрешить, чем более крупные. Интеграция (фиксация) изменений по крайней мере один раз в день считается хорошей практикой, а чаще даже лучше. [17]
Обычно рекомендуется строить ежедневно , если не чаще. [ необходима цитата ]
Система должна создать коммиты для текущей рабочей версии, чтобы проверить, что они интегрируются правильно. Распространенной практикой является использование автоматизированной непрерывной интеграции, хотя это может быть сделано вручную. Автоматизированная непрерывная интеграция использует сервер или демон непрерывной интеграции для мониторинга системы контроля версий на предмет изменений, а затем автоматически запускает процесс сборки.
При исправлении ошибки хорошей практикой является запуск тестового случая, воспроизводящего ошибку. Это позволяет избежать отмены исправления и повторного появления ошибки, что известно как регрессия .
Сборка должна быть завершена быстро, чтобы в случае возникновения проблем с интеграцией их можно было быстро выявить.
Наличие тестовой среды может привести к сбоям в тестируемых системах при их развертывании в производственной среде , поскольку производственная среда может существенно отличаться от тестовой. Однако создание копии производственной среды является затратным. Вместо этого тестовая среда или отдельная предпроизводственная среда ( «staging») должны быть созданы как масштабируемая версия производственной среды для снижения затрат при сохранении состава и нюансов технологического стека . В этих тестовых средах виртуализация служб обычно используется для получения доступа по требованию к зависимостям (например, API, сторонние приложения, службы, мэйнфреймы и т. д.), которые находятся вне контроля команды, все еще развиваются или слишком сложны для настройки в виртуальной тестовой лаборатории.
Предоставление сборок заинтересованным лицам и тестировщикам в легком доступе может сократить объем доработок, необходимых при перестройке функции, которая не соответствует требованиям. Кроме того, раннее тестирование снижает вероятность того, что дефекты сохранятся до развертывания. Раннее обнаружение ошибок может сократить объем работы, необходимой для их устранения.
Всем программистам следует начинать день с обновления проекта из репозитория. Таким образом, они все будут в курсе событий.
Должно быть легко определить, сломалась ли сборка, и если да, то кто внес соответствующее изменение и что это было за изменение.
Большинство систем CI позволяют запускать скрипты после завершения сборки. В большинстве ситуаций можно написать скрипт для развертывания приложения на тестовом сервере, который может просматривать каждый. Дальнейшим шагом вперед в этом образе мышления является непрерывное развертывание , которое требует, чтобы программное обеспечение было развернуто непосредственно в производстве, часто с дополнительной автоматизацией для предотвращения дефектов или регрессий. [18] [19]
Преимущества CI включают в себя:
Риски КИ включают в себя:
Следующие методы могут повысить производительность конвейеров , особенно в системах, размещенных в облаке : [23] [24] [25]
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь )