Начало
В первой части я представил новый сервис сборки бинарных пакетов файлового менеджера Midnight Commander для Debian/Ubuntu. В комментариях справедливо указали на недостаток технического описания самой среды и я пообещал, что выложу подробности как только код будет приведен в божеский вид. Прошло две недели, появилось немного времени, чтобы стабилизировать функционал и причесать код (он все еще ужасен, но вроде работает как задумано), так что пора выполнить обещанное.
Я специально не включаю в топик исходные коды, их немало, и на мой взгляд статья получается перегруженной. Кому интересно, может скачать их с googlecode.
Сборочная среда состоит из нескольких shell-скриптов:
Как я уже упомянул ранее, это наиболее важная часть сборочной среды. Выполняет два вида операций: сборка/пересборка релизов и сборка ночных срезов из GIT. Если была выбрана сборка релиза, то скрипт:
Сборка ночного среза отличается только тем, что исходники формируются из GIT репозитария и отличается код инкрементирования версии. Если скрипт обнаруживает, что в master ветке репозитария изменений не было, то сборка прерывается.
Этот скрипт вызывает 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). Дополнительную инфу или посильный саппорт можно получить на страничке проекта.
В первой части я представил новый сервис сборки бинарных пакетов файлового менеджера 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). Дополнительную инфу или посильный саппорт можно получить на страничке проекта.