_Автор выбрал 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.