Репозиторий APT поверх Google Code Project Hosting
Давно было интересно создать собственный APT-репозиторий, и отдельно было интересно сделать это поверх хостинга Google Code (для Molinos CMS в частности). В связи с упаковкой sayhours дошли до этого руки.
Оформление репозитория
Главное в репозитории — файл «Packages.gz». Он содержит описание всех пакетов репозитория. Этот файл логичнее всего держать в репозитории Mercurial или Subversion, т.к. меняться он будет часто и перезаливать его как обычный файл для скачивания будет неудобно. Поэтому пусть он находится в корне репозитория.
Пакеты нужно временно свалить в папку «files», находящуюся в корне того же репозитория. Теперь для создания файла «Packages.gz» можно выполнить такую команду:
$ dpkg-scanpackages files | gzip -9c > Packages.gz
В результате должны получиться следующие файлы:
files/something.deb
Packages.gz
Папку «files» можно после этого удалить, а можно и оставить. Чтобы её
содержимое случайно не ушло в репозиторий и не мозолило глаза при выполнении hg
status
, можно в «.hgignore» добавить строку:
files/.*
Файл «Packages.gz» отправляется в репозиторий Mercurial (Google Code), его полный URL выглядит так:
http://проект.googlecode.com/hg/Packages.gz
Теперь репозиторий можно добавить в «/etc/apt/sources.list» так:
deb http://проект.googlecode.com/ hg/
Такая запись говорит, что базовый адрес репозитория — «проект.googlecode.com», а файл с описанием пакетов лежит в папке «hg». Эта запись наверняка отличается от остальных записей, которые имеют вид «deb URL word word», и это нормально: существует два формата репозиториев, для Google Code подходит только один.
Теперь пакеты можно загружать в Google Code (можно скриптами, кстати). Прямые ссылки на файлы при этом имеют такой вид:
http://проект.googlecode.com/files/something.deb
То есть размещаются они в виртуальной папке «files», поэтому и надо было сваливать пакеты в одноимённую временную папку при создании файла «Packages.gz».
Пример автоматического обновления репозитория
Допустим, нужно добавить в репозиторий файл «~/something.deb». Параметры будут отличаться, но в общем скрипт будет выглядеть примерно так:
cd ~/src/проект/
hg pull -u
mkdir -p files
cp ~/something.deb files/
googlecode-upload.py -s "Описание файла" -p проект -l Type-Package,OpSys-Linux files/something.deb
dpkg-scanpackages files | gzip -9c > Packages.gz
hg commit Packages.gz -m "Updating Packages.gz"
hg push
Использование без Google Code
Чтобы репозиторий работал без Google Code нужно всё делать так же, только папку «files» удалять не надо, а файл «Packages.gz» должен попадать на корень сайта, вот такие должны быть ссылки:
http://example.com/Packages.gz
http://example.com/files/something.deb
Ничего сложного.
Следить за развитием событий можно через RSS ленту или почтовую рассылку.