Как настроить Buildbot на FreeBSD

_Автор выбрал Open Internet / Free Speech Fund для получения пожертвования в рамках https://do.co/w4do-cta [Писать для DOnations] программа.

Вступление

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

  • * Источники изменений *: они обнаруживают изменения - такие как изменения в Git-репозитории - и уведомляют планировщики о них

  • * Планировщики *: планировщики запускают сборщики в соответствии с входящими изменениями

  • * Builders *: они содержат фактические этапы сборки, такие как компиляция программного проекта

  • * Репортеры *: репортеры используют результаты сборки для отправки сообщений об ошибках или других уведомлений

Buildbot функционирует как минимум через один Buildbot master, который запускает и проверяет все конфигурации сборки и другие параметры, а также раздает фактические сборки своим работникам. Кроме того, мастер предлагает субкомпонент пользовательского интерфейса на основе браузера, который, если он включен, используется для запуска или просмотра сборок и проверки отчетов о состоянии и других настроек. Есть также один или несколько Buildbot рабочих, которые подключаются к мастеру и получают команды, а именно для запуска сборок.

В этом руководстве вы будете использовать FreeBSD jail для установки и запуска каждого компонента Buildbot в отдельной изолированной среде. Затем вы будете обслуживать Buildbot с помощью веб-сервера Nginx и получать доступ к его веб-интерфейсу с помощью веб-браузера на локальном компьютере. После завершения этого руководства вы получите рабочую настройку с примером сборки проекта, готовую к расширению для вашего собственного CI или других вариантов использования.

Предпосылки

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

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

  • Nginx установлен на вашем сервере. Прочтите, как это настроить, следуя нашему руководству на How для установки Nginx на FreeBSD 11.2.

Если вы хотите разместить веб-интерфейс Buildbot с использованием безопасного HTTPS, вам также потребуется следующее:

  • Зарегистрированное доменное имя, которым вы владеете и контролируете. Если у вас еще нет зарегистрированного доменного имени, вы можете зарегистрировать его у одного из множества регистраторов доменных имен (например, Namecheap, GoDaddy и т. Д.).

  • DNS * A Record *, который указывает ваш домен на публичный IP-адрес вашего сервера. Это необходимо из-за того, что Let’s Encrypt проверяет, что вы являетесь владельцем домена, для которого выдается сертификат. Например, если вы хотите получить сертификат для + example.com +, этот домен должен разрешиться на ваш сервер, чтобы процесс проверки заработал. Вы можете следовать this Руководству по быстрому старту DNS для получения подробной информации о том, как добавить это. В этом уроке мы будем использовать + example.com + в качестве примера доменного имени.

  • Сертификат SSL / TLS для вашего домена. Следуйте How для защиты Nginx с помощью Let Encrypt on FreeBSD, чтобы настроить это.

Шаг 1 - Настройка джейлов для мастера и рабочего Buildbot

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

Подобно LXC, Docker и другим механизмам контейнеров, тюрьмы FreeBSD обеспечивают легкую изоляцию от хост-системы. Процессы, работающие внутри тюрьмы, могут получить доступ только к тем ресурсам, к которым тюрьме уже предоставлен доступ; в противном случае они ведут себя как любая другая среда FreeBSD. Jails используют одно и то же ядро, но обычно работают в файловой системе, имеющей копию базовой системы FreeBSD, которая может быть любой версией FreeBSD, совместимой с ядром хоста. Для большинства рабочих нагрузок различия в производительности между выполнением задачи на хосте и в тюрьме не заметны.

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

Во-первых, мы хотим создать отдельный сетевой интерфейс для системной тюрьмы. В тюрьмах ядро ​​перезаписывает сетевые соединения на первый адрес IPv4 / IPv6, назначенный тюрьме. Например, если первый назначенный IP-адрес является общедоступным, а служба в тюрьме прослушивает +127.0.0.1: 1234 +, порт + 1234 + будет общедоступным. Https://www.freebsd.org/doc/handbook/jails-ezjail.html[recommended практике] должен иметь отдельный сетевой интерфейс для тюрем. Мы будем следовать этой рекомендации cloning первичного петлевого интерфейса (+ lo0 +) в отдельный интерфейс (+ lo1 +). Мы будем использовать сеть + 10.0.0.0 / 24 +, но любая другая непересекающаяся сеть также будет работать.

Начните с настройки клонированного интерфейса, который будет создан при загрузке. Эта команда + sysrc + записывает правило в файл + / etc / rc.conf +, но не создает сам интерфейс:

