На хабре подозрительно мало информации про 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.
Тут берем подготовленный образ. Он по умолчанию не имеет достаточно свободного места для нормальной работы, поэтому производим изменения размера, и небольшое изменения в ФС:
добавление нескольких команд в автозагрузку
генерация ssh-key на хосте и копирование pub-key в OBS.
Как описано в Build_Service_private_installation, этот кусок кода создает второй диск, с LVM разделом и необходимой разметкой.
При загрузке, система его опознает и самостоятельно продолжит настройку.
Тут по mac-адресу ищем IP OBS, и прописывае его hosts.
Следует отметить, что параметры размера диска 128G, и количества vcpus — взаимосвязаны.
По умолчанию, количество веркеров равно количеству vcpu. Если вам потребуется собрать большой проект, то 5GB может не хватить, потребуется либо увеличить рамер раздела, либо уменьшить количество ядер, либо изменить соотв. параметр в /etc/sysconfig/obs-server. Ниже пример:
На первый взгляд и тут все просто, но самом деле, подобные манипуляции нигде явно в документации не освещены.
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 потребуется совсем не много:
В некоторых случаях, потребовались небольшие правки спеков, в таком случае оригинальный файл имеет расширение .orig.
*Centos 6
Система хорошая, надежная ) но, вот беда, пакетная база устарела для сборки многих пакетов актуальных версий.
Для успешной сборки ffmpeg, потребуется дополнительно собрать ocl-icd-devel, soxr-devel, и их зависимости.
Но самое сложное, это обновить несколько важных системных пакетов: autoconf, automake, m4,… а они взаимозависимые.
Так как эта задача одноразовая, и мы ленивые, то воспользуемся https://pkgs.org/ для поиска необходимых пакетов.
Добавим найденное в репу OBS и перезапустим сервис:
Для начала, необходимо пробросить порты. На 443 висит веб-морда, на 82 — репозиторий.
Наиболее простым и гибким вариантом будет установка nginx и добавление двух строк в дефолтный конфиг: