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

    Начало

    В первой части я представил новый сервис сборки бинарных пакетов файлового менеджера 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). Дополнительную инфу или посильный саппорт можно получить на страничке проекта.
    Метки:
    • +21
    • 1,4k
    • 2
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 2
    • 0
      Весьма интересно! А почему не используете git-hooks?
      • 0
        Можно пример, как их можно удачно применить?

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