sudo sysrc cloned_interfaces+=lo1

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

sudo service netif cloneup

Вы можете проверить состояние интерфейса и IP с:

ifconfig lo1
Outputlo1: flags=8008<,MULTICAST> metric 0 mtu 16384
   options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
   nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
   groups: lo

Вывод показывает, что интерфейс существует, но еще не имеет IP-адресов, перечисленных и подключенных к нему. Его флаг + LOOPBACK + означает, что этот интерфейс доступен только локально и не представляет фактическое аппаратное устройство.

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

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

Затем добавьте следующее содержимое в файл, который настроит главную тюрьму с именем + buildbot-master +:

/etc/jail.buildbot-master.conf

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

Этот код назначает фиксированное имя хоста и IP-адрес в сетевом интерфейсе тюрьмы + 10.0.0.2 + и указывает корневую файловую систему + / usr / jails / buildbot-master +. Используемые здесь значения + exec.start + и + exec.stop + объявляют, что службы + start + и + stop + тюрьмы будут вести себя как процессы загрузки и использовать сценарии запуска и завершения работы, которые находятся в + / etc / + `каталог. Опция `+ persist + позволяет джейлу продолжать работу, даже если все его процессы завершены.

Чтобы узнать больше о возможных настройках главной тюрьмы, посетите страницу jail(8).

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

Файл конфигурации для главной тюрьмы отделен от файла конфигурации глобальной тюрьмы + / etc / jail.conf +. Из-за этого вам нужно будет добавить имя главной тюрьмы в список известных:

sudo sysrc "jail_list+=buildbot-master"

Затем включите все джейлы, перечисленные в + jail_list +, для автоматического запуска при загрузке:

sudo sysrc jail_enable=YES

Если у вас уже есть джейлы в вашей системе, сконфигурированные с глобальным файлом + / etc / jail.conf +, но вы не использовали + jail_list + раньше, включение этого параметра будет означать, что только джейлы в + jail_list + будут автоматически -старт, и вы можете добавить свои существующие тюрьмы в список.

Далее мы создадим корневой каталог главной тюрьмы и распакуем систему FreeBSD.

Убедитесь, что корневой каталог файловой системы тюрьмы существует. Если вы выполнили команды ZFS в предыдущей заметке, то это уже сделано, и вы можете пропустить эту команду:

sudo mkdir -p /usr/jails/buildbot-master

Затем загрузите архив базовой системы FreeBSD 11.2. Сначала мы устанавливаем корневые сертификаты, чтобы доверять серверу загрузки:

sudo pkg install ca_root_nss

Эта команда предложит вам одобрить установку пакета + ca_root_nss +. Сделайте это, нажав + y +, а затем + ENTER +.

Далее скачиваем архив:

fetch -o /tmp/base.txz "https://download.freebsd.org/ftp/releases/amd64/11.2-RELEASE/base.txz"

Извлеките содержимое этого файла в качестве корневой файловой системы тюрьмы:

sudo tar -x -f /tmp/base.txz -C /usr/jails/buildbot-master

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

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;
}

Рассматривая эти строки, обратите внимание на то, что рабочая тюрьма отличается от имени хоста, IP-адреса и корневого каталога файловой системы от мастера. Сохраните и закройте этот файл.

Опять же, поскольку мы используем отдельный файл конфигурации тюрьмы вместо глобального + / etc / jail.conf +, добавьте имя в список известных тюрьм:

sudo sysrc "jail_list+=buildbot-worker0"

Извлеките уже загруженную базовую систему FreeBSD 11.2, как вы делали для мастера:

sudo mkdir /usr/jails/buildbot-worker0
sudo tar -x -f /tmp/base.txz -C /usr/jails/buildbot-worker0

На этом этапе обе тюрьмы настроены и содержат базовую систему FreeBSD без установки дополнительных пакетов. Давайте начнем тюрьмы:

sudo service jail start

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

jls

Это вернет вывод, подобный следующему, который показывает тюрьмы, в настоящее время работающие на вашем сервере:

Output   JID  IP Address      Hostname                      Path
    1  10.0.0.2        buildbot-master.localdomain   /usr/jails/buildbot-master
    2  10.0.0.3        buildbot-worker0.localdomain  /usr/jails/buildbot-worker0

Это подтверждает, что тюрьмы работают как положено. На данный момент, однако, у них нет доступа к Интернету, что означает, что вы не сможете установить в них пакеты Buildbot. Продолжайте чтение, чтобы решить эту проблему.

Шаг 2 - Настройка доступа в Интернет для тюрем

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

Чтобы решить эту проблему, скопируйте конфигурацию DNS-преобразователя хоста в обе тюрьмы:

sudo cp /etc/resolv.conf /usr/jails/buildbot-master/etc/resolv.conf
sudo cp /etc/resolv.conf /usr/jails/buildbot-worker0/etc/resolv.conf

Далее направляем исходящий интернет-трафик из тюрьмы. Для этого используйте IPFW - встроенный межсетевой экран FreeBSD - для настройки сетевых правил NAT (трансляция сетевых адресов). Когда вы выполните этот шаг, трафик, выходящий из тюрьмы, будет преобразован в общедоступный IP-адрес вашего хоста.

Если вы следовали Let’s Encrypt tutorial из предварительных условий, у вас уже будет настроен брандмауэр, разрешающий доступ к вашему веб сервер. В этом случае некоторые из приведенных ниже шагов будут излишними, но при их повторном выполнении не будет никакого вреда.

Включите предопределенные правила брандмауэра + workstation + в файл + rc.conf + с помощью следующей команды. Правила + workstation + защищают сервер, но по-прежнему допускают базовые сервисы, такие как пинг хоста или протокол динамической конфигурации хоста:

sudo sysrc firewall_type="workstation"

Затем разрешите доступ к портам веб-сервера из внешнего мира. Следующая команда разрешает трафик через порт + 22 + для SSH; порт + 80 +, позволяющий обслуживать Buildbot через HTTP; и порт + 443 +, позволяющий Buildbot обслуживаться по HTTPS. Если вы защитили свой сервер с помощью Let Encrypt, тогда все три из этих портов необходимы, но если вы не планируете и не планируете это делать, то можете исключить порт + 443 +:

sudo sysrc firewall_myservices="22/tcp 80/tcp 443/tcp"

Разрешите доступ с любого IP-адреса к портам, указанным в директиве + firewall_myservices +:

sudo sysrc firewall_allowservices="any"

Настройте брандмауэр для запуска при загрузке:

sudo sysrc firewall_enable=YES

Затем запустите брандмауэр с основными правилами. Следующая команда + nohup + предотвращает прерывание запуска брандмауэра, а также перенаправляет как + stderr +, так и + stdout + во временный файл журнала. Это важно, чтобы не оставлять правила брандмауэра в несогласованном состоянии, которое потенциально может сделать ваш удаленный хост недоступным по SSH:

sudo nohup service ipfw start >/tmp/ipfw.log 2>&1

Если вы используете оболочки + csh + или + tcsh +, это перенаправление вызовет перенаправление + Ambiguous output. + В вашем выводе. Если вы используете одну из этих оболочек, запустите + sudo nohup service ipfw start> & / tmp / ipfw.log + вместо этого, чтобы запустить + ipfw +:

В этот момент служба брандмауэра запустится и начнет защищать хост от подключений к незащищенным портам.

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

ifconfig

Эта команда может выводить пару разных интерфейсов. Тот, который используется хостом для подключения к Интернету, включает публичный IP-адрес вашего сервера. Чтобы проиллюстрировать, следующий пример вывода показывает, что + vtnet0 + - это сетевой интерфейс, используемый хостом:

Outputvtnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
   options=6c07bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
   ether 9a:3e:fa:2a:5f:56
   hwaddr 9a:3e:fa:2a:5f:56
   inet6 fe80::983e:faff:fe2a:5f56%vtnet0 prefixlen 64 scopeid 0x1
   inet  netmask 0xffffffc0 broadcast
   inet 10.10.0.23 netmask 0xffff0000 broadcast 10.10.255.255
   nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
   media: Ethernet 10Gbase-T <full-duplex>
   status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
   options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
   inet6 ::1 prefixlen 128
   inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
   inet 127.0.0.1 netmask 0xff000000
   nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
   groups: lo
lo1: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
   options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
   inet 10.0.0.2 netmask 0xffffff00
   inet 10.0.0.3 netmask 0xffffff00
   inet6 fe80::1%lo1 prefixlen 64 scopeid 0x3
   nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
   groups: lo

Запишите этот интерфейс, затем настройте его имя глобально:

sudo sysrc firewall_nat_interface=

Откройте новый файл сценария конфигурации брандмауэра:

