kirillfish / debuilder

Home Page:http://datacentricalliance.github.io/debuilder

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

#Собрать пакет datacentric-debuild

git clone https://github.com/DataCentricAlliance/debuilder.git
cd debuilder/debuilder
sudo apt-get install debhelper devscripts python-opster python-debian python-tz
./deb.py build
#пакет будет лежать в папке build

#Настройка окружения

#устанавливаем пакет datacentric-debuild
sudo apt-get install datacentric-debuild

#устанавливаем переменные окружения
export DEBEMAIL="i.ivanov@datacentric.ru"
export DEBFULLNAME="Ivan Ivanov"
export DEBREPOSITORY="example.repo.net:/opt/ubuntu/mini-dinstall/incoming/"

#Увеличить версию пакета

#добавили запись в changelog и собрали с новой версией
./deb.py build -v <maj|min|mntn|build> -m <message>

#changelog надо закоммитить (лучше вместе с остальными изменениями пакета)
git commit -a -m "теперь точно всё работает"

#мержим ветку через gitlab
git push origin ...

#кладём пакет в репозиторий
./deb.py pub

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

#создаём папку где будет лежать наш проект
mkdir mypackage
cd mkdir

#создаём папку debian, changelog и файл deb.py
#в папку debian нужно класть post/pre скрипты
mkdir debian
touch debian/changelog
touch deb.py
chmod a+x deb.py

#добавляем всё в git
git add *

#редактируем файл deb.py, смотреть "Описание deb.py"
vim deb.py
 
#добавляем запись в changelog и собираем пакет
./deb.py build -v min -m "Initial release"

#коммитим, проходим ревью, мёржим
git commit -a -m "add new package mypackage"

#отправляем пакет в репозиторий
./deb.py pub

#Описание deb.py

Пример:

!/usr/bin/python

from facetz.utils.debuild import *

dispatch(
    Package(
        name = "mypackage",
        section = "facetz",
        description = "Tool that is never falls",
        depends = "python-pymongo",
        conflicts = "myoldpackage",

        commands = [Copy(["mypackage.*.cfg"], "/etc/mypackage/"),
                    EnvLink("/etc/mypackage/mypackage.$ENV.cfg", "/etc/mypackage/mypackage.cfg"),
                    Copy(["tool.py", "common.py"], "/opt/facetz/mypackage/")              
                    Mkdir("/var/log/facetz/mypackage")]
    )
)
  • dispatch - нужен для разбора коммандной строки
  • Package - класс содержащий описание пакета:
    • name - имя пакета
    • section - секция пакета https://www.debian.org/doc/debian-policy/ch-archive.html#s-subsections
    • description - описание пакета
    • depends - зависимости от других deb-пакетов
    • conflicts - конфликты с другими deb-пакетами
    • provides - для виртуальных пакетов
    • commands - команды сборщику пакета:
      • Copy(wildcards, dest) - копирует файлы/папки в dest. Если dest заканчивается на '/' то копирует в папку dest. Если dest не заканчивается '/' то считается что при копировании вы хотите переименовать файл и он будет скопирован в папку dirname(dest) и назван basename(dest)

      • Copy(["myconf.cfg"], "/etc/facetz/tool/tool.cfg") - файл myconf.cfg будет скопирован в папку /etc/facetz/tool и переименован в tool.cfg

      • Copy(["myconf.cfg"], "/etc/facetz/tool/") - файл myconf.cfg будет скопирован в папку /etc/facetz/tool и не будет переименован

      • Copy(["conf"], "/etc/facetz/tool") - если conf - это папка то она будет переименована в tool и скопирована в /etc/facetz

      • Mkdir(dir_name, user=root, group=root) - создаст папку dir_name, добавляет chown user:group dir в postrm скрипт

      • EnvLink(pattern, link_name=None) - Если у нас разные конфиги для каждого из окружений, к примеру tool.development.cfg, tool.testing.cfg, tool.production.cfg, чтобы не создавать три пакета с каждым из этих конфигов, можно использовать EnvLink. Для этого нужно положить все конфиги в один пакет командой Copy а затем создать ссылку на конфиг с помощью EnvLink.

      #Для нашего примера
      Copy(["tool.*.cfg"], "/etc/facetz/tool/")
      EnvLink("/etc/facetz/tool/tool.$ENV.cfg", "/etc/facetz/tool/tool.cfg")
      EnvLink создаст символьную ссылку /etc/facetz/tool/tool.cfg -> /etc/facetz/tool/tool.development.cfg если на машине установлен пакет facetz-env-development или /etc/facetz/tool/tool.cfg -> /etc/facetz/tool/tool.production.cfg если на машине стоит пакет facetz-env-production. Таки образом мы можем в нашей программе использовать один путь для всех конфигов "/etc/facetz/too/tool.cfg", а какой именно конфиг будет подключем определяется созданной в момент установки пакета ссылкой. Как это работает? Есть пакеты окружения facez-env-development, facetz-env-testing, facetz-env-production и виртуальный пакет facetz-env. Каждый из них устанавливает на машину файл /etc/facetz/env/env.cfg который содержит одну строчку "development", "testing" или "production". На машине может стоять только один из них. Команда EnvLink добавляет в postinst скрипт две строки:
      ENV=$(cat /etc/facetz/env/env.cfg)
      ln -sf <pattern> <link_name>
      и в postrm скрипт:
      extra_portrm
      rm -rf <link_name>