Хулио Мерино. Знакомство с sysbuild для NetBSD, 2012

Система сборки NetBSD почти совершенна: после получения исходных текстов из CVS на практический любой Unix-образной операционной системе достаточно запустить скрипт build.sh с правильными аргументами, чтобы собрать полный релиз NetBSD для любой поддерживаемой платформы.

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

Любой пользователь, знакомый с NetBSD, легко справится с каждой из перечисленных задач. Но делать всё это вручную быстро надоедает. А ведь машины и предназначены для того, чтобы сделать жизнь проще, не так ли? Конечно я не единственный, у кого есть собственные скрипты-обёртки для build.sh. Я понимаю, что они сделаны на скорую руку, уродливы и не пригодны для повторного использования. (Я также понимаю, что новичкам в NetBSD описанное выше не кажется простым, но речь сейчас не об этом.)

В итоге я написал скрипт, который автоматизирует все упомянутые выше этапы. Этот скрипт управляется файлами конфигурации, в которых указаны нужные действия. Представляю sysbuild.

Моя конфигурация

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

Для разработки я пользуюсь копией исходных текстов, которая находится в моём домашнем каталоге и доступна для редактирования. Кроме этого в домашнем каталоге есть скрипт, который обновляет исходные тексты и пересобирает NetBSD для компьютера этого типа, используя известную структуру каталогов в моём домашнем каталоге.

В каталоге /usr/src находится копия исходных текстов, полученная анонимно с CVS и доступная только для чтения. Эта копия используется выделенным пользователем "builder", который производит пересборку NetBSD. У пользователя "builder" также есть свой скрипт (отличающийся от предыдущего!), который обновляет /usr/src, пересобирает NetBSD для компьютеров нужного мне типа, записывает полные журналы в файлы и помещает результаты сборки в каталог, доступный по сети. Наконец, у выделенного пользователя "builder" есть задача в cron, которая выполняет все описанные действия каждую ночь.

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

К несчастью, мне стало не хватать места на виртуальной машине, которую я использую для разработки. Для решения проблемы я решил настроить виртуальную машину с нуля. Мысль о необходимости ручной настройки всей этой схемы привела меня к созданию sysbuild.

Приступим

sysbuild находится в pkgsrc, в каталоге pkgsrc/sysutils/sysbuild. Этот пакет содержит основной скрипт, тесты, пример файлов конфигурации и обширную страницу руководства. Скрипт устанавливается так же просто, как любой другой пакет, и я рекомендую сразу же ознакомиться с его документацией.

Установленный sysbuild уже готов к использованию "из коробки" при наличии права на запись в каталог /usr/src. Достаточно запустить команду sysbuild build, находясь в любом каталоге, чтобы обновить дерево исходных текстов и собрать релиз для текущей платформы.

Если нужно изменить настройки sysbuild, скопируйте файл /usr/pkg/etc/sysbuild/default.conf в ~/.sysbuild/default.conf и отредактируйте его. Утилита возьмёт настройки из этого файла при следующем запуске. И конечно, можно создать несколько конфигураций для разных сборок (например, для -current и 6.x).

Настройка ежедневной задачи в cron

Пакет pkgsrc/sysutils/sysbuild-user - это удобная обёртка, управляющая непривилегированным пользователем "sysbuild" и устанавливающая пример задачи crontab для выполнения периодической пересборки NetBSD. Эта задача использует скрипт sysbuild4cron, который просто запускает утилиту sysbuild, сохраняет её вывод в файл и отправляет отчёт об ошибке каждый раз, когда задача завершается неудачно.

При установке пакета будет создан пользователь "sysbuild" и настроена задача в cron. Чтобы настроить пользователя или задачу, воспользуйтесь инструкциям из файла MESSAGE пакета.

Остальная мелочь

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

Возможно вы заметили, что sysbuild имеет версию 2.0, а не 1.0. Когда я готовил скрипт к включению в pkgsrc, cvs вывел сообщение, что я пытаюсь снова добавить ранее удалённые файлы. Хм, вот это сюрприз! Прочитав журнал CVS изменений файла Makefile пакета, я обнаружил, что 10 лет назад я уже написал точно такой же скрипт и что через два года он был удалён, потому что перестал работать. Я совершенно забыл об этом! Однако, глядя на грязный код pkg_comp (который был написан почти в то же время), я решил, что предыдущая реализация этой идеи была неряшливой и поэтому не рискнул заглядывать в код предыдущей версии.

Приятного пользования!

Автор перевода на русский язык: Владимир Ступин