FreeBSD уже давно заслужила репутацию надежной и производительной операционной системы, особенно в сфере серверных решений и виртуализации. Одним из ключевых инструментов для управления виртуальными машинами на FreeBSD является Libvirt - популярный, кроссплатформенный API и демона управления виртуализацией, поддерживающий различные гипервизоры. В последнее время особое внимание привлекает нативный гипервизор FreeBSD - Bhyve, сочетающий современную архитектуру с высокой производительностью. Однако успешное совместное использование Libvirt и Bhyve в среде FreeBSD требует создания надежной системы автоматического тестирования (CI), что значительно упрощает развитие, предотвращает ошибки и гарантирует стабильность продуктов. Развитие CI для Libvirt с поддержкой Bhyve на FreeBSD стало реальностью благодаря спонсорской поддержке FreeBSD Foundation и усилия опытных разработчиков, которые серьезно взялись за интеграцию и усовершенствование тестовой среды.
Одной из важных задач была реализация процесса постоянной интеграции, позволяющей автоматизировать тестирование и быстро выявлять ошибки, особенно перед выпуском новых версий. Исторически проверка новых релизов Libvirt для FreeBSD была трудоемкой и зачастую вручную, что нередко приводило к тому, что релизы выходили с ошибками, не замеченными вовремя из-за ограниченного времени. Для решения этой проблемы стало необходимо настроить CI, способный выполнять полный набор тестов в условиях FreeBSD+Bhyve. С точки зрения тестового окружения значительным вызовом стала зависимость Libvirt от набора тестов Libvirt TCK (Technology Compatibility Kit). Проект Libvirt TCK имеет много готовых сценариев для проверки совместимости и функциональности, однако первоначальная архитектура предполагает использование образов, создаваемых с помощью утилиты virt-builder, входящей в пакет Libguestfs.
Портирование Libguestfs на FreeBSD представляет собой крайне сложную задачу ввиду большого числа внутренних зависимостей и отличий в архитектуре системы. Именно поэтому команда решила использовать обходные методы - запуск virt-builder на Linux-хосте с передачей образов по SSH или совместное использование разделов для копирования готовых образов на FreeBSD. Другой эксперимент заключался в попытке запустить virt-builder внутри Linuxulator - подсистемы FreeBSD для исполнения Linux-приложений, однако эти подходы имели ограниченный успех. Было решено, что для первоначального запуска CI можно использовать один раз созданные образы, которые затем многократно переиспользуются, значительно снижая необходимость повторного запуска virt-builder на FreeBSD. Этот компромисс позволил сосредоточить усилия на адаптации самих тестов и исправлении недостающих функций драйвера Libvirt для Bhyve.
В ходе разработки были реализованы новые возможности, такие как поддержка virtio-rnd - виртуального генератора случайных чисел - что улучшило совместимость и безопасность виртуальных машин. Для некоторых функций оказалось рациональнее добавить их в поддержку Bhyve, а не пытаться обходить отсутствующие возможности, что значительно ускорило продвижение проекта. Создание и интеграция полного набора тестов в CI-среду заняла несколько релизов и требовала не только изменений в тестах Libvirt TCK, но и множества пул-реквестов, чтобы учесть особенности FreeBSD и ограничения Bhyve. В конечном итоге основные тестовые группы, важные для использования Libvirt с Bhyve, такие как "domain", "networks" и "storage", были успешно реализованы и запущены в режиме CI. При этом часть тестов, таких как "hooks", "nwfilter", "qemu" и "selinux", пока не запускаются, поскольку либо не поддерживаются гипервизором Bhyve, либо не релевантны среде FreeBSD.
Особенно перспективно рассматривается возможность в будущем добавить поддержку nwfilter - системы фильтрации сетевых пакетов. На данный момент также не планируется активно поддерживать QEMU на FreeBSD, поскольку Bhyve является нативным и основным гипервизором платформы, хотя технически поддержка vmm(4) для QEMU существует, что оставляет возможность для расширения функционала. Отдельным вызовом стала настройка Jenkins - одной из самых популярных систем автоматизации CI/CD. Несмотря на нехватку опыта в конфигурировании этой системы, удалось построить работающую "конвейерную" цепочку из двух основных этапов. Первый заключается в сборке "-devel" версии порта Libvirt, бранируемого из Git-репозитория через утилиту poudriere и публикации сборки в пакетный репозиторий.
Второй шаг включает разворачивание контейнера BastilleBSD, установку собранных пакетов, загрузку репозитория Libvirt TCK и запуск тестов с последующей публикацией результатов. Использование плагина Job DSL позволило хранить конфигурацию задач Jenkins в Git, что повышает прозрачность и управляемость инфраструктуры. Тем не менее, остаются важные направления для улучшения. Одним из них является возможность собирать произвольные Git-версии порта без необходимости явного изменения версий и контрольных сумм в Makefile и distinfo. Такой подход значительно упростит экспериментальную проверку изменений и позволит вести более гибкие тесты.
Также интересна перспектива хранить не только конфигурацию заданий Jenkins, но и всю конфигурацию системы автоматизации в виде кода, что сократит ручную настройку и улучшит воспроизводимость. Не менее важным остается полная автоматизация процесса создания тестовых образов, избавляющая от необходимости "ручной" подготовки образов virt-builder. Подводя итоги, интеграция CI для Libvirt с Bhyve на FreeBSD открывает важные возможности для стабильного и качественного развития виртуализации в этой операционной системе. Благодаря системному подходу, использованию существующих тестов Libvirt TCK, а также тщательной адаптации под особенности FreeBSD и Bhyve, был создан фундамент для дальнейшего наращивания функциональности и улучшения качества. Разработка и внедрение CI позволят своевременно выявлять ошибки и фиксить их еще до выхода новых релизов, что положительно скажется на опыте пользователей и администраторов FreeBSD-систем.
Перспективы включают расширение покрытия тестов, автоматизацию процессов, а также потенциальное добавление поддержки новых функций в Libvirt и Bhyve. В итоге, данный проект является блестящим примером успешного open source сотрудничества и внесения значимого вклада в экосистему FreeBSD и виртуализации в целом. .