Продолжаю адаптировать для ii статьи из корпоративного бложика.
Побудило на написание этой статьи, то что нет нормальной статьи где просто объясняется сборка деб-пакета без премудростей.
Конечно, существует книга от меинтейнеров Debian GNU/Linux и она хороша! Но въехать сразу не получиться.
А ведь на начальном этапе нам скорее всего захочется опакетить свой простой срипт не углубляясь в дебри debian/rules, и.т.д.
Если возникнут вопросы, то спрашивайте. На текущий момент я меинтейню около 40 пакетов + отвечаю за управление репозиториями.
Статья начинается тут.
--
* Сборка deb-пакета
*Важно*
Устанавливаем переменные окружения
cat >>~/.bashrc <<EOF export DEBEMAIL="your.email.address@example.org" export DEBFULLNAME="Firstname Lastname" EOF . ~/.bashrc
* Генерация ключа GPG
Ставим GnuPG(скорее всего уже стоит):
apt-get install gnupg
Генерируем ключ:
gpg --gen-key gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? 1 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) Requested keysize is 2048 bits Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0) 2y Key expires at Fri Feb 24 06:23:31 2017 UTC Is this correct? (y/N) y You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form: "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" Real name: Vasya Pupkin Email address: vasya@pupkin.org Comment: Primary key for sign You selected this USER-ID: "Vasya Pupkin (Primary key for sign) <vasya@pupkin.org>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O You need a Passphrase to protect your secret key. You don't want a passphrase - this is probably a *bad* idea! I will do it anyway. You can change your passphrase at any time, using this program with the option "--edit-key". We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. ...+++++ .........+++++ We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. .+++++ .+++++ gpg: /home/vasya/.gnupg/trustdb.gpg: trustdb created gpg: key B8FB4F1B marked as ultimately trusted public and secret key created and signed. gpg: checking the trustdb gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u gpg: next trustdb check due at 2017-02-24 pub 2048R/B8FB4F1B 2015-02-25 [expires: 2017-02-24] Key fingerprint = 7ADC D709 8FCD 1BCE 78BB 8B2C 9CE1 ABB8 B8FB 4F1B uid Vasya Pupkin (Primary key for sign) <vasya@pupkin.org> sub 2048R/FC16A5D6 2015-02-25 [expires: 2017-02-24]
Отвечаем на простые вопросы, вводим свое настоящее имя, почту и пароль. Затем gpg попросит вас совершать какие-нибудь действия для лучшей энтропии.
Экспортируем открытый ключ:
$ gpg --list-key /home/vasya/.gnupg/pubring.gpg ------------------------ pub 2048R/B8FB4F1B 2015-02-25 [expires: 2017-02-24] uid Vasya Pupkin (Primary key for sign) <vasya@pupkin.org> sub 2048R/FC16A5D6 2015-02-25 [expires: 2017-02-24] $ gpg -a --export 'Vasya Pupkin (Primary key for sign) <vasya@pupkin.org>' > vasya.pub
Отправляем получившийся файлик администратору вашего репозитория.
Смысл в том, что проверка подлинности сборщика происходит при помощи сверки подписи пакета при загрузке его в репозиторий.
Устанавливаем необходимые пакеты для сборки:
apt-get install debhelper dh-make dh-make-perl devscripts
* Hello world!
Создадим структуру
$ mkdir hello-world-0.0 $ cd hello-world-0.0 $ dh_make -n -s -e vasya@pupkin.org -c gpl3 -y Maintainer name : vasya Email-Address : vasya@pupkin.org Date : Wed, 25 Feb 2015 06:48:44 +0000 Package Name : hello-world Version : 0.0 License : gpl3 Type of Package : Single Currently there is no top level Makefile. This may require additional tuning. Done. Please edit the files in the debian/ subdirectory now. You should also check that the hello-world Makefiles install into $DESTDIR and not in / .Не обращаем внимания на то, что dh_make ругается на отсутсвие мейкфайла -- он нам и не нужен.
Смотрим, что нам нагенерили скрипты:
. |-- debian | |-- README | |-- README.Debian | |-- README.source | |-- changelog | |-- compat | |-- control | |-- copyright | |-- docs | |-- emacsen-install.ex | |-- emacsen-remove.ex | |-- emacsen-startup.ex | |-- hello-world.cron.d.ex | |-- hello-world.default.ex | |-- hello-world.doc-base.EX | |-- init.d.ex | |-- manpage.1.ex | |-- manpage.sgml.ex | |-- manpage.xml.ex | |-- menu.ex | |-- postinst.ex | |-- postrm.ex | |-- preinst.ex | |-- prerm.ex | |-- rules | |-- source | | `-- format | `-- watch.ex `-- hello_world.shИз всего того, что находится в ./debian/ мы оставим только:
. |-- debian | |-- changelog | |-- compat | |-- control | |-- copyright | `-- rules `-- hello_world.sh
Редактируем ./debian/changelog и приводим его к следующему виду:
$ vim ./debian/changelog hello-world (0.1) updates; urgency=low * Initial Release. -- Vasya <vasya@pupkin.org> Wed, 25 Feb 2015 06:48:44 +0000 :wq
В дальнейшем для бампа версии рекомендую использовать dch -i
Создадим файл ./debian/install
* Про исходники с ./configure make make install
Для облегчения заполнения файла рекомендую воспользоваться данным методом
$ ./configure --prefix=<YOUR_PREFIX> $ make && make install $ cd <YOUR_PREFIX> $ for i in `find -type f | sed 's/^..//'`; do echo $(basename "$i") "usr/$(dirname $i)"; done > <SOURCE_DIR>/debian/install
На примере пакета smcroute файл install будет таким
mcsender usr/bin smcroute usr/bin mcsender.8 usr/share/man/man8 smcroute.8 usr/share/man/man8 smcroute.conf usr/share/doc/smcroute ChangeLog usr/share/doc/smcroute smcroute.init usr/share/doc/smcroute AUTHORS usr/share/doc/smcroute COPYING usr/share/doc/smcroute TODO usr/share/doc/smcroute README usr/share/doc/smcroute Обратите внимание, что переде путем не стоит первого '/' -- это правильно.
* Продолжаем про Hello World!
./debian/control, главный файл. Но в таком пакете, как у нас там нечего редактировать практически:
Source: hello-world Section: dev Priority: extra Maintainer: Vasya Pupkin <vasya@pupkin.org> Build-Depends: debhelper (>= 8.0.0) Standards-Version: 3.9.3 Homepage: <insert the upstream URL, if relevant> #Vcs-Git: git://git.debian.org/collab-maint/hello-world.git #Vcs-Browser: http://git.debian.org/?p=collab-maint/hello-world.git;a=summary Package: hello-world Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: My first debian package
* debuild
Собираем пакет:
$ debuild -k'Vasya Pupkin (Primary key for sign) <vasya@pupkin.org>' # Вывод пропущен signfile hello-world_0.0.dsc Vasya Pupkin (Primary key for sign) <vasya@pupkin.org> signfile hello-world_0.0_amd64.changes Vasya Pupkin (Primary key for sign) <vasya@pupkin.org> Successfully signed dsc and changes files
Через опцию -k можно указать какой использовать ключ, если он у вас, как и у меня, не один.
Мы получили в итоге такие вот файлы:
hello-world-0.0 hello-world_0.0.dsc hello-world_0.0.tar.gz hello-world_0.0_amd64.build hello-world_0.0_amd64.changes hello-world_0.0_amd64.deb
* debrelease/dupload/dput
Настало время загрузить пакет в репозиторий. Конфиг для debrelease/dupload:
cat > ~/.dupload.conf << EOF package config; $preupload{'changes'} = '/usr/share/dupload/gpg-check %1'; $cfg{'master'} = { fqdn => "example.com", method => "scpb", incoming => "/srv/repo/packages/mini-dinstall/incoming/", # files pass on to dinstall on master which sends emails itself dinstall_runs => 1, }; 1; EOF
Теперь можно залить пакет. Находясь в каталоге с исходниками выполним:
$ debrelease --to master
Конфиг dput:
~/$ cat > .dput.cf << EOF [master] fqdn = example.com method = scp login = * incoming = /srv/repo/packages/mini-dinstall/incoming EOF
Загрузка пакета. Переходим в каталог выше:
$ cd ../ $ dput master hello-world_0.0_amd64.changes
*Мне больше нравится использовать dput, т.к. у debrelease/dupload сносит крышу от ssh на нестандартном порту.*
(ɔ) Difrex <difrex.punk@gmail.com> 2015-2016 and
w1r0x <vv1r0x@gmail.com> 2015
Лицензия Creative Commons
Это произведение доступно по лицензии Creative Commons «Attribution-ShareAlike» («Атрибуция — На тех же условиях») 4.0 Всемирная.