sudo ee /usr/local/etc/ipfw.rules

Затем добавьте в файл следующее содержимое, определив правила брандмауэра для IPFW:

/usr/local/etc/ipfw.rules

#!/bin/sh
set -e

# Add basic rules as defined by firewall_type, firewall_myservices, etc.
. /etc/rc.firewall

# External network interface
ext_if="$firewall_nat_interface"

# The interface we chose for communication between jails
jail_if="lo1"

for interface in "$ext_if" "$jail_if"; do
   if [ -z "$interface" ]; then
       >&2 echo "Missing network interface"
       exit 1
   fi
   if ! ifconfig $interface >/dev/null 2>&1; then
       >2 echo "No such network interface: $interface"
       exit 1
   fi
done

ipfw nat 123 config if $ext_if
ipfw add 1 allow all from any to any via $jail_if
ipfw add 2 nat 123 ip4 from any to any in via $ext_if
ipfw add 501 skipto 20000 udp from any to any 53 out via $ext_if keep-state
ipfw add 502 skipto 20000 udp from any to any 67 out via $ext_if keep-state
ipfw add 503 skipto 20000 tcp from any to any out via $ext_if setup keep-state
ipfw add 504 skipto 20000 icmp from any to any out via $ext_if keep-state
ipfw add 19999 deny all from any to any
ipfw add 20000 nat 123 ip4 from any to any out via $ext_if
ipfw add 20001 allow ip from any to any

Вот что делает каждая часть скрипта:

  • +. / etc / rc.firewall + `включает в себя предопределенный сценарий системных правил IPFW, который добавляет основные правила в соответствии с вашей конфигурацией переменных + firewall _ * + в + / etc / rc.conf + `.

  • Следующий блок проверяет, все ли настроенные интерфейсы существуют. Это для вашей безопасности и закроет сценарий пораньше, если возникнет неправильная конфигурация.

  • Директивы, начинающиеся с + ipfw +, добавляют фактическую конфигурацию и правила брандмауэра. Каждое правило, добавляемое в строках, начинающихся с + ipfw add +, имеет номер. Брандмауэр использует эти числа для оценки правил в последовательном порядке.

  • + ipfw nat 123 config, если $ ext_if + создает средство NAT в ядре с идентификатором «123» для трансляции трафика с использованием общедоступного сетевого интерфейса.

  • + ipfw add 1 позволяет все от любого к любому через $ jail_if + разрешает весь трафик между тюрьмами. Обратите внимание, что если правило + allow + соответствует, обработка правила останавливается, и пакету разрешается проходить.

  • + ipfw добавляет 2 nat 123 ip4 из любого в любое через $ ext_if + переводит все входящие пакеты IPv4 на внешний интерфейс. Это необходимо в качестве дополнения к трансляции исходящих пакетов, как описано в объяснении + ipfw add 20000 …​ +.

  • + ipfw добавляет 501 skipto 20000 udp от любого к любому 53 с помощью $ ext_if keep-state + и следующие правила + skipto + определяют, какой исходящий трафик разрешить и рассмотреть для трансляции сетевых адресов. Если есть совпадение, обработка продолжается, переходя к правилу + 20000 +, которое выполняет NAT. Номер правила + 501 + преднамеренно следует за правилами петли по умолчанию, которые запрещают трафик из локальных сетей (+ 127.0.0.0 / 8 + и + :: 1 +), например +00300 deny ip от 127.0.0.0/8 до любого + `. Запустите `+ sudo ipfw list +, чтобы увидеть текущие действующие правила брандмауэра (но помните, что мы еще не применили вышеуказанные изменения).

  • За исключением правил + skipto +, существует преднамеренный разрыв между правилами + 2 + и + 19999 +, где скрипт + / etc / rc.firewall + вставляет определенные базовые правила. Если ни одно из вышеприведенных правил + skipto + не совпадает, основные правила позаботятся о том, чтобы разрешить различные типы трафика, включая петлю, входящие сообщения ICMP ping и порты, указанные в + firewall_myservices +.

  • + ipfw add 19999 deny all from any к любому + идет после всех основных правил и обеспечивает завершение обработки правил, не относящихся к NAT, по существу запрещая весь трафик, который не соответствовал предыдущему правилу + allow +.

  • + ipfw add 20000 nat 123 ip4 из любого в любой выход через $ ext_if + переводит адрес всех исходящих пакетов IPv4, оставленных на внешнем интерфейсе. Здесь вам нужен только IPv4, потому что в этом руководстве тюрьмам назначаются исключительно адреса IPv4.

  • + ipfw add 20001 разрешить ip от любого к любому + требуется, только если вы отключили однопроходный режим для правил + nat +, и в этом случае обработка будет продолжена после прохождения правила + 20000 +, требуя от вас явно разрешить эти пакеты с помощью отдельного правила. В стандартном однопроходном режиме брандмауэр остановит обработку по правилу + nat + и, следовательно, проигнорирует правило + 20001 +.

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

