Главная / О компании / Новости / Все о процессе сборки Azure Devops

Все о процессе сборки Azure Devops

« Назад

Все о процессе сборки Azure Devops  12.04.2021 10:35

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

Azure DevOps - это интегрированный набор служб и инструментов управления проектами программного обеспечения, который может использоваться как полностью настраиваемый набор сервисов для облачной разработки под названием Azure DevOps Services (ранее Visual Studio Team Services (VSTS)) или как локальный инструмент разработки под названием Azure DevOps Server (ранее Microsoft Team Foundation Server (TFS)).

В любом формате Azure DevOps автоматизирует и упрощает процесс сборки ПО. Однако, для более крупных продуктов цикл обратной связи Azure DevOps может быть слишком дольше, чем хотелось бы и могло бы быть. Сейчас мы расскажем, как обогнать конкурентов путем сочетания ускорения компиляций с помощью Incredibuild и автоматизации процесса сборки с помощью Azure DevOps. Секрет в том, что сервер сборки Azure DevOps начинает использовать ядра других машин в вашей сети или публичном облаке, магическим образом превращая его в суперкомпьютер с сотнями ядер и гигабайтами памяти.

О процессе сборки Azure DevOps и его текущих ограничениях

Azure DevOps - это набор инструментов, который полностью покрывает потребности разработчиков, от сбора требований и управления работой, включая разработку ПО, управления версиями, модульного и приемочного тестирования и заканчивая упаковкой, сборкой и развертыванием. Azure DevOps имеет встроенную интеграцию с Visual Studio, кроме того, полностью интегрируется с другими IDE и может создавать продукты на разных языках программирования.

Сборка Azure DevOps управляется путем запуска конвейера, состоящего из одного или нескольких этапов, которые, в свою очередь, организуют задания в конвейер. Каждое задание выполняется на одном агенте, который может размещаться на сервере Microsoft (то есть с полностью управляемым обслуживанием и обновлениями) или у вас. Задания состоят из нескольких элементов и могут выполняться непосредственно на хост-машине агента или в контейнере. Эти элементы или шаги, то есть предварительно упакованные задачи или сценарии, представляют собой самые маленькие блоки в процессе, которые хранятся в виде файла YAML (YAML Ain’t Markup Language).

Агент Azure DevOps обычно использует одно ядро процессора для одного задания, причем большая часть заданий выполняется последовательно. Поскольку очень немногие части конвейера работают параллельно друг другу, повышение производительности требует увеличения скорости процессора агента для вычислительных процессов, нагружающих CPU, и его возможностей ввода-вывода для процессов, требующих ввода-вывода данных, таких как чтение и запись в файловую систему или сеть.

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

Использование дополнительных ресурсов

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

Часто используемые варианты распараллеливания задач, нагружающих CPU

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

Кластеризация

Кластеризация - это использование нескольких машин для одной и той же цели. Azure Devops использует кластеризацию для управления процессом сборки, когда конвейер выделяет агента для каждого полученного запроса на сборку. По сути, конвейер Azure DevOps распараллеливается на уровне задания процесса сборки, выполняя полностью одно задание на каждом агенте, так что несколько запросов сборки могут обрабатываться параллельно.

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

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

Учитывая сложность и дороговизну «ручного» распараллеливания, это нежизнеспособное решение.

Высокопроизводительные вычисления

HPC-2048x1152

Альтернативой управлению множеством одноядерных агентов является наличие одного многоядерного агента. Именно здесь на помощь приходят высокопроизводительные вычисления. HPC (высокопроизводительные компьютеры) - это, по сути, компьютеры, физические или виртуальные, которые могут агрегировать вычислительную мощность, предоставляя в результате гораздо более высокую производительность, чем у отдельного настольного компьютера или рабочей станции. Для этого в высокопроизводительных вычислительных машинах используется много ядер CPU. Машины на базе Windows могут поддерживать до 256 ядер.

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

Хотя многоядерный подход HPC может повысить общую производительность, он имеет два неустранимых ограничения: емкость и детализацию. 64-разрядная система на базе Windows (в настоящее время) ограничена 256 ядрами, что является непреодолимым ограничением для сложных многоплатформенных программных проектов.

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

Конечно, есть и третий фактор: цена. HPC чрезвычайно дороги и вряд ли подходят для всех процессов, связанных со сборкой.

Выход за рамки кластеров и HPC

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

Ответ - да. Incredibuild позволяет распараллеливать отдельные процессы ОС и бесшовно делегировать их выполнение кластеру хостов, одновременно виртуализируя среду агента сборки на удаленных машинах.

Incredibuild превращает Azure DevOps в высокопроизводительную машину с 500 ядрами

С помощью уникального решения для виртуализированных распределенных вычислений Incredibuild вы можете легко добиться значительно более быстрых сборок. Incredibuild превращает любую машину сборки Azure DevOps в «суперкомпьютер», позволяя задействовать простаивающие ядра CPU даже на удаленных машинах в сети или общедоступном облаке. Никаких изменений в исходном коде и никакого дополнительного оборудования не требуется.

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

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

Build-monitor-Chrome
Рис. 1. Сборка браузера Google Chrome с помощью Incredibuild

 

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

Minitab -  прекрасный пример использования Incredibuild Cloud в сочетании с Azure DevOps для ускорения сборки. Minitab, мощное статистическое программное обеспечение, нуждалось в решении для ускорения сборки во время работы в облаке (они перенесли свой CI в облако). Использование как Incredibuild Cloud, так и Azure DevOps оказалось правильным сочетанием мощности и скорости.  

«Incredibuild, работающий на 100 машинах, оказался очень эффективным для оптимизации разработки Minitab... Использование Incredibuild позволило нашей команде перейти от ночных сборок/тестов к непрерывной интеграции, что привело к росту продуктивности и к более быстрым циклам разработки и итераций».

Тони Бьянуччи

Менеджер систем разработки ПО, Minitab

 

Это всего лишь один пример из многих. Фактически, почти любая рабочая нагрузка, которая может быть разбита на несколько параллельных процессов, может быть ускорена Incredibuild таким образом, независимо от того, активируется ли она агентом Azure DevOps или рабочей станцией разработчика. Это означает, что Incredibuild оперативно превращает любую машину в хост с более чем 500 ядрами, или столькими, сколько у вас есть в сети. Более быстрое выполнение трудоемких задач достигается путем использования простаивающих CPU, которые уже у вас есть или общедоступных облачных ресурсов с подключением тогда, когда они нужны.

Все или ничего

Компании не могут позволить себе отставать. Speed&Fast&Agile - это не просто слова, это ценности, по которым нужно жить (или же умереть). Каждый шаг процесса проверяется и максимально оптимизируется, как и следует. Вот почему клиенты Incredibuild из ведущих компаний в своей отрасли не идут на компромисс в отношении скорости и качества - они хотят иметь и то, и другое, и они хотят этого сейчас. Для начала стоит взглянуть на процесс сборки. Медленный процесс сборки - тормоз для бизнеса, особенно если его можно ускорить простым способом, не ухудшая качество.

Источник ►