• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Упаковка и развертывание программ на perl под debian‎
 

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

on

  • 2,982 views

YAPC Russia 2009 "May Perl 2"

YAPC Russia 2009 "May Perl 2"

Statistics

Views

Total Views
2,982
Views on SlideShare
2,979
Embed Views
3

Actions

Likes
0
Downloads
9
Comments
0

1 Embed 3

http://www.slideshare.net 3

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • Упаковка и развертывание программ на 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-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...
    • Debian dh_make • Создает скелет нового пакета
    • 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
    • Debian dh_make • Создает скелет нового пакета • И много мусора • Карго-культ!
    • Debian Необходимые файлы • debian/control - метаданные пакета • debian/compat - для debhelper • debian/rules - makefile для сборки • debian/changelog
    • 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
    • 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 --install --cpan Some::Module
    • 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.
    • Наши расширения debhelper
    • Debhelper dh_perldeps Как отобразить зависимости perl-модулей в зависимости пакетов?
    • 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
    • Debhelper dh_perldeps 1. Читаем весь код в пакете 2. Ищем /buses+((?:w+::)*w+)(?:s+(v?[d_.]+))?/sg 3. Просматриваем @INC в поисках файлов 4. Делаем dpkg -S на каждый файл 5. ??? 6. PROFIT!
    • Debhelper dh_perldeps До: $ grep Depends debian/control Depends: ${perl:Depends}
    • 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
    • Debhelper dh_builddeps $ dh_builddeps $ cat debian/control ... Build-Depends: perl, libyandex-ppb-ssh-perl, libyandex- unrotate-perl # [dh_builddeps] previous line is autogenerated ...
    • 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}}’ =~ /DEBIAN/; $ dh_versions В пакете: use version; our $VERSION = qv(’1.0.3’) unless ‘1.0.3’ =~ / DEBIAN/;
    • 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
    • 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
    • Тестирование
    • Тестирование 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”);
    • Тестирование Yandex::Config • Дефолтный CONFIG_PATH - “./etc:/etc” • Проверяет, что параметры объявлены • Работает на стадии компиляции
    • Тестирование Yandex::DB # в коде: use Yandex::DB; $db_scheduler = connectdb(“scheduler”); $ # в консоли: $ connectdb scheduler
    • Тестирование Yandex::DB Yandex::DB::Plugin::File $ cat /etc/db.d/scheduler [ { “priority” : 1, “base” : “scheduler”, “host” : “db.feeds.yandex.net”, “pass” : “pass”, “user” : “user”, } ]
    • Тестирование 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 | +-----------------------+-----------+-----------+-----------+
    • Тестирование 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”); ... # проверить содержимое базы
    • Тестирование Yandex::DB Yandex::DB::Plugin::Sandbox • Индивидуальные базы у каждого пользователя • Пересоздается на каждый запуск тестов • Но остается работать после запуска тестов
    • Вячеслав Матюхин Разработчик Россия, Москва, ул. Льва Толстого, 16. +7 (495) 739-00-00 +7 (495) 739-70-70 — факс mmcleric@yandex-team.ru