Как стать автором
Обновить

deb-пакет на коленке

Время на прочтение3 мин
Количество просмотров12K
Задача: создать пакет для Debian для выливки демона/сайта на сервер.
Я никогда ранее не работал с deb-пакетами — так что решение может быть не оптимальным. Но оно работает и достаточно просто в использовании.

Подготовка

В первую очередь для переодических выливок на сервер нам понадобится версионность кода. Если оспользуется svn — то, скорее всего, можно использовать номер ревизии. Так как я использую git — написал простенький скрипт для ведения версии проекта: tag.sh
Для увеличения версии проекта вызываем ./tag.sh build, ./tag minor или ./tag major. Скрипт создаёт метки вида v<MAJOR>.<MINOR>.<BUILD> (к примеру v0.1.25)
Для получения версии вызываем git describe --match=v* HEAD и получаем в результате версию в виде v0.2.1 (либо v0.2.1-59-g919ab19 если после тага были коммиты).

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

Из всех файлов конфигурации пакета важными показались лишь 2:
control — описание пакета
conffiles — описание конфигурационных файлов пакета (при установке новой версии apt спросит заменить ли файл или оставить старую версию).

control

Формат файла достаточно простой:
Package: ИМЯ_ПАКЕТА
Version: ВЕРСИЯ - получаная git describe
Architecture: АРХИТЕКТУРА - amd64 если есть бинарники или all - если только скрипты
Depends: ЗАВИСИМОСТИ - можно упустить
Maintainer: ВАШЕ_ИМЯ
Description: ОПИСАНИЕ

К примеру:
Package: ggseductionserver
Version: v0.2.1-59-g919ab19
Architecture: amd64
Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.1.1), libboost-system1.38.0 (>=1.38.0),
libboost-thread1.38.0 (>=1.38.0), libboost-regex1.38.0 (>=1.38.0), libboost-serialization1.38.0 (>=1.38.0), libboost-program-options1.38.0 (>=1.38.0),
tokyotyrant, tokyocabinet, mysql-client (>=5.0), libssl0.9.8 (>=0.9.8), libreadline5 (>= 5.2), libmysql++3 (>= 3.0),
libpcre3 (>= 7.6), libpcrecpp0 (>= 7.6), libgd2-xpm (>= 2.0)
Maintainer: Alexander Fedora <alexander.fedora at gmail.com>
Description: glagol games server
<ПРОБЕЛ>This is server

Зависимости можно получить используя ldd и apt-file
$ ldd ./build/server | grep libboost_thread
/usr/lib/libboost_thread-mt.so.1.38.0
$ apt-file search /usr/lib/libboost_thread-mt.so.1.38.0
libboost-thread1.38.0: /usr/lib/libboost_thread-mt.so.1.38.0
libboost1.38-dbg: /usr/lib/debug/usr/lib/libboost_thread-mt.so.1.38.0

conffiles

В этом файле находится список конфигурационных файлов пакета. Пример:
/etc/seduction/seductiond.conf
/etc/seduction/seductiond.log.properties


Создание пакета

Я решил использовать простой шелл скрипт для создания пакета. Действия по порядку:
  1. Создаём директорию deb
  2. Создаём директорию deb/DEBIAN
  3. Получаем текущую версию проекта version=`git describe --match=v* HEAD`
  4. Записываем в deb/DEBIAN/control описание пакета, а в качестве версии используем $version
  5. Записываем в файл deb/DEBIAN/conffiles список конфигурационных файлов
  6. В директорию deb/ записываем файлы прокета как будто deb/ — это рут диска (к примеру deb/usr/local/bin/exe_name, deb/etc/config_name и тд)
  7. Создаём пакет при помощи комманды dpkg -b deb/ ИМЯПАКЕТА_$version'.deb'

После имени пакета обязательно поставить подчеркивание (_) перед версией.
Пример рабочего скрипта можно посмотреть тут (это пример для с++ демона, для сайта на php пример тут)

Создание репозитория на сервере

Устанавливаем пакет dpkg-dev.
Создаем директорию /var/opt/repo/, а в ней 2 подддиректории binary и source.
Заливаем пакеты в binary и выполняем комманду для создания каталога архива:

dpkg-scanpackages -m binary /dev/null | gzip -9c > binary/Packages.gz

Записываем shell-скрипт для автоматизации апдейта сервера:

rsync -av -e ssh $HOME/projects/repo/*.deb server_name:/var/opt/repo/ || exit 1
ssh server_name 'cd /var/opt/repo; dpkg-scanpackages -m binary /dev/null | gzip -9c > binary/Packages.gz' || exit 1


Поднятие nginx для доступа к репозиторию

Устанавливаем nginx, добавляем новый сайт:
$ cat /etc/nginx/sites-available/repo
server {
listen 9977;
server_name localhost;
access_log /var/log/nginx/repo.access.log;
location / {
autoindex on;
allow 127.0.0.1;
allow 192.168.0.2;
root /var/opt/repo;
}
}


Поднимаем сайт и убеждаемся что он работает.
$ ln -s /etc/nginx/sites-available/repo /etc/nginx/sites-enabled/repo
$ sudo /etc/init.d/nginx restart
$ wget 192.168.0.1:9977/binary/Packages.gz


Установка пакетов из созданного репозитория

Добавляем в /etc/apt/sources.list наш сайт:
deb 192.168.0.1:9977/ binary/
И устанавливаем пакет:
$ sudo apt-get update
$ sudo apt-get install package_name


Заключение

При установке пакета apt-get будет вопить, что пакет не может быть аутентифицирован. В принципе можно добавить цифровую подпись к пакету, но мы то и так знаем что он устанавливается с нашего репозитория — поэтому можно добавить ключики -y --force-yes и устанавливать пакет в автоматическом режиме.

PS. сильно не пинайте — это мой первый пост.
Теги:
Хабы:
Всего голосов 73: ↑63 и ↓10+53
Комментарии47

Публикации

Истории

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань