Your SlideShare is downloading. ×
Упаковка и развертывание программ на perl под debian‎
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

1,887

Published on

YAPC Russia 2009 "May Perl 2"

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,887
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Упаковка и развертывание программ на perl под Debian Вячеслав Матюхин May Perl, Москва, 16-17 мая 2009 года
  • 2. Поиск по блогам Статистика • 280 пакетов • 100000 строк кода • 200 хостов • 20 групп хостов • 20 баз mysql до 100GB каждая
  • 3. Общие знания про Debian
  • 4. Debian Полезные скрипты Тысячи их.
  • 5. Debian Полезные скрипты Тысячи их. И все написаны на perl.
  • 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. Debian dh_make • Создает скелет нового пакета
  • 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. Debian dh_make • Создает скелет нового пакета • И много мусора • Карго-культ!
  • 10. Debian Необходимые файлы • debian/control - метаданные пакета • debian/compat - для debhelper • debian/rules - makefile для сборки • debian/changelog
  • 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. Debian CDBS #!/usr/bin/make -f include /usr/share/cdbs/1/class/perlmodule.mk include /usr/share/cdbs/1/rules/debhelper.mk
  • 13. Debian dh-make-perl Одной строкой: $ dh-make-perl --email=mmcleric@yandex-team.ru Другой строкой: $ sudo dh-make-perl --install --cpan Some::Module
  • 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. Наши расширения debhelper
  • 16. Debhelper dh_perldeps Как отобразить зависимости perl-модулей в зависимости пакетов?
  • 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. Debhelper dh_perldeps 1. Читаем весь код в пакете 2. Ищем /buses+((?:w+::)*w+)(?:s+(v?[d_.]+))?/sg 3. Просматриваем @INC в поисках файлов 4. Делаем dpkg -S на каждый файл 5. ??? 6. PROFIT!
  • 19. Debhelper dh_perldeps До: $ grep Depends debian/control Depends: ${perl:Depends}
  • 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. 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. Debhelper dh_builddeps - Debian policy запрещает генерировать control - Иногда некроссплатформенен + Зато незаменим для автосборок
  • 23. Debhelper dh_perldeps и dh_builddeps Безумная альтернатива - dpkg-depcheck • Использует strace • Тормозит
  • 24. Debhelper dh_versions Q: Для каких пакетов писать версии?
  • 25. Debhelper dh_versions Q: Для каких пакетов писать версии? A: Для некоторых.
  • 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. 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. 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. Тестирование
  • 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. Тестирование Yandex::Config • Дефолтный CONFIG_PATH - “./etc:/etc” • Проверяет, что параметры объявлены • Работает на стадии компиляции
  • 32. Тестирование Yandex::DB # в коде: use Yandex::DB; $db_scheduler = connectdb(“scheduler”); $ # в консоли: $ connectdb scheduler
  • 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. Тестирование 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. Тестирование 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. Тестирование Yandex::DB Yandex::DB::Plugin::Sandbox • Индивидуальные базы у каждого пользователя • Пересоздается на каждый запуск тестов • Но остается работать после запуска тестов
  • 37. Вячеслав Матюхин Разработчик Россия, Москва, ул. Льва Толстого, 16. +7 (495) 739-00-00 +7 (495) 739-70-70 — факс mmcleric@yandex-team.ru

×