Продолжение
Мало кто из знакомых со словами linux, *bsd не знает о Midnight Commander. Я не слишком ошибусь, если скажу, что все поначалу пользовались им. Отличный инструмент для задач, которые он решает, к тому же доступный на многих платформах. Последнее время проект, ранее развиваемый под крылом gnome.org, получил вторую жизнь. Новый сайт проекта радует темпами развития. Вот только поддержка актуальных версий пакетов в дистрибутивах хромает.
Последнее, что доступно в Debian — 4.7.0.9, и это при том, что совсем недавно вышел 4.7.5.4 в котором есть ряд вкусностей. Проект предоставлял бинарные сборки для RedHat-based систем и не поддерживал таковые для Debian/Ubuntu. Я решил восполнить этот пробел, запустив автоматическую сборочную среду.
В процессе подготовки и запуска сборочной среды появилась необходимость автоматизации некоторых из операций:
Входит в базовый функционал сборочной среды. Собственно все и затевалась для сборки в пакеты последних изменений с целью их тестирования. При запуске проверяет, были ли изменения в репозитарии с момента последней удачной сборки пакета. Если их нет, то сборка останавливается.
Если изменения найдены, то запускается проверка на способность правильно компилироваться и выполнять установку. Для этого выполняются:
Если предыдущий этап выполнен без ошибок, то начинается пакетирование исходников. При выполнении «make dist» создается архив вида mc-<version>.tar.gz который далее приводится к виду mc_<version>~git<YYYYMMDD>.orig.tar.gz. Далее полученный архив распаковывается, в него добавляется debian-специфичные части, инкрементируется версия пакета и запускается процесс сборки.
Если сборка пакета проходит успешно, то начинается проверка на соответствие Debian Policy. Сперва пакет проверяется в lintian (вывод сохраняется в отдельный файл для быстрого анализа ошибок), затем в piuparts. Если пакет успешно проходит проверки, начинается сборка под целевые платформы.
Для управления локальным репозитарием используется apt-ftparchive. После запуска процедуры обновления из сборочной среды получаются последние собранные версии. Обновляется служебная информация и подписываются файлы Release. Для подписи файлов в автоматическом режиме пришлось сгенерировать подключ для уже существующего и доверить его gpg-agent'у.
Таким образом решается проблема утечки ключа, который используется для подписи пакетов — можно создать revocation key и обновить основной ключ на серверах. При этом основной секретный ключ отсутствует на сервере сборочной среды.
Для закачки изменений в локальном репозитарии на сервер использован rsync. Я не стал создавать для rsync ssh ключ без пароля, а сделал его доступным через ssh-agent. При необходимости это позволит заблокировать ключ одной командой.
Чтобы быть в курсе выхода новых стабильных версий настроен uscan, который будучи запущен с ключем --report, проверяет доступность новых версий в www.midnight-commander.org/download пропуская при этом версии вида X.X.X-preY. При наличии положительного ответа от uscan запускается сборка релиза, которая в итоге попадает в основную ветку моего репозитария.
Настройки APT для стабильных версий:
Настройки APT для ночных сборок:
Чтобы версия из ночных сборок не заменяла стабильный релиз, нужно прописать в /etc/apt/preferences
UPD1: Чтобы APT не ругался на невозможность проверки ключа, перед использованием репозитария нужно импортировать мой публичный ключ (заодно приплывет подключ, который я использую для подписи пакетов). Например так:
или
Мало кто из знакомых со словами linux, *bsd не знает о Midnight Commander. Я не слишком ошибусь, если скажу, что все поначалу пользовались им. Отличный инструмент для задач, которые он решает, к тому же доступный на многих платформах. Последнее время проект, ранее развиваемый под крылом gnome.org, получил вторую жизнь. Новый сайт проекта радует темпами развития. Вот только поддержка актуальных версий пакетов в дистрибутивах хромает.
Последнее, что доступно в Debian — 4.7.0.9, и это при том, что совсем недавно вышел 4.7.5.4 в котором есть ряд вкусностей. Проект предоставлял бинарные сборки для RedHat-based систем и не поддерживал таковые для Debian/Ubuntu. Я решил восполнить этот пробел, запустив автоматическую сборочную среду.
В процессе подготовки и запуска сборочной среды появилась необходимость автоматизации некоторых из операций:
- сборка пакета из GIT проекта Midnight Commander;
- проверка доступности нового релиза;
- обновление локального репозитария;
- обновление серверного репозитария.
Сборка пакета из GIT
Входит в базовый функционал сборочной среды. Собственно все и затевалась для сборки в пакеты последних изменений с целью их тестирования. При запуске проверяет, были ли изменения в репозитарии с момента последней удачной сборки пакета. Если их нет, то сборка останавливается.
Если изменения найдены, то запускается проверка на способность правильно компилироваться и выполнять установку. Для этого выполняются:
./autogen.sh
./configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib/mc
make dist
make
make install DESTDIR=/tmp/mc
Если предыдущий этап выполнен без ошибок, то начинается пакетирование исходников. При выполнении «make dist» создается архив вида mc-<version>.tar.gz который далее приводится к виду mc_<version>~git<YYYYMMDD>.orig.tar.gz. Далее полученный архив распаковывается, в него добавляется debian-специфичные части, инкрементируется версия пакета и запускается процесс сборки.
Если сборка пакета проходит успешно, то начинается проверка на соответствие Debian Policy. Сперва пакет проверяется в lintian (вывод сохраняется в отдельный файл для быстрого анализа ошибок), затем в piuparts. Если пакет успешно проходит проверки, начинается сборка под целевые платформы.
- Debian Lenny/Squeeze (i386, amd64);
- Ubuntu Maverick/Natty (i386, amd64).
Обновление локального репозитария
Для управления локальным репозитарием используется apt-ftparchive. После запуска процедуры обновления из сборочной среды получаются последние собранные версии. Обновляется служебная информация и подписываются файлы Release. Для подписи файлов в автоматическом режиме пришлось сгенерировать подключ для уже существующего и доверить его gpg-agent'у.
Таким образом решается проблема утечки ключа, который используется для подписи пакетов — можно создать revocation key и обновить основной ключ на серверах. При этом основной секретный ключ отсутствует на сервере сборочной среды.
Обновление серверного репозитария
Для закачки изменений в локальном репозитарии на сервер использован rsync. Я не стал создавать для rsync ssh ключ без пароля, а сделал его доступным через ssh-agent. При необходимости это позволит заблокировать ключ одной командой.
Проверка доступности нового релиза
Чтобы быть в курсе выхода новых стабильных версий настроен uscan, который будучи запущен с ключем --report, проверяет доступность новых версий в www.midnight-commander.org/download пропуская при этом версии вида X.X.X-preY. При наличии положительного ответа от uscan запускается сборка релиза, которая в итоге попадает в основную ветку моего репозитария.
Напоследок
Настройки APT для стабильных версий:
deb http://www.tataranovich.com/debian lenny main deb http://www.tataranovich.com/debian squeeze main deb http://www.tataranovich.com/debian maverick main deb http://www.tataranovich.com/debian natty main
Настройки APT для ночных сборок:
deb http://www.tataranovich.com/debian lenny nightly deb http://www.tataranovich.com/debian squeeze nightly deb http://www.tataranovich.com/debian maverick nightly deb http://www.tataranovich.com/debian natty nightly
Чтобы версия из ночных сборок не заменяла стабильный релиз, нужно прописать в /etc/apt/preferences
Package: * Pin: release c=nightly Pin: origin www.tataranovich.com Pin-Priority: -1
UPD1: Чтобы APT не ругался на невозможность проверки ключа, перед использованием репозитария нужно импортировать мой публичный ключ (заодно приплывет подключ, который я использую для подписи пакетов). Например так:
gpg --keyserver pgp.mit.edu --recv-keys 0x2EE7EF82
gpg --export 0x2EE7EF82 | sudo apt-key add -
или
wget -q -O- http://www.tataranovich.com/tataranovich.asc | sudo apt-key add -