Что такое CI/CD, и почему непрерывная? Темная сторона силы настоящего и воспоминания о прошлом

Мне тут попалась статья по теме, которая начинается с такого определения:

Непрерывная интеграция (Continuous Integration, CI) и непрерывная поставка (Continuous Delivery, CD) представляют собой культуру, набор принципов и практик, которые позволяют разработчикам чаще и надежнее развертывать изменения программного обеспечения. 

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

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


Так как вы думаете, почему разработчикам нужно чаще вносить-развертывать изменения программного обеспечения? Вот две причины, которые кажутся мне очевидными:

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

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

То есть в любом случае основная работа объявляется как бы сделанной с как бы небольшой оговоркой: теперь, когда мы все сделали в основном, мы приступаем к увлекательному процессу улучшения того, что мы сделали! Согласитесь, звучит максимально позитивно. Кто же откажется от улучшения да еще и непрерывного-продолжительного. Это глобальная проблема индустрии современных программных продуктов — это засилие эффективных менеджеров, которые не просто могут или стремятся вас обмануть или, на жаргоне, «развести на бабки», нет! Эти эффективные менеджеры искренне верят в то, что они несут в мир ИТ доброе-лучшее-вечное, никто же не скажет вам, что он вам впарил совершенно сырой продукт, для которого вам придется оплачивать непрерывное и фактически бесконечно продолжающееся исправление ошибок, восполнение-корректировку отсутствующей или неадекватно спроектированной функциональности. Проблема в том, что вам не расскажут о проблемах не потому, что вас хотят обмануть, нет! Вам не расскажут о проблемах, потому что их уже давно не принято замечать в приличном ИТ-сообществе. Вас будут совершенно искренне убеждать, что это самые лучшие и самые прогрессивные практики и принципы и даже целая культура, будут убеждать с такой искренней внутренней убежденностью что вы постесняетесь задать очевидные вопросы, которые также очевидно могут разрушить этот прекрасный мир непрерывного улучшения в ИТ. Можно например задаться такими, очень простыми вопросами: "А почему нельзя сразу сделать так, чтобы не надо было очень часто улучшать?", "Разве необходимость частых улучшений (исправлений?) сама по себе не является признаком плохой надежности / отсутствия надежности?"

 Как было в древние времена

Но я еще помню времена когда у этих понятий Continuous Integration-Continuous Delivery не было красивой раскрученной аббревиатуры. Но был непреходящий смысл. В чем же находили практический смысл древние профессионалы ИТ?

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

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

Но вернемся к простому примеру, заметьте, это точно соответствует понятиям Continuous Integration- Continuous Delivery, ведь мы, однажды установив наше приложение, по сути, запустили бесконечный процесс, который позволяет нам в любое время заменить компонент этого приложения (будь то скрипт или библиотека), без того чтобы сносить это приложение и устанавливать его по новой, то есть поставка компонент и их интеграция с уже работающим приложением может действительно осуществляться в любое время. То есть смысл непрерывности не в том, что мы постоянно, все чаще и чаще, исправляем какие-то ошибки в уже развернутом приложении, смысл непрерывности в том, что мы непрерывно имеем возможность исправить вновь обнаруженные ошибки, а в более продвинутых системах еще поддерживается возможность расширять существующий пользовательский интерфейс (фронт-енд) и добавлять новые пользовательские функции в приложение без переустановки всего приложения. Например, чтобы добавить функцию проверки орфографии в уже установленный текстовый редактор, нам не надо переустанавливать текстовый редактор. Нам надо скачать (выполнить Delivery) и установить соответствующее расширение проверки орфографии (произвести интеграцию) поверх уже установленного приложения, то есть, по сути, выполнить действия продолжающие изначальную первичную установку этого приложения.

Если что, я совершенно не против того, чтобы продолжать называть CI/CD pipeline-ы – CI/CD пайплайнами, это уже устоявшаяся терминология, я просто хочу напомнить, что эта терминология изначально имела немного другой смысл.

@rukhi7
07.03.2025 15:19 UTC
Первоисточник

Комментарии

@ildarz
07.03.2025 10:32 UTC
+6

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

