Готуємо Open Build Service 2.6

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.00 GB 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

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.