Поскольку мы хотим изменить предопределенные базовые правила брандмауэра с помощью правил, определенных в сценарии + ipfw.rules +, мы должны указать на этот сценарий в файле + rc.conf +. Следующая команда настроит скрипт для выполнения при запуске брандмауэра:

sudo sysrc firewall_script="/usr/local/etc/ipfw.rules"

Эта установка использует поддержку NAT в ядре IPFW, поэтому вы должны указать системе загружать соответствующий модуль ядра при загрузке. Кроме того, немедленно загрузите модуль без перезагрузки:

sudo sysrc -f /boot/loader.conf ipfw_nat_load=YES
sudo kldload ipfw_nat

Перезапустите брандмауэр, чтобы активировать скрипт расширенных правил брандмауэра:

sudo nohup service ipfw restart >/tmp/ipfw.log 2>&1

Опять же, если вы используете оболочку + csh + или одно из ее производных (например, + tcsh +), запустите + sudo nohup service ipfw restart> & / tmp / ipfw.lo + вместо предыдущей команды для перезапуска брандмауэр:

Убедитесь, что правила брандмауэра были загружены правильно:

cat /tmp/ipfw.log

Это перечисляет правила брандмауэра, сопровождаемые сообщением об успехе:

OutputFlushed all rules.
00100 allow ip from any to any via lo0
[...]
65500 deny ip from any to any
Firewall rules loaded.

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

sudo ipfw list
Output00001 allow ip from any to any via lo1
00002 nat 123 ip from any to any in via em0
[...]
65535 deny ip from any to any

С учетом всех правил брандмауэра ваши тюрьмы теперь имеют доступ к Интернету. Вы можете проверить, попытавшись загрузить веб-страницу из тюрьмы:

sudo jexec buildbot-master fetch -q -o- http://example.com/
Output<!doctype html>
<html>
<head>
   <title>Example Domain</title>
[...]

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

Шаг 3 - Установка и запуск мастера сборки Buildbot

Компоненты Buildbot разделены на несколько пакетов. Вам нужно только установить пакет + py36-buildbot + для запуска главного компонента, но в этом руководстве мы также рассмотрим, как установить пакет веб-интерфейса, + py36-buildbot-www +.

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

sudo jexec buildbot-master csh

Обратите внимание, что в этом руководстве командные блоки оболочки помечаются другим цветом, если они должны выполняться внутри оболочки Jail. Кроме того, в командной строке будет отображаться, под каким пользовательским профилем тюрьмы - либо * root *, либо непривилегированным * buildbot-master * user - эти команды должны выполняться.

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

pkg install py36-buildbot py36-buildbot-www

Если вы еще не установили или не использовали менеджер пакетов + pkg + в этой тюрьме, он предложит вам подтвердить, что вы разрешаете ему самозагрузиться. Для этого нажмите + y +, а затем + ENTER +. Затем подтвердите установку пакетов Buildbot, снова введя + y +.

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

pw useradd -n buildbot-master -m -w random

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

mkdir /var/buildbot-master

И передать право собственности пользователю сервиса:

chown buildbot-master:buildbot-master /var/buildbot-master

С этого момента все связанные с мастером настройки и изменения должны выполняться как непривилегированный пользователь, так как это поможет сохранить согласованность владения и разрешений.

Переключитесь на непривилегированного пользователя:

su -l buildbot-master

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

buildbot-3.6 create-master /var/buildbot-master

В отличие от других программ CI, таких как Jenkins, поведение Buildbot определяется непосредственно в его файле конфигурации, который интерпретируется с помощью Python. Это позволяет упростить управление версиями вашей конфигурации, в то время как использование языка сценариев дает свободу для написания пользовательских конфигураций сборки и расширения существующих функций Buildbot.

Пакет Buildbot поставляется с образцом основного файла конфигурации, который вы можете использовать в качестве шаблона для вашей собственной конфигурации. Скопируйте образец конфигурации и назовите его + master.cfg +:

cp /var/buildbot-master/master.cfg.sample /var/buildbot-master/master.cfg

Затем откройте файл базовой конфигурации в предпочитаемом вами текстовом редакторе. Здесь мы будем использовать + ee +:

ee /var/buildbot-master/master.cfg

Файл конфигурации содержит пароль, необходимый для подключения рабочих к мастеру. Замените по умолчанию + pass + на безопасный пароль по вашему выбору. Кроме того, имя нашего работника будет + worker0 +, поэтому также замените + example-worker + на + worker0 + в обоих разделах + WORKERS + и + BUILDERS +.

Когда закончите, части файла, которые вам нужно отредактировать, будут выглядеть так:

/var/buildbot-master/master.cfg

####### WORKERS

# ...
c['workers'] = [worker.Worker("", "")]
# ...

####### BUILDERS

# ...
c['builders'] = []
c['builders'].append(
   util.BuilderConfig(name="runtests",
     workernames=[""],
     factory=factory))
# ...

Сохраните и закройте этот файл, затем выполните команду + exit +, чтобы переключиться обратно на пользователя * root * в тюрьме:

exit

Поскольку пример конфигурации отслеживает Git-репозиторий + git: // github.com / buildbot / hello-world.git + в качестве источника изменений, вам также необходимо установить Git:

pkg install git-lite

После этого вы создали структуру и конфигурацию главного каталога, но служба еще не запущена. Чтобы запустить Buildbot вручную, можно запустить команду + buildbot start + из главного каталога, + / var / buildbot-master +. Однако это не заботится о запуске при загрузке или другой общесистемной конфигурации. Вместо этого мы будем использовать rc scripts, стандартный метод FreeBSD для запуска сервисов. В частности, мы сделаем это с помощью утилиты + service.

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

sysrc buildbot_basedir=/var/buildbot-master

Затем укажите, что служба должна работать под пользователем * buildbot-master *:

sysrc buildbot_user=buildbot-master

Затем включите службу для запуска при запуске:

sysrc buildbot_enable=YES

На момент написания в пакете + py36-buildbot + была ошибка, препятствующая запуску службы (см. Https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=227675[this отчет об ошибке]) , Пока это не исправлено, вам нужно будет вручную исправить скрипт запуска, выполнив следующую команду из вашей + buildbot-master + jail:

sed -i '' 's|command="/usr/local/bin/buildbot"|command="/usr/local/bin/buildbot-3.6"|' /usr/local/etc/rc.d/buildbot

Затем запустите сервис:

service buildbot start

Служба должна запускаться без ошибок. Вы можете проверить успех, просмотрев содержимое файла журнала:

tail /var/buildbot-master/twistd.log
Output2018-06-08 15:14:52+0000 [-] Starting BuildMaster -- buildbot.version: 0.9.11
2018-06-08 15:14:52+0000 [-] Loading configuration from '/var/buildbot-master/master.cfg'
[...]
2018-06-08 15:14:52+0000 [-] BuildMaster is running

Чтобы вернуться в оболочку хоста, запустите + exit + из оболочки jail:

exit

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

Шаг 4 - Установка и запуск Buildbot Worker

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

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

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

sudo jexec buildbot-worker0 csh

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

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

pkg install py36-buildbot-worker

Когда эта команда выполняется, она предложит вам подтвердить, хотите ли вы запустить утилиту управления пакетами + pkg +. Сделайте это, введя + y +. Он также попросит вас подтвердить, что вы одобряете установку пакетов, поэтому при появлении запроса введите + y + еще раз.

Затем создайте обычного непривилегированного пользователя для запуска рабочей службы:

pw useradd -n buildbot-worker -m -w random

Затем создайте рабочий каталог. Это место, где будут храниться конфигурация работника, отображаемая информация и каталоги сборки:

mkdir /var/buildbot-worker

Передать право собственности на пользователя сервиса:

chown buildbot-worker:buildbot-worker /var/buildbot-worker

С этого момента все связанные с работником настройки и изменения должны выполняться как непривилегированный пользователь. Для этого переключитесь на пользователя + buildbot-worker +:

su -l buildbot-worker

Используйте встроенную утилиту + buildbot-worker +, чтобы создать каталог и структуру конфигурации в каталоге + / var / buildbot-worker +. Укажите IP-адрес главной тюрьмы - «+ 10.0.0.2 », который мы выбрали на предыдущем шаге, чтобы рабочий мог подключиться к нему и заменить « pass +» паролем, который вы определили в файле основной конфигурации:

buildbot-worker-3.6 create-worker /var/buildbot-worker 10.0.0.2 worker0 ''

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

echo ' <>' >/var/buildbot-worker/info/admin
echo '' >/var/buildbot-worker/info/host

После этого выполните команду + exit +, чтобы переключиться обратно на пользователя * root * в тюрьме:

exit

Поскольку пример конфигурации клонирует репозиторий Git + git: // github.com / buildbot / hello-world.git + для создания примера проекта, вам также необходимо установить Git в этой тюрьме. Обратите внимание, что мастер Buildbot также требовал Git, потому что источники изменений запускаются на мастере. Кроме того, сборщик использует тестовый прогон под названием + trial +, который является частью пакета + py27-twisted +, поэтому установите его вместе с + git-lite +:

pkg install git-lite py27-twisted

Встроенным механизмом запуска работника является + buildbot-worker start +, который должен запускаться из рабочего каталога, + / var / buildbot-worker +. Тем не менее, это не заботится о запуске при загрузке и не гарантирует, что он будет работать от имени правильного пользователя. Как и в случае с мастером, используйте упакованный скрипт + rc +, используя утилиту + service, для управления сервисом.

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

sysrc buildbot_worker_basedir=/var/buildbot-worker
sysrc buildbot_worker_uid=buildbot-worker
sysrc buildbot_worker_gid=buildbot-worker

Затем включите службу для запуска при запуске:

sysrc buildbot_worker_enable=YES

На момент написания в пакете + py36-buildbot-worker + была ошибка, препятствующая запуску службы (см. Https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=227675[this отчет об ошибке ]). Пока это не исправлено, вам нужно будет вручную исправить скрипт запуска, выполнив следующую команду из вашей + buildbot-worker0 + тюрьмы:

sed -i '' 's|command="/usr/local/bin/twistd"|command="/usr/local/bin/twistd-3.6"|' /usr/local/etc/rc.d/buildbot-worker

Наконец, запустите рабочий компонент:

service buildbot-worker start

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

tail /var/buildbot-worker/twistd.log

Если служба запущена успешно, появится сообщение типа + Connected to 10.0.0.2:9989; работник готов + `появится в файле журнала. Если вы забыли указать новый пароль ранее на этом этапе, служба не сможет подключиться к мастеру. В этом случае отредактируйте файл `+ / var / buildbot-worker / buildbot.tac + и затем запустите + service buildbot-worker restart +, чтобы устранить эту проблему.

Как только служба запустится правильно, перейдите в оболочку хоста, выполнив команду + exit + из оболочки jail:

exit

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

Шаг 5 - Настройка веб-интерфейса Buildbot

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

Ваша основная конфигурация уже настроила компонент + www + для обслуживания HTTP через порт + 8010 +. В производственных условиях вы не будете обслуживать незашифрованный HTTP или открывать нестандартный порт + 8010 + снаружи, так как это приведет к уязвимости системы в вашей системе. Кроме того, веб-интерфейс может обслуживаться с любого URL-пути, что означает, что он не обязательно должен быть единственным приложением в вашем домене. Например, вы могли бы предоставлять результаты сборки или журналы своим пользователям. Следовательно, мы будем предоставлять пользовательский интерфейс пользователям с отдельным веб-сервером - Nginx - чтобы поддерживать HTTPS, защищать внутренние порты и получать возможность обслуживать другой контент вместе с веб-интерфейсом Buildbot.

Откройте файл конфигурации Nginx для редактирования:

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

Добавьте следующие выделенные блоки + location n в существующий блок файла + server:

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

. . .
http {
. . .
   server {

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



















       error_page 500 502 503 504 /50x.html;
       location = /50x.html {
           root /usr/local/www/nginx-dist;
       }

               . . .

   }
}

Эта конфигурация перенаправляет все запросы ниже URL-пути + / buildbot / + в веб-интерфейс и включает поддержку WebSocket, которая используется интерфейсом для получения обновлений, которые он будет отображать, например, вывод журнала работающей сборки.

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

sudo service nginx reload

Откройте предпочитаемый веб-браузер на локальном компьютере и откройте веб-интерфейс Buildbot, перейдя по следующему URL-адресу:

https:///buildbot/

В качестве альтернативы, если вы не настроили доменное имя для своего сервера, вам вместо этого потребуется ввести публичный IP-адрес вашего сервера, + http: /// buildbot / +.

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

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