Совершенно непонятно, почему вы сначала исключили из рассмотрения основную причину - быстрое и по возможности безболезненное внесение в продукт нового функционала, а потом почему-то заявили ее как нечто, бывшее "много лег назад".

@dyadyaSerezha
07.03.2025 22:41 UTC
+2

Согласен. Автор намеренно или случайно забыл о самой главной причине. А вообще говоря, дело даже не в причинах, а в самой возоожности делать Ci на каждый коммит в основную ветку (в идеале), и CD в любое время - и все это полностью автоматически.

@Gromilo
07.03.2025 10:54 UTC
+2

А откуда взялись изначальные определения? Это домыслы или есть фактура?

Я всегда понимал так, CI - мы часто сливаем изменения в общую ветку (интегрируем). Во времена, когда пол года могла идти разработка, а потом месяц интеграция в кодовую базу, это было революционной идеей.

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

А что до выпуска недоделанного продукта, то тут решают не пайплайны, а сама возможность быстро доставить обновление. Это видно под играм. Пока игры были на дисках к багам относились серьёзно, потому что перевыпускать - дорого. Сейчас же игра выходит с багами и это стало нормой. И никакой CI/CD тут не виноват.

@rukhi7
07.03.2025 10:59 UTC
0

CD - выпуск обновления занимает день работы инженера, а он ещё и косячит.

вопрос в том что вы имеете ввиду под обновлением: новый дистрибутив, который надо установить, предварительно деинсталировав предыдущий?

07.03.2025 11:08 UTC
+1

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

Я когда-то собирал руками и обновлял на сервере службу Windows, которая занималась отложенной обработкой данных. Мне не понравилось.

07.03.2025 22:33 UTC
0

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

08.03.2025 05:17 UTC
0

На сервере обычно нет понятия деинсталировать.

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

То есть вопрос в том, что вы понимаете под деплойментом и интеграцией, потому что если выяснится что у вас просто нет этих процессов, то выяснится что вы автоматизируете что-то совсем другое и под CI/CD понимаете что-то совсем другое, соответственно.

выкатывается новый образ нужного контейнера (насколько я понимаю)

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

Кстати контейнеры это достаточно новое поветрие, лет 10 назад никто про них не заикался, особо. Как же все работало тогда?

08.03.2025 07:52 UTC
0

Я же написал в случае железа, как всё было тогда (облака тогда тоже не было).

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

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

Под CI/CD я понимаю стандартное определие из вики/инета.

@
07.03.2025 12:18 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
@Mausglov
07.03.2025 16:39 UTC
+1

Мне кажется, Вы как-то узко рассматриваете программный продукт - как нечто уже завершённое и отлитое в граните. CI/CD пришли вместе с Agile, а Agile - это когда заказчик говорит "я не очень ясно представляю, что хочу, но я готов пробовать и платить за попытки".
И вот идёт поток мелких изменений "вот эту пимпочку сделаем красной", "вот тут поменяем текст".
Наверное, если в конце длинного пути оглянуться, то многие предыдущие итерации покажутся глупыми, кривыми или ненужными. Но именно они и привели к конечному результату.

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

@rukhi7
07.03.2025 17:05 UTC
0

И вот идёт поток мелких изменений "вот эту пимпочку сделаем красной", "вот тут поменяем текст".

вопрос будет в общем то тот же что и чуть выше, но с учетом вашего контекста: вы считаете что для подобного рода изменений вполне нормально компилировать-собирать-упаковывать новый дистрибутив продукта, который надо установить, предварительно деинсталировав предыдущий? Вопрос то именно в этом, как вы собираетесь доводить (деливерить и интегрировать в его окружении) до заказчика такие мелкие изменения, неужели релиз на изменение каждой пимпочки выпускать?

07.03.2025 22:37 UTC
0

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

@Ilyaing
08.03.2025 15:50 UTC
0

Больше маленьких релизов, меньше больших проблем. CI\CD именно про то что мы часто и быстро доставляем новые фичи или фиксы на прод или в тестирование и избегаем множества проблем с конфликтами при больших сборках. Странно что автор не понял и не раскрыл эту истину!

@trabl
11.03.2025 20:57 UTC
0

Казалось бы, причем здесь Agile?)