0
Упаковка и развертывание
программ на perl под Debian

Вячеслав Матюхин


May Perl, Москва, 16-17 мая 2009 года
Поиск по блогам
Статистика
• 280 пакетов
• 100000 строк кода
• 200 хостов
• 20 групп хостов
• 20 баз mysql до 100GB каждая
Общие знания про Debian
Debian
Полезные скрипты

Тысячи их.
Debian
Полезные скрипты

Тысячи их.
И все написаны на perl.
Debian
Полезные скрипты
...dh_make, dh-make-perl, debuild, debcommit, dupload, debrelease, dch,
debc, debi, dpkg-buildpack...
Debian
dh_make
• Создает скелет нового пакета
Debian
 dh_make
• Создает скелет нового пакета
• И много мусора:
$ ls debian/
changelog control cron.d.ex docs
emacsen-rem...
Debian
dh_make
• Создает скелет нового пакета
• И много мусора
• Карго-культ!
Debian
Необходимые файлы
•   debian/control - метаданные пакета
•   debian/compat - для debhelper
•   debian/rules - makef...
Debian
debhelper
#!/usr/bin/make -f
clean:
    dh_testdir
    dh_testroot
    dh_clean
    $(MAKE) clean
build:
    $(MAKE...
Debian
CDBS

#!/usr/bin/make -f

include /usr/share/cdbs/1/class/perlmodule.mk
include /usr/share/cdbs/1/rules/debhelper.mk
Debian
dh-make-perl

Одной строкой:
$ dh-make-perl --email=mmcleric@yandex-team.ru

Другой строкой:
$ sudo dh-make-perl --...
Debian
   dh-make-perl

   Одной строкой:
   $ dh-make-perl --email=mmcleric@yandex-team.ru

   Другой строкой:
   $ sudo ...
Наши расширения debhelper
Debhelper
 dh_perldeps


Как отобразить зависимости perl-модулей
в зависимости пакетов?
Debhelper
        dh_perldeps
$ DH_VERBOSE=1 dh_perldeps
         processing file debian/libyandex-unrotate-perl/usr/share...
Debhelper
  dh_perldeps

1. Читаем весь код в пакете
2. Ищем /buses+((?:w+::)*w+)(?:s+(v?[d_.]+))?/sg
3. Просматриваем @IN...
Debhelper
dh_perldeps

До:
$ grep Depends debian/control
Depends: ${perl:Depends}
Debhelper
dh_perldeps

До:
$ grep Depends debian/control
Depends: ${perl:Depends}



После:
$ debc | grep Depends
 Depends...
Debhelper
dh_builddeps
$ dh_builddeps

$ cat debian/control
...
Build-Depends: perl, libyandex-ppb-ssh-perl, libyandex-
un...
Debhelper
  dh_builddeps

- Debian policy запрещает генерировать control
- Иногда некроссплатформенен
+ Зато незаменим для...
Debhelper
dh_perldeps и dh_builddeps

Безумная альтернатива - dpkg-depcheck
• Использует strace
• Тормозит
Debhelper
dh_versions


Q: Для каких пакетов писать версии?
Debhelper
dh_versions


Q: Для каких пакетов писать версии?
A: Для некоторых.
Debhelper
dh_versions

В исходниках:
use version; our $VERSION = qv(‘{{DEBIAN_VERSION}}’) unless
‘{{DEBIAN_VERSION}}’ =~ /...
Debhelper
dh_versions
$ grep Logger ./scheduler.pl
use Yandex::Logger 1.0.2;
$ debuild
...
$ debc | grep Depends
Depends: ...
Debhelper
И снова CDBS

#!/usr/bin/make -f

include /usr/share/cdbs/1/class/perlmodule.mk
# include /usr/share/cdbs/1/rule...
Тестирование
Тестирование
Yandex::Config
# scheduler.pl:
use Yandex::Config ‘yandex-ppb-scheduler/main.cfg’, qw(
   $WORKDIR
   @DISTRIB...
Тестирование
  Yandex::Config

• Дефолтный CONFIG_PATH - “./etc:/etc”
• Проверяет, что параметры объявлены
• Работает на ст...
Тестирование
Yandex::DB
# в коде:
use Yandex::DB;
$db_scheduler = connectdb(“scheduler”);


$ # в консоли:
$ connectdb sch...
Тестирование
Yandex::DB
Yandex::DB::Plugin::File
$ cat /etc/db.d/scheduler
[
  {
    “priority” : 1,
    “base” : “schedul...
Тестирование
Yandex::DB
Yandex::DB::Plugin::Meta
$ cat /etc/db.d/meta
[{
    quot;basequot; : quot;metaquot;,
    quot;hos...
Тестирование
Yandex::DB
Yandex::DB::Plugin::Sandbox
# t/test.t:
$ENV{YANDEX_SANDBOX_DB} = “scheduler,feeds”;
use Yandex::D...
Тестирование
  Yandex::DB
  Yandex::DB::Plugin::Sandbox
• Индивидуальные базы у каждого пользователя
• Пересоздается на ка...
Вячеслав Матюхин
Разработчик

Россия, Москва,
ул. Льва Толстого, 16.

+7 (495) 739-00-00
+7 (495) 739-70-70 — факс

mmcler...
Upcoming SlideShare
Loading in...5
×

Упаковка и развертывание программ на perl под debian‎

1,919

Published on

YAPC Russia 2009 "May Perl 2"

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,919
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Упаковка и развертывание программ на perl под debian‎"

  1. 1. Упаковка и развертывание программ на perl под Debian Вячеслав Матюхин May Perl, Москва, 16-17 мая 2009 года
  2. 2. Поиск по блогам Статистика • 280 пакетов • 100000 строк кода • 200 хостов • 20 групп хостов • 20 баз mysql до 100GB каждая
  3. 3. Общие знания про Debian
  4. 4. Debian Полезные скрипты Тысячи их.
  5. 5. Debian Полезные скрипты Тысячи их. И все написаны на perl.
  6. 6. Debian Полезные скрипты ...dh_make, dh-make-perl, debuild, debcommit, dupload, debrelease, dch, debc, debi, dpkg-buildpackage, dpkg-repack, dh_builddeb, dh_builddeps, dh_clean, dh_clearvcs, dh_compress, dh_css, dh_desktop, dh_fixperms, dh_gconf, dh_gencontrol, dh_install, dh_installcatalogs, dh_installchangelogs, dh_installcron, dh_installdeb, dh_installdebconf, dh_installdefoma, dh_installdirs, dh_installdocs, dh_installemacsen, dh_installexamples, dh_installinfo, dh_installinit, dh_installlogcheck, dh_installlogrotate, dh_installman, dh_installmanpages, dh_installmenu, dh_installmime, dh_installmodules, dh_installpam, dh_installppp, dh_installudev, dh_installwm, dh_installxfonts, dh_installxmlcatalogs, dh_link, dh_listpackages, dh_make, dh_makeshlibs, dh_md5sums, dh_movefiles, dh_perl, dh_perldeps, dh_pycentral, dh_pysupport, dh_python, dh_scrollkeeper, dh_shlibdeps, dh_strip, dh_suidregister, dh_testdir, dh_testroot, dh_testversion, dh_undocumented, dh_usrlocal, dh_versions, cvs-buildpackage, svn- buildpackage, apt-file, debconf, dpkg-parsechangelog, dpkg-repack, lintian...
  7. 7. Debian dh_make • Создает скелет нового пакета
  8. 8. Debian dh_make • Создает скелет нового пакета • И много мусора: $ ls debian/ changelog control cron.d.ex docs emacsen-remove.ex init.d.ex libyapm-perl.default.ex manpage.1.ex manpage.xml.ex postinst.ex preinst.ex README.Debian watch.ex compat copyright dirs emacsen-install.ex emacsen-startup.ex init.d.lsb.ex libyapm-perl.doc-base.EX manpage.sgml.ex menu.ex postrm.ex prerm.ex rules
  9. 9. Debian dh_make • Создает скелет нового пакета • И много мусора • Карго-культ!
  10. 10. Debian Необходимые файлы • debian/control - метаданные пакета • debian/compat - для debhelper • debian/rules - makefile для сборки • debian/changelog
  11. 11. Debian debhelper #!/usr/bin/make -f clean: dh_testdir dh_testroot dh_clean $(MAKE) clean build: $(MAKE) test install: dh_testdir dh_testroot dh_clean -k dh_installdirs $(MAKE) install DESTDIR=debian/$(shell dh_listpackages) binary: install dh_testdir dh_testroot dh_installchangelogs dh_installdocs dh_installexamples dh_installman dh_link dh_compress dh_fixperms dh_perl dh_installdeb dh_gencontrol dh_md5sums dh_builddeb .PHONY: install binary
  12. 12. Debian CDBS #!/usr/bin/make -f include /usr/share/cdbs/1/class/perlmodule.mk include /usr/share/cdbs/1/rules/debhelper.mk
  13. 13. Debian dh-make-perl Одной строкой: $ dh-make-perl --email=mmcleric@yandex-team.ru Другой строкой: $ sudo dh-make-perl --install --cpan Some::Module
  14. 14. Debian dh-make-perl Одной строкой: $ dh-make-perl --email=mmcleric@yandex-team.ru Другой строкой: $ sudo dh-make-perl --install --cpan Some::Module http://wiki.debian.org/Teams/DebianPerlGroup: ...just send a signed mail to debian-perl@lists.debian.org and list the packages you want us to take over.
  15. 15. Наши расширения debhelper
  16. 16. Debhelper dh_perldeps Как отобразить зависимости perl-модулей в зависимости пакетов?
  17. 17. Debhelper dh_perldeps $ DH_VERBOSE=1 dh_perldeps processing file debian/libyandex-unrotate-perl/usr/share/perl5/Yandex/ Unrotate.pm dependent perl modules: warnings, strict, Digest::MD5, Yandex::Logger, Yandex::TmpFile, File::Basename realpath: /usr/share/perl/5.8/warnings.pm -> /usr/share/perl/5.8.8/warnings.pm realpath: /usr/share/perl/5.8/strict.pm -> /usr/share/perl/5.8.8/strict.pm realpath: /usr/lib/perl/5.8/Digest/MD5.pm -> /usr/lib/perl/5.8.8/Digest/MD5.pm realpath: /usr/share/perl/5.8/File/Basename.pm -> /usr/share/perl/5.8.8/File/ Basename.pm dependent debian packages: perl, perl-base, libyandex-logger-perl, perl-modules, libyandex-tmpfile-perl
  18. 18. Debhelper dh_perldeps 1. Читаем весь код в пакете 2. Ищем /buses+((?:w+::)*w+)(?:s+(v?[d_.]+))?/sg 3. Просматриваем @INC в поисках файлов 4. Делаем dpkg -S на каждый файл 5. ??? 6. PROFIT!
  19. 19. Debhelper dh_perldeps До: $ grep Depends debian/control Depends: ${perl:Depends}
  20. 20. Debhelper dh_perldeps До: $ grep Depends debian/control Depends: ${perl:Depends} После: $ debc | grep Depends Depends: libyandex-logger-perl, libyandex-tmpfile-perl, perl (>= 5.6.0-16), perl-base, perl-modules
  21. 21. Debhelper dh_builddeps $ dh_builddeps $ cat debian/control ... Build-Depends: perl, libyandex-ppb-ssh-perl, libyandex- unrotate-perl # [dh_builddeps] previous line is autogenerated ...
  22. 22. Debhelper dh_builddeps - Debian policy запрещает генерировать control - Иногда некроссплатформенен + Зато незаменим для автосборок
  23. 23. Debhelper dh_perldeps и dh_builddeps Безумная альтернатива - dpkg-depcheck • Использует strace • Тормозит
  24. 24. Debhelper dh_versions Q: Для каких пакетов писать версии?
  25. 25. Debhelper dh_versions Q: Для каких пакетов писать версии? A: Для некоторых.
  26. 26. Debhelper dh_versions В исходниках: use version; our $VERSION = qv(‘{{DEBIAN_VERSION}}’) unless ‘{{DEBIAN_VERSION}}’ =~ /DEBIAN/; $ dh_versions В пакете: use version; our $VERSION = qv(’1.0.3’) unless ‘1.0.3’ =~ / DEBIAN/;
  27. 27. Debhelper dh_versions $ grep Logger ./scheduler.pl use Yandex::Logger 1.0.2; $ debuild ... $ debc | grep Depends Depends: libyandex-logger-perl (>= 1.0.2), perl (>= 5.6.0-16), perl-base, perl-modules
  28. 28. Debhelper И снова CDBS #!/usr/bin/make -f include /usr/share/cdbs/1/class/perlmodule.mk # include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/rules/ppb.mk
  29. 29. Тестирование
  30. 30. Тестирование Yandex::Config # scheduler.pl: use Yandex::Config ‘yandex-ppb-scheduler/main.cfg’, qw( $WORKDIR @DISTRIBUTE_TARGETS ); # тесты: BEGIN { $ENV{CONFIG_PATH} = ‘t/etc’; } system(“./scheduler.pl”);
  31. 31. Тестирование Yandex::Config • Дефолтный CONFIG_PATH - “./etc:/etc” • Проверяет, что параметры объявлены • Работает на стадии компиляции
  32. 32. Тестирование Yandex::DB # в коде: use Yandex::DB; $db_scheduler = connectdb(“scheduler”); $ # в консоли: $ connectdb scheduler
  33. 33. Тестирование Yandex::DB Yandex::DB::Plugin::File $ cat /etc/db.d/scheduler [ { “priority” : 1, “base” : “scheduler”, “host” : “db.feeds.yandex.net”, “pass” : “pass”, “user” : “user”, } ]
  34. 34. Тестирование Yandex::DB Yandex::DB::Plugin::Meta $ cat /etc/db.d/meta [{ quot;basequot; : quot;metaquot;, quot;hostquot; : quot;meta-db.feeds.yandex.netquot;, ... }, ...] [meta-dbs3.feeds.yandex.net] meta> select host, user, passwd, base from Bases where name = ‘scheduler’; +-----------------------+-----------+-----------+-----------+ | host | user | passwd | base | +-----------------------+-----------+-----------+-----------+ | db.feeds.yandex.net | user | pass | scheduler | +-----------------------+-----------+-----------+-----------+
  35. 35. Тестирование Yandex::DB Yandex::DB::Plugin::Sandbox # t/test.t: $ENV{YANDEX_SANDBOX_DB} = “scheduler,feeds”; use Yandex::DB; $db = connectdb(“scheduler”); ... # заполнить базу временными данными $ENV{YANDEX_SANDBOX_DB_EXISTING} = $ENV{YANDEX_SANDBOX_DB}; system(“./scheduler.pl”); ... # проверить содержимое базы
  36. 36. Тестирование Yandex::DB Yandex::DB::Plugin::Sandbox • Индивидуальные базы у каждого пользователя • Пересоздается на каждый запуск тестов • Но остается работать после запуска тестов
  37. 37. Вячеслав Матюхин Разработчик Россия, Москва, ул. Льва Толстого, 16. +7 (495) 739-00-00 +7 (495) 739-70-70 — факс mmcleric@yandex-team.ru
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×