image


1. Привет.


На хабре подозрительно мало информации про Open Build Service (далее OBS) и прочие платформы.
А про свежесть имеющегося и говорить не хочется.
Недавно был релиз версии 2.7, пришли долгожданные изменения.
Но, для истории, хочу немного рассказать об одном варианте использования 2.6 (релиз — февраль 2015 года).


Пример для материала навеян недавней потребностью.
Итак, собирем php-ffmpeg на базе ffmpeg 3.0 для Centos (7, и даже 6*!).


2. Схема


Все необходимые команды я долгое время выполнял методом copy-paste из своей wiki.
Абсолютно все выполняется в консоли, в т.ч. через API OBS.
Сейчас весь процесс разбит на 4 этапа:


это все что надо будет запустить в консоль
cd ~ && git clone https://github.com/BOPOHA/obs-fast-c7ffmpeg && obs-fast-c7ffmpeg
bash -x obs-fast-c7ffmpeg-n1-prepare.sh  # при успешном окончании сервер перезагрузится
cd ~/obs-fast-c7ffmpeg
bash -x obs-fast-c7ffmpeg-n2-mkvps.sh
bash -x obs-fast-c7ffmpeg-n3-buildtargets.sh
bash -x obs-fast-c7ffmpeg-n4-buildpkgs.sh

  • n1 — под готавливаем хост для работы, устанавливаем средства виртуализации, ребут.
  • n2 — сетапаем VPS на базе подготовленного .qcow2 образа
  • n3 — настраиваем OBS: добавляем свои центосы, создаем целевой проект
  • n4 — отправляем тарболы и спеки на сборку

Все необходимое для сброки доступно в github.
Используемое железо: Xeon E3-1230 3.2 GHz / 8GB / 2x500GB / 100Mbs / CentOS 7.x
Затраченное время ~2 часа (40мин на rsync rpm-ок, и чуть более часа на сам процесс сборки ).
Далее, по каждому из скриптов, я отмечу наиболее важные, на мой взгляд, моменты.


n1-prepare.sh


Тут добавляем в GRUB_CMDLINE_LINUX некоторые опции, для повышения производительности.
Отдельно стоит kvm-intel.nested=1, это позволяет использовать возможности виртуализации внутри контейнера OBS, тем самым ускорить процесс сборки и снизить нагрузку на диски.
Тут в общем-то больше ничего интересного, устанавливаем сторонний репозиторий openSUSE:Tools для работы через API, и пакеты libvirt/kvm.


n2-mkvps.sh


Все необходимые данные для настройки окружения были почерпнуты отсюда: openSUSE:Build_Service_private_installation.


obs-server_os.raw
wget http://download.opensuse.org/repositories/OBS:/Server:/2.6/images/obs-server.x86_64.qcow2
qemu-img create -f raw -o size=128G obs-server_os.raw

virt-resize --expand /dev/sda1        obs-server.x86_64.qcow2 obs-server_os.raw
losetup /dev/loop0  obs-server_os.raw
kpartx -a /dev/loop0
mount /dev/mapper/loop0p1 /mnt
echo "rcsshd start
swapon /dev/vdb1
sleep 360 && screen -dmS upgraderepos bash -x /root/upgrade.repos.bash &
#                " >> /mnt/etc/init.d/boot.local
mkdir /mnt/root/.ssh
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub > /mnt/root/.ssh/authorized_keys
cat ~/$REPONAME/___env/upgrade.repos.bash >> /mnt/root/upgrade.repos.bash
chmod -R 700 /mnt/root/.ssh
umount /mnt/
kpartx -d /dev/loop0
losetup -d /dev/loop0

Тут берем подготовленный образ. Он по умолчанию не имеет достаточно свободного места для нормальной работы, поэтому производим изменения размера, и небольшое изменения в ФС:


  • добавление нескольких команд в автозагрузку
  • генерация ssh-key на хосте и копирование pub-key в OBS.
  • копирвоание скрипта для обновления rpm-ок.

obs-server_lvm.raw
qemu-img create -f raw -o size=128G obs-server_lvm.raw
losetup /dev/loop0 obs-server_lvm.raw
parted -s /dev/loop0 mklabel msdos
parted -s /dev/loop0 mkpart primary 0.00GB 8GB
parted -s /dev/loop0 mkpart primary 8GB 128GB
parted -s /dev/loop0 set 2 lvm on
kpartx -a /dev/loop0
sleep 2
mkswap /dev/mapper/loop0p1
pvcreate /dev/mapper/loop0p2 -ff -y
vgcreate "OBS" /dev/mapper/loop0p2
lvcreate -L 32G -n "server" /dev/OBS
vgscan
mkfs.ext4 /dev/OBS/server
vgchange -an OBS
kpartx -d /dev/loop0
losetup -d /dev/loop0

Как описано в Build_Service_private_installation, этот кусок кода создает второй диск, с LVM разделом и необходимой разметкой.
При загрузке, система его опознает и самостоятельно продолжит настройку.


virt-install --name OBS_server
virt-install    --name OBS_server    --ram 7168 --vcpus 4    --disk path=/home/libvirt_images/obs-server_os.raw     --disk path=/home/libvirt_images/obs-server_lvm.raw    --graphics spice    --os-variant sles11    --boot=hd &
sleep 180 && virsh reboot OBS_server
sleep 60

sleep 180 — ждем первую загрузку OBS и инициализацию LVM, после чего ребут OBS.
sleep 60 — после этого считаем что OBS готова к работе


поиск IP OBS
VPS_MAC=`virsh dumpxml OBS_server  | grep -o  '..:..:..:..:..:..'`
VPS_IP=`arp -an | grep $VPS_MAC | sed  's|^.*(\(.*\)).*$|\1|'`
touch /etc/hosts /root/.ssh/known_hosts
sed -i "/linux/d; /$VPS_IP/d;" /etc/hosts /root/.ssh/known_hosts
echo "$VPS_IP linux" >> /etc/hosts
ssh  linux -oStrictHostKeyChecking=no uptime

Тут по mac-адресу ищем IP OBS, и прописывае его hosts.


Следует отметить, что параметры размера диска 128G, и количества vcpus — взаимосвязаны.
По умолчанию, количество веркеров равно количеству vcpu. Если вам потребуется собрать большой проект, то 5GB может не хватить, потребуется либо увеличить рамер раздела, либо уменьшить количество ядер, либо изменить соотв. параметр в /etc/sysconfig/obs-server. Ниже пример:


lsblk OBS

n3-buildtargets.sh


скрипт
#!/bin/bash
set -e
LANG=en_US.UTF-8
REPONAME='obs-fast-c7ffmpeg'
export ACC=Admin
export REPO_NAME="home:$ACC:$REPONAME"
export TMP_DIR="/home/tmp"
export PKG_DIR="$HOME/$REPONAME"
mkdir -p $TMP_DIR 
rm -rf /root/.config/osc/trusted-certs/linux_443.pem
yes 2 |osc list

osc meta prj -F - centos7 << EOF
<project name="centos7">  
 <title>centos7</title>  
 <description></description>  
 <person role="maintainer" userid="Admin"/>  
 <person role="bugowner" userid="Admin"/> 
 <repository name="epel">
   <arch>x86_64</arch>
 </repository>
 <repository name="updates">
   <arch>x86_64</arch>
 </repository>
 <repository name="os">
   <arch>x86_64</arch>
 </repository>
</project>
EOF

cd $PKG_DIR
osc meta prjconf -F ___env/centos7.conf  centos7

osc meta prj home:$ACC -F - << EOF 
<project name="home:$ACC">
  <title>$ACC's Home Project</title>
  <description></description>
  <person userid="$ACC" role="maintainer"/>
  <person userid="$ACC" role="bugowner"/>
</project>
EOF

osc meta prj $REPO_NAME -F - << EOF
<project name="$REPO_NAME">
  <title>$REPO_NAME</title>
  <description>$REPO_NAME</description>
  <person userid="$ACC" role="maintainer"/>
  <repository name="CentOS_7">
    <path project="centos7" repository="epel"/>
    <path project="centos7" repository="updates"/>
    <path project="centos7" repository="os"/>
    <arch>x86_64</arch>
  </repository>
  <repository name="CentOS_6">
    <path project="centos6" repository="epel"/>
    <path project="centos6" repository="updates"/>
    <path project="centos6" repository="os"/>
    <arch>i586</arch>
    <arch>x86_64</arch>
  </repository>
  <build>
    <disable repository="CentOS_6"/>
  </build>
</project>
EOF

На первый взгляд и тут все просто, но самом деле, подобные манипуляции нигде явно в документации не освещены.


osc meta prj -F - centos7 << EOF

Регистрируем подключаемый репозиторий centos7.


osc meta prj home:$ACC -F - << EOF

Создаем "Home Project" home:Admin.


osc meta prj $REPO_NAME -F - << EOF

Создаем c суб-проект home:Admin:obs-fast-c7ffmpeg.