На главной странице может отображаться предупреждение о неправильной настройке URL-адреса Buildbot. Это происходит, если имя хоста, указанное в файле + nginx.conf +, не соответствует тому, что указано в основной конфигурации Buildbot. Так как электронные письма с результатами сборки по умолчанию содержат ссылки на веб-интерфейс Buildbot, мастер должен знать правильный URL-адрес, по которому он может быть достигнут.

Обратите внимание, что в нашем примере конфигурации мы не настроили эту службу электронной почты. Если вы заинтересованы в настройке этого, см. Http://docs.buildbot.net/current/manual/cfg-reporters.html[documentation about reporter] Buildbot для получения дополнительной информации:

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

sudo ee /usr/jails/buildbot-master/var/buildbot-master/master.cfg

Найдите строку, которая начинается с + c ['buildbotURL'] + и замените опцию по умолчанию именем вашего домена, а затем + / buildbot / +:

/var/buildbot-master/master.cfg

####### PROJECT IDENTITY
# ...
c['buildbotURL'] = ''
# ...

Сохраните и закройте файл. Затем, чтобы применить новую конфигурацию, перезагрузите сервис + buildbot +:

sudo jexec buildbot-master service buildbot reload

Обновите веб-интерфейс Buildbot в вашем браузере, и предупреждение исчезнет.

Серверы непрерывной интеграции часто служат другим целям, кроме CI. Например, сервер CI может обслуживать выходные данные сборки для пакетов FreeBSD или журналы через HTTPS. Поэтому рекомендуется зарезервировать URL-путь + / buildbot / + для веб-интерфейса. Это позволяет размещать больше приложений по разным путям. На данный момент мы создадим простую домашнюю страницу, которая перенаправляет на веб-интерфейс. Вы можете добавить больше ссылок, как только вы реализуете больше вариантов использования для веб-сервера.

Запустите следующую команду, чтобы открыть индексный файл в корневом веб-каталоге - заменив ++ собственным доменом - для создания автоматического перенаправления в веб-интерфейс Buildbot:

sudo ee /usr/local/www//html/index.html

Замените любое существующее содержимое файла следующими строками:

/usr/local/www/nginx/index.html

<html>
<body>
<a href="/buildbot/">buildbot</a>
<script>
   // Auto-redirect while only the web interface should be served
   window.location.href = "/buildbot/";
</script>
</body>
</html>

Сохраните и закройте этот файл, затем введите свое доменное имя или IP-адрес в адресной строке браузера. Он должен автоматически перенаправить вас в интерфейс Buildbot.

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

В компоновщике по умолчанию настроен планировщик «форс», который позволяет запускать первую сборку. В веб-интерфейсе нажмите * Builds *> * Builders *> * runtests *> * force *> * Start Build * и посмотрите, как выполняется сборка. Если вы видите какие-либо ошибки, проверьте подключение к Интернету сервера и были ли установлены все зависимые пакеты, как описано ранее.

изображение: https: //assets.digitalocean.com/articles/buildbot_freebsd/sample_build_success.png [Пример скриншота успешной сборки]

Вы можете найти артефакты из этой сборки (и других), посмотрев содержимое каталога сборки:

ls /usr/jails/buildbot-worker0/var/buildbot-worker/runtests
Outputbuild

Вы успешно настроили постоянно работающую и универсальную систему CI и теперь можете приступить к реализации собственных сборок.

Заключение

Завершив этот урок, вы попрактиковались в создании джейлов FreeBSD и изучили некоторые основы инфраструктуры автоматизации Buildbot, что привело к готовой к использованию установке. Чтобы узнать больше о Buildbot и его конфигурации, мы рекомендуем вам прочитать official Buildbot документацию.

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

  • Используйте только HTTPS (как описано в этом руководстве)

  • В этом уроке вы использовали отдельную внутреннюю сеть хоста + lo1 + для своих тюрем. В этом руководстве мы использовали + ipfw + для целей NAT, но другие брандмауэры также имеют эту функцию. Ознакомьтесь с документацией FreeBSD о available firewalls. Если ваш вариант использования не требует иного, рекомендуется сохранить доступ к тюрьме снаружи с помощью NAT или других механизмов.

  • Веб-интерфейс Buildbot не требует входа в систему или проверки прав пользователя по умолчанию. Для их реализации вам необходимо включить user[user authentication.

Related