Репозиторий APT поверх Google Code Project Hosting

2010.08.05

Давно было интересно создать собственный 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 ленту или почтовую рассылку.