А самое сложное было найти команду osc meta prjconf -F ___env/centos7.conf centos7.
Это билд-конфиг соответствующей ОС.
Файл centos7.conf можно накурлить из комьюнити проекта одним из приведенных способов:


osc -A https://api.opensuse.org meta prjconf CentOS:CentOS-7 > centos7.conf
curl https://api.opensuse.org/public/source/CentOS:CentOS-7/_config > centos7.conf

n4-buildpkgs.sh


Последний этап, создание пакетов, реализуется функцией:


function push
function push {
cd $TMP_DIR
PKG_NAME=$1
osc meta pkg $REPO_NAME $PKG_NAME -F - << EOF
<package name="$PKG_NAME">
<title>$PKG_NAME</title>
<description></description> 
</package>
EOF

cd $TMP_DIR/$REPO_NAME
osc up 
cd $TMP_DIR/$REPO_NAME/$PKG_NAME
rsync -av --delete --exclude=".osc/" $PKG_DIR/$PKG_NAME/ .
osc addremove
osc ci -m "init"
}

Функция регистрирует в OBS пакет,
переходит в локальную папку с проектом (/home/tmp/home:Admin:obs-fast-c7ffmpeg/),
обновляет папку с пакетом,
синхронизирует данные с OBS и делает комит.
Сразу после этого пакет начинает собираться одним из свободных веркеров.
Для сборки php-ffmpeg в Centos7 потребуется совсем не много:


push lame
push ocl-icd
push x265
push x264
push xvidcore
push opencl-headers
push ffmpeg
push php-ffmpeg

процесс сборки можно контролировать по разному

Откуда взять материал для сборки?


Наиболее простой способ — воспользоваться готовым из src.rpm fedora (поиск тут https://www.rpmfind.net/ ).


список использованых src.rpm
ftp://195.220.108.108/linux/fedora-secondary/development/rawhide/source/SRPMS/o/ocl-icd-2.2.8-2.git20151217.0122332.fc24.src.rpm
ftp://195.220.108.108/linux/fedora-secondary/development/rawhide/source/SRPMS/o/opencl-headers-1.2-9.fc24.src.rpm (centos 6)
ftp://195.220.108.108/linux/sourceforge/u/un/unitedrpms/repository/srpm/lame-3.99.5-5.fc24.src.rpm
ftp://195.220.108.108/linux/sourceforge/u/un/unitedrpms/repository/srpm/x264-0.148-2.20160420git3b70645.fc24.src.rpm
ftp://195.220.108.108/linux/sourceforge/u/un/unitedrpms/repository/srpm/x265-1.9-1.20160221git40ba1eb.fc24.src.rpm
ftp://195.220.108.108/linux/sourceforge/u/un/unitedrpms/repository/srpm/xvidcore-1.3.4-1.fc24.src.rpm
ftp://195.220.108.108/linux/sourceforge/u/un/unitedrpms/repository/srpm/ffmpeg-3.0.1-2.fc24.src.rpm

В некоторых случаях, потребовались небольшие правки спеков, в таком случае оригинальный файл имеет расширение .orig.


*Centos 6


Система хорошая, надежная ) но, вот беда, пакетная база устарела для сборки многих пакетов актуальных версий.
Для успешной сборки ffmpeg, потребуется дополнительно собрать ocl-icd-devel, soxr-devel, и их зависимости.
Но самое сложное, это обновить несколько важных системных пакетов: autoconf, automake, m4,… а они взаимозависимые.
Так как эта задача одноразовая, и мы ленивые, то воспользуемся https://pkgs.org/ для поиска необходимых пакетов.
Добавим найденное в репу OBS и перезапустим сервис:


c6hack
cd /srv/obs/build/centos6/epel/x86_64/:full/
wget http://springdale.math.ias.edu/data/puias/computational/6/x86_64/ocl-icd-devel-2.2.8-1.git20151217.0122332.sdl6.x86_64.rpm
wget http://springdale.math.ias.edu/data/puias/computational/6/x86_64/ocl-icd-2.2.8-1.git20151217.0122332.sdl6.x86_64.rpm
wget http://springdale.math.ias.edu/data/puias/6/x86_64/os/Addons/soxr-devel-0.1.1-3.sdl6.x86_64.rpm
wget http://springdale.math.ias.edu/data/puias/6/x86_64/os/Addons/soxr-0.1.1-3.sdl6.x86_64.rpm
rcobsscheduler restart
obs_admin --deep-check-project centos6 x86_64

Как использовать


Для начала, необходимо пробросить порты. На 443 висит веб-морда, на 82 — репозиторий.
Наиболее простым и гибким вариантом будет установка nginx и добавление двух строк в дефолтный конфиг:


# grep location\ / -A3 /etc/nginx/nginx.conf
        location / {
                proxy_pass http://192.168.122.218:82/;
                proxy_redirect off;
        }
#

Далее необходимо создать файл /etc/yum.repos.d/obs-fast-c7ffmpeg.repo примерно следующего содержания:


[obs-ffmpeg-c7]
name = obs-ffmpeg-c7
baseurl = http://123.123.123.123/home:/Admin:/obs-fast-c7ffmpeg/CentOS_7/
gpgkey = http://123.123.123.123/home:/Admin:/obs-fast-c7ffmpeg/CentOS_7/repodata/repomd.xml.key
gpgcheck = 1

На последок.


Для тех, кому требуется собирать пакеты без затрат, может понравится этот ресурс https://build.opensuse.org/.
Среди минусов:


  • устаревшая пакетная база ОС. Например при актуальной Centos 6.6, сборка проходила на базе Centos 6.3 (а там openssl очень старый и т.д.)
  • нет возможности подключения сторонних репозиториев (тот же epel-release)
  • множественные ограничение по пакетам https://en.opensuse.org/openSUSE:Build_Service_application_blacklist

Полезные ссылки:
https://ru.opensuse.org/openSUSE:OSC
https://en.opensuse.org/openSUSE:Build_Service_private_installation
https://en.opensuse.org/openSUSE:Build_Service_private_instance_software_live_cycle
https://en.opensuse.org/openSUSE:Build_Service_Tips_and_Tricks
https://en.opensuse.org/openSUSE:Build_Service_adding_build_targets
https://en.opensuse.org/openSUSE:Build_Service_Concept_CrossDevelopment

Интересна ли тема?

Проголосовало 26 человек. Воздержалось 7 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Поделиться с друзьями
-->

Комментарии (11)


  1. minicon
    23.06.2016 11:47

    >На хабре подозрительно мало информации про Open Build Service (далее OBS) и прочие платформы.

    Есть мнение, что это потому что для сборки 3-10 пакетов использовать такую сложную в поддержке систему это оверкил, при наличии fpm, например.


    1. BOPOHA
      24.06.2016 02:14

      Как видим в данном примере, весь процесс занимает 2 часа, забираюются результаты, и все ресурсы освобождаются.
      Но, в целом, да, я вами согласен. Для 3-10 пакетов, даже со взаимными зависимостями, если есть спеки, даже rpmbuild сгодится!


  1. rudenkovk
    23.06.2016 12:01

    У меня сейчас OBS перешел в фоновую часть, но есть несколько вопросов:
    1. Какие есть standalone альтернативы? В моем случае поддерживающие deb. Pbuilder и launchad не предлагать. Один стар, другой не документирован.
    2. Пробовал ли собирать не в виртуалке, а в контейнере?


    1. BOPOHA
      24.06.2016 02:28

      1. Можно попробовать fpm. Но в тонкостях deb-систем я не силен.

      2. Нет, в контейнере не пробовал, и пока не вижу, как это применить к OBS.
      Даже наоборот, пример описаный в статье, используя подготовленные образы http://openbuildservice.org/download/other/, позволяет полностью абстрагироваться от того, что такое OBS.
      Просто черный ящик, через API скармливаем ему профили, и данные — получаем результат.
      Производим несколько итераций до полного удовлетворения, сохраняем профили, и убиваем виртуалку.


      1. rudenkovk
        24.06.2016 10:47

        1. fpm не парсит зависимости. То есть кросс-ребилд не возможно сделать, надо писать костыль.
        2. ту интересен вопрос, как это кошерно стартовать в облаке.


  1. dburmistrov
    24.06.2016 02:29

    В своё время ушёл с OBS из-за того, что не было поддержки udeb пакетов. Они собирались, но не публиковались в репозиторий. Как сейчас с этим дела обстоят?


    1. BOPOHA
      24.06.2016 02:32

      Не сталкивался с udeb.
      А как вы решили эту проблему, что выбрали?


      1. dburmistrov
        24.06.2016 11:07

        Ушёл на нативные инструменты. Sbuild + reprepro.


    1. rudenkovk
      24.06.2016 10:48

      где-то в 2.4 мы решали просто манки патчем, чтобы и в udeb расширения глядел.


      1. dburmistrov
        24.06.2016 11:16

        Там проблема не только в том, что он udeb не публикует. OBS оперирует плоскими репозиториями. A deb и udeb нельзя держать рядом, они конфликтуют друг с другом.


        1. rudenkovk
          24.06.2016 11:22

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