# Билдботы для Директа

Один мастер == один репозиторий (svn/direct, ...)

Один билдер == одна разновидность сборки (юнит-тесты, тесты data2, сборка пакетов...)

Один слейв == один исполнитель 

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


## Мастеры 
переехали в docker-контейнеры

### Добавление нового мастера
Частично устарело, сейчас мастера запускаются не непосредственно, а через контейнеры.
В качестве примера можно смотреть на устройство master-direct (конфиг + инит-скрипт)

Создаем нужные файлы в каталоге master-direct (заменить на свой)

> buildbot create-master --relocatable --log-size=512000 --log-count=3 master-direct
> mv master-direct/state.sqlite ./
-- базу перенести вручную в отдельный каталог, например в /opt/buildbot-master-direct (название проекта заменить):
sudo mkdir /opt/buildbot-master-directmod
sudo mv ./state.sqlite /opt/buildbot-master-directmod
sudo chown -R ppc: /opt/buildbot-master-directmod

> mv master.cfg.sample master.cfg
-- этот файл будем редактировать

> touch etc/buildmaster.d/master-direct
Содержимое (каталог заменить на правильный):

MASTER_ENABLED[$1]=1                        # 1-enabled, 0-disabled
MASTER_NAME[$1]="buildmaster-direct"        # short name printed on start/stop
MASTER_USER[$1]="ppc"                       # user to run master as
MASTER_BASEDIR[$1]="/var/lib/buildbot/masters/master-direct"                   # basedir to master (absolute path)
MASTER_OPTIONS[$1]=""                       # buildbot options
MASTER_PREFIXCMD[$1]=""                     # prefix command, i.e. nice, linux32, dchroot



## Слейвы

### Пересборка пакета с нашими патчами

#### Подготовка
Создаем директорию под сборку:
> mkdir builddir
> cd builddir 

Скачиваем исходники пакета buildbot-slave:
> apt-get source buildbot-slave

Если произошла ошибка - то стоит убедиться, что подключен репозиторий
с исходниками (если нет, то добавить в /etc/apt/sources.list):
    deb-src http://mirror.yandex.ru/ubuntu precise universe

Устаналиваем зависимости, необходимые для сборки:
> apt-get build-dep buildbot-slave

#### Патч  для поддержки /etc/buildslave.d
Скопировать собственно патч:
> cp direct-utils/buildbot/patches/buildbot-slave-VERSION/multiple_slave_in_init_script.patch builddir/buildbot-slave-VERSION/debian/patches/

Добавить его имя в список применяемых патчей
builddir/buildbot-slave-VERSION/debian/patches:
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,2 +1,3 @@
 fix-init-scripts.patch
 deb-bug-657517.patch
+multiple_slave_in_init_script.patch

Поправить builddir/buildbot-slave-*/debian/rules:
--- a/debian/rules
+++ b/debian/rules
@@ -10,7 +10,7 @@
    dh_auto_clean
 
 override_dh_installinit:
-   mkdir -p ${DESTDIR}/etc/init.d ${DESTDIR}/etc/default
+   mkdir -p ${DESTDIR}/etc/init.d ${DESTDIR}/etc/default ${DESTDIR}/etc/buildslave.d
    cp contrib/init-scripts/buildslave.init.sh ${DESTDIR}/etc/init.d/buildslave
    cp contrib/init-scripts/buildslave.default ${DESTDIR}/etc/default/buildslave
    dh_installinit --name=buildslave --onlyscripts

#### Обновление версии пакета и сборка
В директории builddir/buildbot-slave-* запускаем debchange для обновления
changelog пакета:
> dch -i
или:
> debchange -n

Редактируем автоматически сгенерированную версию: добавляем суффикс "ya"
перед номером сборки (последней цифрой в версии). Перечисляем все патчи,
сохраняем, выходим. Пример того, что должно получиться:
buildbot-slave (0.8.5-2.ya1) unstable; urgency=low

  * Non-maintainer upload.
  * multiple_slave_in_init_script.patch

 -- Alexandr Duplishchev <ppalex@yandex-team.ru>  Sat, 19 Sep 2015 01:16:16 +0300

Собрать пакет (из директории builddir/buildbot-slave-VERSION):
> debuild


### Добавление нового слейва

Создаем нужные файлы
ppcbuild.ppc.yandex.ru:9989 -- где живет мастер
slave-direct-trunk-unittests -- имя слейва, как в конфиге мастера
<пароль> -- как в конфиге мастера

> mkdir slave-direct-trunk-unittests

> cd $_

> buildslave create-slave --umask=022 --relocatable --keepalive=120 --maxdelay=30 --log-size=512000 --log-count=3 slave-direct-trunk-unittests ppcbuild.ppc.yandex.ru:9989 slave-direct-trunk-unittests <пароль>

> mv slave-direct-trunk-unittests yandex-du-buildbot-slave-direct-trunk-unittests
... доделать структуру каталогов как в соседних слейвах ...

> cd $_

> mkdir -p etc/buildslave.d

> touch etc/buildslave.d/slave-direct-trunk-unittests
Содержимое (каталог, имя и пользователя заменить на правильные):

SLAVE_ENABLED[$1]=1                                   # 1-enabled, 0-disabled
SLAVE_NAME[$1]="slave-direct-trunk-unittests"         # short name printed on start/stop
SLAVE_USER[$1]="ppc"                                  # user to run slave as
SLAVE_BASEDIR[$1]="/var/lib/buildbot/slaves/slave-direct-trunk-unittests"                   # basedir to slave (absolute path)
SLAVE_OPTIONS[$1]=""                                  # buildbot options
SLAVE_PREFIXCMD[$1]=""                                # prefix command, i.e. nice, linux32, dchroot

... подготовить к сборке ...


### Быстрое создание пакета со слейвом в концепции "один слейв на сервер"

Название слейва генерируется автоматически по следующему шаблону:
    slave-PROJECT-SERVER-ARCH,
где:
    PROJECT - имя проекта (умолчание direct),
    SERVER - короткое имя сервера, на который будет установлен слейв (требуется
        указать через параметры сборки),
    ARCH - архитектура севера, на который будет установлен слейв (умолчание trusty).
Имя собранного пакета: yandex-du-buildbot-slave-PROJECT-SERVER-ARCH

Сборка осуществляется из директории slave-for-server-template.
Перед сборкой пакета сделать очистку:

> make clean


#### Для директа:

> make SERVER=ppcdev1

или для xenial-слейвов:

> make SERVER=ppcdev0 ARCH=xenial


#### Для модерации

> make PROJECT=directmod ARCH=precise USER=mod SERVER=ppcmoddev2 SLAVE_PORT=9991 SLAVE_PASSWORD=XXXXXX
