Pull to refresh

Сборочная среда для проекта Midnight Commander — продолжение

Reading time 3 min
Views 2.3K
Начало

В первой части я представил новый сервис сборки бинарных пакетов файлового менеджера Midnight Commander для Debian/Ubuntu. В комментариях справедливо указали на недостаток технического описания самой среды и я пообещал, что выложу подробности как только код будет приведен в божеский вид. Прошло две недели, появилось немного времени, чтобы стабилизировать функционал и причесать код (он все еще ужасен, но вроде работает как задумано), так что пора выполнить обещанное.

Я специально не включаю в топик исходные коды, их немало, и на мой взгляд статья получается перегруженной. Кому интересно, может скачать их с googlecode.

Сборочная среда


Сборочная среда состоит из нескольких shell-скриптов:
  • contrib/mc-release-builds.sh — скрипт, который выполняется как задание CRON и управляющий сборкой новых релизов, либо пересборкой уже вышедших.
  • contrib/mc-nightly-builds.sh — скрипт, который также является заданием CRON и осуществляющий сборку ночных срезов.
  • contrib/prepare-environment.sh — скрипт, который инициализирует переменные среды, специфичные для моего сервера (в частности экспортируются переменные окружения для работы SSH и GPG агентов)
  • contrib/local-repo-update — скрипт, которым я обновляю свой репозитарий, сейчас подумываю отказаться от apt-ftparchive и попробовать reprepro.
  • contrib/pbuilder — конфиги сборочных целей, один из них (contrib/pbuilder/buildbot) используется для подготовки пакета из исходников или GIT.
  • contrib/apt-ftparchive — мои настройки для работы apt-ftparchive (может кому-то пригодятся)

Далее идут скрипты, которые составляют саму сборочную среду:

  • build-mc-from-git.sh — сборка пакета из исходников или VCS (ядро системы)
  • buildbot.sh — обертка над предыдущим скриптом, которая является промежуточным звеном между заданиями крона, пользователем и ядром сборочной среды.
  • initial-build.sh — анахронизм, который остался благодаря моей природной лени. Добавляет отдельного пользователя buildbot в сборочный таргет pbuilder (buildbot).

build-mc-from-git.sh


Как я уже упомянул ранее, это наиболее важная часть сборочной среды. Выполняет два вида операций: сборка/пересборка релизов и сборка ночных срезов из GIT. Если была выбрана сборка релиза, то скрипт:
  • обновляет из репозитария локальную копию каталога contrib/debian/, который необходим для построения пакета (при сборке пакета не используется dh_make)
  • распаковывает архив с исходниками, который передается скрипту, как один из аргументов вышестоящими скриптами или пользователем.
  • проверяет, собираются ли исходники «из коробки». Для этого в каталоге с распакованными исходниками выполняется знакомая многим последовательность действий:
    
    [ -x ./autogen.sh ] && ./autogen.sh
    ./configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib/mc
    make
    make install DESTDIR=/tmp/install
    

    Если этот этап проходится без ошибок, то дальнейшие проблемы со сборкой пакета говорят о необходимости пересмотреть debian-специфическую часть пакета (каталог contrib/debian/ в VCS)
  • копирует в исходники каталог debian/ из локальной копии VCS, проверяет есть ли локальный changelog для версии исходников (если идет сборка новой ревизии пакета, а не новый релиз) и в случае если он существует, то changelog из VCS заменяется локальным.
  • икрементирует версию и/или номер ревизии и запускает сборку пакета через вызов dpkg-buildpackage -rfakeroot -us -uc
  • проверяет пакет в lintian на предмет соответствия Debian policy. Вывод lintian сохраняется в отдельный файл. (недавно помогло отловить ошибку в man страницах ночных сборок и отправить патч в апстрим)

Сборка ночного среза отличается только тем, что исходники формируются из GIT репозитария и отличается код инкрементирования версии. Если скрипт обнаруживает, что в master ветке репозитария изменений не было, то сборка прерывается.

buildbot.sh


Этот скрипт вызывает build-mc-from-git.sh и в случае успешного завершения делает дополнительную проверку бинарного пакета в piuparts и если ошибок нет, то запускает процесс сборки целей (squeeze-i386, squeeze-amd64, natty-i386 и т.д.). После каждой успешной сборки обновляется временная структура репозитария. Если все цели собраны успешно и buildbot.sh был вызван одним из заданий CRON (mc-release-builds.sh или mc-nightly-builds.sh), то запускается скрипт обновления моего репозитария. В этот момент обновляется служебная информация APT, подписываются файлы Release и обновляется серверная копия.

Сейчас полный цикл сборки 8 таргетов занимает чуть больше часа. В будущем возможно расширю таргеты на rpm-based дистрибутивы (насколько я понял, апстрим так и не восстановил нормальную работу предыдущего buildbot'a). Дополнительную инфу или посильный саппорт можно получить на страничке проекта.
Tags:
Hubs:
+21
Comments 2
Comments Comments 2

Articles