Как собирать и развертывать пакеты для ваших серверов FreeBSD, используя Buildbot и Poudriere

Автор выбрал Free и Open Source Fund, чтобы получить пожертвование как часть Write for DOnations program.

Вступление

Https://www.freebsd.org/ports/[FreeBSD ports and package collection], далее называемая ports tree, является системой сборки FreeBSD для внешнего программного обеспечения. Он предлагает Makefile- основанный, согласованный способ построения пакетов. Port ссылается на рецепт сборки, то есть Makefile и связанные файлы; в то время как package является выходом построения одного порта в двоичный (сжатый) архив файлов пакета и его метаинформации.

Собрать и установить подмножество или все более 30 000 портов вручную можно с помощью + make install +. Однако сборки будут выполняться на одном из ваших серверов, а не в чистой среде. В производственных случаях ручная сборка также будет означать, что каждому узлу требуется одна и та же версия дерева портов, и ему необходимо скомпилировать все пакеты для себя. Это означает повторную, подверженную ошибкам работу людей и серверов. Предпочтительно извлекать и использовать идентичные предварительно созданные двоичные пакеты на каждом хосте и обслуживать их из центрального безопасного хранилища пакетов.

Для этого Poudriere - это стандартный инструмент FreeBSD для сборки, тестирования и аудита пакетов, а также для поддержки репозиториев пакетов. Каждая сборка запускается изолированно в новой https://www.digitalocean.com/community/tutorials/how-to-install-buildbot-freebsd#step-1-%E2%80%93-setting-up-jails-for -the-buildbot-master-and-worker [jail], запустив нужную версию FreeBSD и запустив ее без установленных пакетов. Только базовая система плюс любые явно указанные зависимости доступны для чистой сборки. Poudriere заботится о перекомпоновке пакетов, когда это необходимо, а также об обновлении хранилища пакетов после завершения сборки. Инструмент командной строки + poudriere + является центральным для администрирования различных деревьев портов, версий FreeBSD, параметров сборки портов и, наконец, для запуска сборок.

В этом руководстве вы сконфигурируете Poudriere, создадите набор требуемых пакетов, настроите хостинг пакетов на основе HTTP и автоматизируете сборку, используя Buildbot в качестве платформы непрерывной интеграции. Наконец, вы получите безопасный доступ к пакетам с клиентского компьютера.

Предпосылки

Прежде чем начать это руководство, вам понадобится:

  • Сервер под управлением FreeBSD 11.2. Если вы новичок в работе с FreeBSD, вам может быть полезно настроить этот сервер, следуя нашему руководству на https://www.digitalocean.com/community/tutorials/how-to-get-started-with-freebsd [ Как начать работать с FreeBSD.

  • Примечание: * FreeBSD 12.0 в настоящее время имеет issue with nested jails, который сначала необходимо исправить, прежде чем 12.x можно будет использовать для этого руководство.

  • 10 ГБ свободного дискового пространства или более, чтобы иметь достаточно места для хранения пакетов и журналов.

  • Базовая настройка Buildbot, выполнив учебник Hews Настройка Buildbot на FreeBSD.

  • Другой сервер, на котором работает FreeBSD, той же версии, которую вы собираетесь использовать в качестве клиента для извлечения и установки пакетов, которые вы собираетесь автоматически собирать и размещать в репозитории пакетов на основе HTTP / HTTPS.

Шаг 1 - Установка Poudriere для использования в Buildbot Worker

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

Подключитесь к вашему серверу, на котором размещен Buildbot, и откройте оболочку * root * в рабочей тюрьме с помощью следующей команды:

sudo jexec buildbot-worker0 csh

Установите Poudriere как пакет:

pkg install poudriere

Затем подтвердите установку, нажав + y +, а затем + ENTER +.

Вы успешно установили последнюю версию инструмента Poudriere и зависимостей. На следующих нескольких шагах вы пройдете подготовку к настройке Poudriere.

Шаг 2 - Создание ключа подписи пакета (необязательно)

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

Пакеты по умолчанию создаются как файлы + .txz +, которые являются сильно сжатыми архивами содержимого пакета. Контрольные суммы сжатых файлов вместе с передачей файлов через HTTP / HTTPS (контрольные суммы TCP) уже обеспечивают некоторую защиту от поврежденных данных. Содержимое пакета обычно включает в себя файлы и каталоги, а также метаинформацию, такую ​​как имя пакета, версия и другие параметры. Файлы могут даже включать setuid-able (как видно из пакета + sudo +, хотя sudo не встроен во FreeBSD), и Сценарии во время установки запускаются от имени пользователя * root *. Поэтому установка из непроверенных источников создает угрозу безопасности.

Служа пакетам по HTTPS, вы не можете определить, не вмешался ли кто-либо в пакеты на диске. Целостность и подлинность ваших пакетов можно добавить, настроив Poudriere для подписи хранилища пакетов с помощью закрытого ключа RSA. Таким образом, подписанные дайджесты и соответствующий открытый ключ хранятся в файле + digests.txz + `хранилища пакетов. Требуемая пара ключей (закрытый и открытый ключи RSA) может оставаться неизменной в течение длительного времени, если закрытый ключ не был потерян или скомпрометирован.

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

Убедитесь, что вы все еще находитесь в рабочей оболочке * root *.

Создайте новый закрытый ключ RSA:

openssl genrsa -out /usr/local/etc/poudriere.key 4096

Файл закрытого ключа должен быть доступен только пользователю root, который запускает Poudriere. Защитите свои права доступа:

chmod 0600 /usr/local/etc/poudriere.key

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

openssl rsa -in /usr/local/etc/poudriere.key -pubout -out /tmp/poudriere.pub

Наконец, загрузите файл открытого ключа со своего компьютера:

scp :/usr/jails/buildbot-worker0/tmp/poudriere.pub /tmp/poudriere.pub

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

Далее следует еще один необязательный шаг: если вы используете файловую систему ZFS, Poudriere может использовать ее для ускорения сборок. В противном случае вы можете перейти на https://www.digitalocean.com/community/tutorials/how-to-build-and-deploy-packages-for-your-freebsd-servers-using-buildbot-and-poudriere#step- 4-% E2% 80% 94-configuring-poudriere, -the-build-jail, -and-the-ports-tree [Шаг 4] для настройки Poudriere для подготовки к запуску первой сборки.

Шаг 3 - Настройка ZFS (необязательно)

Этот шаг применяется только в том случае, если вы запускаете систему FreeBSD поверх файловой системы ZFS. Например, если вы используете дроплет DigitalOcean, изображение помечено * x64 zfs * (для FreeBSD). На этом этапе вы создадите файловые системы, которые Poudriere сможет использовать для более быстрого создания и управления тюрьмами, что потенциально ускоряет ваши сборки.

Вы можете узнать, используете ли вы ZFS, перечислив пулы. Убедитесь, что вы находитесь в оболочке сервера, а не в тюрьме.

exit

Запустите следующую команду, чтобы получить список zpools:

sudo zpool list

Если какой-либо пул доступен, он напечатает информацию о нем:

OutputNAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zroot   148G  94.4G  54.1G        -         -    66%    63%  1.00x  ONLINE  -

В противном случае, если поддержка ZFS недоступна, инструмент выведет «+ нет доступных пулов », или « не удалось инициализировать библиотеку ZFS +». Это означает, что ни одна из вашей системы не использует ZFS; в этом случае перейдите к следующему шагу. Если вы решили использовать другой диск или тип хранилища, например файловую систему UFS, вы также можете перейти к следующему шагу.

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

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

Чтобы Poudriere использовал ZFS, вам нужно сделать три вещи: создать родительский набор данных ZFS, разрешить создание и удаление наборов данных ZFS (чего по умолчанию не может сделать рабочая тюрьма Buildbot или любая другая тюрьма) и отредактировать Конфигурация Poudriere соответственно.

В этом учебном курсе вы настроили рабочую тюрьму Buildbot в + / etc / jail.buildbot-worker0.conf +. Откройте этот файл в предпочитаемом вами текстовом редакторе и добавьте следующие выделенные строки, чтобы делегировать родительский набор данных, чтобы позволить тюрьме администрировать наборы данных ZFS под родительским. Не забудьте заменить + zroot + на желаемое имя пула:

sudo ee /etc/jail.buildbot-worker0.conf

/etc/jail.buildbot-worker0.conf

buildbot-worker0 {
   host.hostname = buildbot-worker0.localdomain;
   ip4.addr = "lo1|10.0.0.3/24";
   path = "/usr/jails/buildbot-worker0";
   exec.start = "/bin/sh /etc/rc";
   exec.stop = "/bin/sh /etc/rc.shutdown";
   mount.devfs; # need /dev/*random for Python
   persist;


}

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

После добавления этого содержимого сохраните и выйдите из редактора. Если вы используете + ee +, сделайте это, нажав + CTRL + C +, набрав + exit + и нажав + ENTER +.

Создайте родительский набор данных ZFS, указанный в файле конфигурации:

sudo zfs create zroot/pdr
sudo zfs create zroot/pdr/w0

Это преднамеренно предполагает, что вы, возможно, захотите добавить больше работников в будущем, и поэтому создает поднабор данных для вашего первого работника. Имя набора данных специально короткое, поскольку в старых версиях FreeBSD (до 12.0) ограничение имени монтирования составляло 88 символов.

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

sudo zfs set jailed=on zroot/pdr/w0

Теперь, когда выполнены предварительные условия, тюрьма будет правильно запускаться с новой конфигурацией:

sudo service jail restart buildbot-worker0

С помощью этих инструкций вы успешно создали необходимые наборы данных файловых систем ZFS и позволили тюрьме управлять родительским набором данных. На следующем шаге вы сконфигурируете Poudriere, который включает в себя указание выбранного zpool и набора данных, используемых для хранения данных, связанных со сборкой.

Шаг 4 - Настройка Poudriere, тюрьмы сборки и дерева портов

До этого момента вы устанавливали Poudriere и опционально покрывали требования для подписи пакетов и ZFS. Чтобы Poudriere мог работать «в тюрьме», то есть правильно функционировать в рабочей тюрьме Buildbot, необходимо предоставить определенные разрешения для тюрьмы. Например, если вы используете ZFS, вы уже делегировали родительский набор данных для использования и администрирования тюрьмой.

Давайте сначала настроим петлевой IP-адрес и все разрешения, а затем перейдем к соответствующему значению после изменений.

Poudriere хочет запустить две сборки на одну сборку: одну с петлевой связью и одну с доступом в интернет. Только этапы сборки, которые должны достичь Интернета, будут использовать последние. Например, + fetch + может загружать исходные архивы, но на этапе + build + доступ в Интернет запрещен. Существующая конфигурация рабочей тюрьмы имеет + ip4.addr =" lo1 | 10.0.0.3/24 "+, которая разрешает доступ в Интернет. Чтобы позволить Poudriere назначить адрес обратной связи для только что начавшихся сборок, IP-адрес также должен быть передан его родителю (рабочей тюрьме). Чтобы это работало, убедитесь, что вы применили последнюю версию файла конфигурации брандмауэра + / usr / local / etc / ipfw.rules + из обязательного руководства, которое заблокирует интерфейс обратной связи + lo0 + от открытия исходящих соединений через NAT.

Добавьте выделенные строки в конфигурацию вашей рабочей тюрьмы:

sudo ee /etc/jail.buildbot-worker0.conf

/etc/jail.buildbot-worker0.conf

buildbot-worker0 {
   host.hostname = buildbot-worker0.localdomain;
   ip4.addr = "lo1|10.0.0.3/24";

   path = "/usr/jails/buildbot-worker0";
   exec.start = "/bin/sh /etc/rc";
   exec.stop = "/bin/sh /etc/rc.shutdown";
   mount.devfs; # need /dev/*random for Python
   persist;

   # If you followed the ZFS setup step, you have this line
   # already (keep it). For non-ZFS setup, this line must be absent.
   exec.poststart = "/sbin/zfs jail buildbot-worker0 zroot/pdr/w0";













}

Здесь вы добавили следующее (также см. Страницу jail(8)):

  • + ip4.addr + =" lo0 | 127.0.0.3 "+ добавляет другой адрес IPv4 в тюрьму. Позже вы сконфигурируете переменную Poudriere + LOIP4 +, чтобы назначить этот петлевой адрес для создания джейлов, которые не должны общаться с Интернетом или другими компьютерами в вашей сети, например, во время фазы + build . Если у вас когда-либо есть сборка, для которой требуется доступ к Интернету во время сборки, Poudriere поддерживает переменную ` ALLOW_NETWORKING_PACKAGES ` в качестве обходного пути. Тем не менее, желательно следовать рекомендациям и выполнять загрузки, а также выполнять другие задачи, связанные с Интернетом, на этапе ` fetch +`, для которого Poudriere разрешает доступ в Интернет.

  • + allow.chflags + позволяет Poudriere отображать определенные системные файлы, такие как + / bin / sh +, неизменными в сборочной тюрьме.

  • + allow.mount + и другие параметры + allow.mount. * + позволяют Poudriere монтировать определенные требуемые файловые системы в сборки.

  • + allow.raw_sockets +, который разрешает использование необработанных сокетов, и + allow.socket_af +, который разрешает использование любого семейства адресов сокетов, оба применяются к сборочным сетям с поддержкой Интернета. Это полезно для того, чтобы вы могли запускать такие инструменты, как + ping + в интерактивном режиме, например, при входе в сборочную тюрьму для устранения проблем.

  • + allow.sysvipc + устарел в пользу трех отдельных настроек + sysvmsg + / + sysvsem + / + sysvshm +, чтобы ограничить тюрьмы, чтобы они могли видеть только свои собственные объекты общей памяти (через примитивы IPS “SYS V”). Однако Poudriere может только передавать + allow.sysvipc + для создания джейлов, потому что он не может прочитать соответствующую информацию sysctl для трех отдельных параметров (начиная с FreeBSD 11.2). При такой устаревшей конфигурации тюрьма может считывать общую память процессов за пределами тюрьмы. Это относится только к определенному программному обеспечению, которое зависит от функций IPC, таких как PostgreSQL, поэтому шансы на его влияние на безопасность невелики. Вы можете удалить эту конфигурацию, если вы не зависите от порта, который требует ее во время сборки.

  • + children.max = 16 + позволяет использовать 16 рабочих мест ниже рабочей тюрьмы. Вы можете увеличить это число позже, если у вас много процессоров, и Poudriere пытается создать больше сборок, чем разрешено. Каждая сборка Poudriere будет пытаться создать эталонную тюрьму и две сборки сборки на «задание», и по умолчанию используется количество процессоров (как вывод + sysctl -n hw.ncpu +) в качестве количества заданий.

  • + принудительное_статирование = 1 + требуется вместе с + allow.mount + для монтирования определенных файловых систем.

Сохраните и выйдите из файла конфигурации.

Перезапустите тюрьму, чтобы ее конфигурация вступила в силу немедленно:

sudo service jail restart buildbot-worker0

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

sudo sysrc -f /boot/loader.conf nullfs_load=YES
sudo kldload -n nullfs
sudo sysrc -f /boot/loader.conf tmpfs_load=YES
sudo kldload -n tmpfs

Вы уже установили пакет Poudriere ранее, который скопировал файл примера + / usr / local / etc / poudriere.conf.sample + в + / usr / local / etc / poudriere.conf +. Далее вы внесете изменения в файл конфигурации. Все возможные переменные конфигурации уже существуют в образце, поэтому раскомментируйте или измените соответствующую строку в файле, чтобы установить для переменной определенное значение.

Для следующих команд убедитесь, что вы все еще находитесь в оболочке * root * в рабочей тюрьме:

sudo jexec buildbot-worker0 csh

Откройте файл с помощью следующей команды:

ee /usr/local/etc/poudriere.conf

Если вы решили использовать ZFS, пожалуйста, заполните желаемый набор данных zpool и parent:

/usr/local/etc/poudriere.conf (фрагмент)

. . .
# Poudriere can optionally use ZFS for its ports/jail storage. For
# ZFS define ZPOOL, otherwise set NO_ZFS=yes
#
#### ZFS
# The pool where poudriere will create all the filesystems it needs
# poudriere will use ${ZPOOL}/${ZROOTFS} as its root
#
# You need at least 7GB of free space in this pool to have a working
# poudriere.
#


### NO ZFS
# To not use ZFS, define NO_ZFS=yes


# root of the poudriere zfs filesystem, by default /poudriere

. . .

В противном случае, если вы решили отказаться от ZFS, отключите поддержку ZFS:

/usr/local/etc/poudriere.conf (фрагмент)

. . .
# Poudriere can optionally use ZFS for its ports/jail storage. For
# ZFS define ZPOOL, otherwise set NO_ZFS=yes
#
#### ZFS
# The pool where poudriere will create all the filesystems it needs
# poudriere will use ${ZPOOL}/${ZROOTFS} as its root
#
# You need at least 7GB of free space in this pool to have a working
# poudriere.
#
#ZPOOL=zroot

### NO ZFS
# To not use ZFS, define NO_ZFS=yes


# root of the poudriere zfs filesystem, by default /poudriere
# ZROOTFS=/poudriere
. . .

Позже вы проинструктируете Poudriere загрузить базовую систему FreeBSD и тем самым запустить первую сборку. Для этого необходимо указать хост загрузки, добавьте следующую выделенную строку:

/usr/local/etc/poudriere.conf (фрагмент)

. . .
# the host where to download sets for the jails setup
# You can specify here a host or an IP
# replace _PROTO_ by http or ftp
# replace _CHANGE_THIS_ by the hostname of the mirrors where you want to fetch
# by default: ftp://ftp.freebsd.org
#
# Also note that every protocols supported by fetch(1) are supported here, even
# file:///
# Suggested: https://download.FreeBSD.org

Поскольку Poudriere будет работать в тюрьме, ограничение имени монтирования в 88 символов версий FreeBSD до 12.0 особенно вредно, так как полный путь к jail + / usr / jails / buildbot-worker0 + является частью каждого пути монтирования. Превышение лимита может привести к поломке сборок, поэтому давайте позаботимся о том, чтобы уменьшить длину пути. Вместо типичного каталога + / usr / local / poudriere + вы можете использовать + / pdr + следующим образом:

/usr/local/etc/poudriere.conf (фрагмент)

. . .
# The directory where poudriere will store jails and ports

Теперь создайте этот каталог:

mkdir /pdr

Снова переключитесь на ваш редактор + poudriere.conf +:

ee /usr/local/etc/poudriere.conf

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

/usr/local/etc/poudriere.conf (фрагмент)

. . .
# If set the given directory will be used for the distfiles
# This allows to share the distfiles between jails and ports tree
# If this is "no", poudriere must be supplied a ports tree that already has
# the required distfiles.

Теперь создайте этот каталог:

mkdir -p /usr/ports/distfiles

Если вы выполнили шаг 2 и создали ключ подписи репозитория пакетов, войдите в редактор еще раз и укажите его:

ee /usr/local/etc/poudriere.conf

/usr/local/etc/poudriere.conf (фрагмент)

. . .
# Path to the RSA key to sign the PKG repo with. See pkg-repo(8)

Сборки будут выполняться намного быстрее, если вы кешируете выходные данные компилятора и компоновщика C / C ++ в следующий раз. Дерево портов поддерживает это напрямую, используя инструмент ccache. Пожалуйста, включите его и создайте соответствующий каталог кеша, если вы можете сэкономить как минимум на 5 ГБ больше места (размер кеша по умолчанию):

/usr/local/etc/poudriere.conf (фрагмент)

. . .
# ccache support. Supply the path to your ccache cache directory.
# It will be mounted into the jail and be shared among all jails.
# It is recommended that extra ccache configuration be done with
# ccache -o rather than from the environment.
mkdir /var/cache/ccache

Сборка и запуск программного обеспечения Linux встречаются редко, поэтому отключайте его до тех пор, пока это не понадобится:

ee /usr/local/etc/poudriere.conf

/usr/local/etc/poudriere.conf (фрагмент)

. . .
# Disable linux support

Тюрьмы должны получить адрес обратной связи, или Poudriere предупредит об этом. Мы можем унаследовать IP-адрес тюрьмы, потому что он находится на сетевом интерфейсе только с обратной связью (+ lo1 +). Для этого, пожалуйста, добавьте следующую строку в конец файла конфигурации:

/usr/local/etc/poudriere.conf (фрагмент)

Сохраните и выйдите из файла конфигурации.

Для рабочих сборок нам понадобятся еще два ресурса: базовая система FreeBSD для использования в качестве шаблона сборки и обновленное дерево портов. Выберите версию FreeBSD, на которую вы нацелены. В этом уроке мы расскажем Poudriere о загрузке FreeBSD для архитектуры. Вы можете назвать тюрьму так, как вам нравится, но рекомендуется использовать согласованную схему именования, например + 112amd64 +. Также имейте в виду выбор между ежеквартальными, стабильными ветвями дерева портов (здесь мы используем + 2019Q2 +) и ветвью «переднего края», которая может привести к сбою сборок после обновлений время от времени. Версии FreeBSD, более новые, чем на сервере, нельзя использовать в сборочной тюрьме.

Скачайте и создайте джейл сборки:

poudriere jail -c -j  -v  -a

Наконец, давайте загрузим дерево портов. По умолчанию используется метод загрузки portsnap, который использует сжатые снимки дерева без информации истории. Либо Subversion, либо Git предпочтительнее, чтобы объединить вышестоящие изменения или внести свой вклад обратно. Это также важно, если вы хотите использовать свое собственное дерево в системе контроля версий. В следующей команде, пожалуйста, укажите текущий год и квартал.

Если вы хотите начать с восходящего потока, официальное дерево портов:

poudriere ports -c -p  -m  -B

Метод + svn + https + будет синхронизироваться с хостом FreeBSD Subversion (view[able здесь здесь). Если вы планируете использовать альтернативный источник, прочитайте следующее примечание, в противном случае пропустите его.

Доступные деревья могут быть перечислены с помощью + poudriere ports -l +, который выводит список вроде:

OutputPORTSTREE METHOD    TIMESTAMP           PATH
2019Q2    svn+https 2019-04-20 19:23:19 /pdr/ports/2019Q2

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

Шаг 5 - Запуск тестовой сборки вручную

Вы можете использовать команду + poudriere bulk + для создания одного или нескольких пакетов и всех их зависимостей. После первой сборки пакета Poudriere также автоматически определяет необходимость перестройки или иным образом оставляет файл существующего пакета без изменений. В то время как подкоманда + bulk + только собирает пакеты, запуск сборки с использованием + poudriere testport + также будет проверять указанные порты с использованием определения «testing», приведенного в Makefile порта. В рамках этой статьи мы заинтересованы только в предоставлении пакетов для установки на клиентах, поэтому мы используем массовые сборки.

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

Запустите сборку, заполнив местозаполнители именем сборки и именем дерева портов, которое вы выбрали ранее:

poudriere bulk -j  -p  ports-mgmt/pkg

Это создает порт + ports-mgmt / pkg +. Порты в официальном дереве хранятся в иерархии + <category> / <name> +, и эти пути (называемые package origin) используются для указания Poudriere, какие пакеты должны быть собраны. Для начала мы решили построить только менеджер пакетов pkg, который не имеет никаких сторонних зависимостей и поэтому является хорошей, быстрой проверкой конфигурации. Если все работает нормально, вы увидите вывод:

Output[00:00:00] Creating the reference jail... done
[00:00:06] Mounting system devices for 112amd64-2019Q2
[00:00:06] Mounting ports/packages/distfiles
[00:00:06] Using packages from previously failed build
[00:00:06] Mounting ccache from: /var/cache/ccache
[00:00:06] Mounting packages from:
/etc/resolv.conf -> /pdr/data/.m/112amd64-2019Q2/ref/etc/resolv.conf
[00:00:06] Starting jail 112amd64-2019Q2
[00:00:07] Logs:
[00:00:07] Loading MOVED for /pdr/data/.m/112amd64-2019Q2/ref/usr/ports
[00:00:08] Ports supports: FLAVORS SELECTED_OPTIONS
[00:00:08] Gathering ports metadata
[00:00:08] Calculating ports order and dependencies
[00:00:08] pkg package missing, skipping sanity
[00:00:08] Skipping incremental rebuild and repository sanity checks
[00:00:08] Cleaning the build queue
[00:00:08] Sanity checking build queue
[00:00:08] Processing PRIORITY_BOOST
[00:00:08] Balancing pool
[00:00:08] Recording filesystem state for prepkg... done
[00:00:08] Building 1 packages using 1 builders
[00:00:08] Starting/Cloning builders
[00:00:14] Hit CTRL+t at any time to see build progress and stats
[00:00:14] [01] [00:00:00] Building ports-mgmt/pkg | pkg-1.10.5_5
[00:03:24] [01] [00:03:10] Finished ports-mgmt/pkg | pkg-1.10.5_5:
[00:03:25] Stopping 1 builders
[00:03:25] Creating pkg repository
Creating repository in /tmp/packages: 100%
Packing files for repository: 100%
[00:03:25] Committing packages to repository
[00:03:25] Removing old packages
[00:03:25] Built ports: ports-mgmt/pkg
[112amd64-2019Q2] [2019-04-20_19h35m00s] [committing:]   Tobuild: 0   Time: 00:03:18
[00:03:25] Logs: /pdr/data/logs/bulk/112amd64-2019Q2/2019-04-20_19h35m00s
[00:03:25] Cleaning up
[00:03:25] Unmounting file systems

Эти выходные данные показывают, куда пакеты пойдут после сборки, и откуда берутся существующие пакеты, если их не нужно перестраивать (здесь: + / pdr / data / packages / 112amd64-2019Q2 +). Кроме того, выходные данные показывают обзор запущенных сборок во время работы Poudriere (вы можете нажать + CTRL + T + в интерактивной оболочке, чтобы напечатать ход выполнения). В итоговом резюме вы увидите, что один пакет был собран. Вы можете просмотреть подробные результаты сборки в каталоге журнала (+ / pdr / data / logs / bulk / 112amd64-2019Q2 / * +).

Этот вывод подтверждает успешную сборку. Если Poudriere успешно собрал хотя бы один пакет, он автоматически зафиксирует его в хранилище пакетов. Это означает, что пакеты доступны только после завершения всех сборок, даже если другие пакеты не удалось собрать. Теперь у вас есть рабочий репозиторий пакетов по адресу + / pdr / data / packages / 112amd64-2019Q2 + внутри рабочей тюрьмы Buildbot.

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

Шаг 6 - Настройка Nginx для обслуживания веб-интерфейса Poudriere и хранилища пакетов

Poudriere предоставляет несколько выходных артефактов, которые мы хотим разместить с помощью веб-сервера:

  • * Репозитории пакетов * доступны для клиентов, чтобы они могли обращаться к ним с помощью обычных команд + pkg update + и + pkg install +, используя HTTPS или HTTP в качестве транспорта.

  • * Подробные журналы сборки * полезны для разработчиков для отладки проблемных сборок или для изучения результатов сборки. Они сохраняются для каждого пакета и для каждой сборки в выводе Poudriere из последнего шага. Вы видели, что журналы хранятся в одном каталоге для каждой сборки с меткой даты и времени.

  • * Встроенный веб-интерфейс Poudriere * - это небольшая отдельная HTML-страница для каждой сборки, которая использует WebSockets для регулярного обновления состояния, отображаемого на странице. Это полезно, чтобы получить более полное представление о том, как далеко сборка, какие зависимости вызвали сбой других сборок пакетов, и, наконец, в качестве замены для вывода командной строки, который показывает только сводку в конце, если вы специально не распечатаете ее. текущий прогресс сборки.

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

Пожалуйста, выйдите из оболочки тюрьмы, так как теперь вы собираетесь работать на сервере:

exit

Откройте редактор с конфигурацией Nginx + / usr / local / etc / nginx / nginx.conf +:

sudo ee /usr/local/etc/nginx/nginx.conf

Добавьте следующие местоположения внутри блока + server {+:

/usr/local/etc/nginx/nginx.conf

. . .
http {
   . . .
   server {
       . . .
       location / {
           root /usr/local/www/nginx;
           index index.html index.htm;
       }




















       location /buildbot/ {
           proxy_pass http://10.0.0.2:8010/;
       }

       . . .
   }
}
. . .

Сохраните и закройте файл конфигурации Nginx. Затем перезагрузите сервис Nginx:

sudo service nginx reload

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

  • Хранилище пакетов * находится ниже + http: /// packages / + (или + http: /// +). Вы найдете метаинформацию в корневом каталоге, например, + 112amd64-2019Q2 + и все встроенные пакеты в подкаталоге + All +:

изображение: https: //assets.digitalocean.com/articles/buildbot_poudriere/step6a.png [Список репозитория пакетов]

  • Подробные журналы сборки * и * встроенный веб-интерфейс Poudriere * можно найти ниже + http: /// logs / +. Щелкните по иерархии каталогов, чтобы получить доступ к данным вашей предыдущей сборки вручную. В этом примере вы можете получить URL-адрес, например + http: /// logs / 112amd64-2019Q2 / latest / build.html +.

изображение: https: //assets.digitalocean.com/articles/buildbot_poudriere/step6b.png [веб-интерфейс Poudriere]

Если вы не настроили доменное имя для своего сервера, вам нужно будет ввести публичный IP-адрес вашего сервера для этих примеров, например, + Http: /// журналы / +.

На этом завершаются все ручные настройки для получения рабочих сборок и просмотра выходных данных (пакетов и журналов). В дальнейшем вы будете автоматизировать сборки для достижения https://www.digitalocean.com/community/tutorials/an-introduction-to-continuous-integration-delivery-and-deployment ---- непрерывной интеграции].

Шаг 7 - Настройка Buildbot Builder для ваших пакетов

На этом этапе ваша цель состоит в том, чтобы автоматизировать массовую сборку пакетов, выполнив Poudriere так же, как вы уже вручную, добавив в существующий пример конфигурации Buildbot. К концу этого шага Buildbot будет запускать сборку пакета при каждом изменении выбранной ветви дерева портов. В примерах этого урока это будет ежеквартальная ветвь + 2019Q2 +.

Все необходимые изменения выполняются в основной конфигурации Buildbot, поэтому, пожалуйста, откройте оболочку * root * в главной тюрьме:

sudo jexec buildbot-master csh

Во-первых, необходимо определить builder, который описывает команды и действия, выполняемые для запуска сборки. В существующей конфигурации + / var / buildbot-master / master.cfg + вы найдете раздел + BUILDERS + - откройте редактор и * замените * весь раздел до начала следующего заголовка с +

Related