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

37
Упаковка и развертывание программ на perl под Debian May Perl, Москва, 16-17 мая 2009 года Вячеслав Матюхин

description

YAPC Russia 2009 "May Perl 2"

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

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

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

May Perl, Москва, 16-17 мая 2009 года

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

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

Поиск по блогам

• 280 пакетов

• 100000 строк кода

• 200 хостов

• 20 групп хостов

• 20 баз mysql до 100GB каждая

Статистика

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

Общие знания про Debian

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

Debian

Тысячи их.

Полезные скрипты

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

Debian

Тысячи их.

И все написаны на perl.

Полезные скрипты

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

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...

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

Debiandh_make

• Создает скелет нового пакета

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

Debiandh_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

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

Debiandh_make

• Создает скелет нового пакета• И много мусора• Карго-культ!

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

DebianНеобходимые файлы

• debian/control - метаданные пакета• debian/compat - для debhelper• debian/rules - makefile для сборки• debian/changelog

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

Debiandebhelper#!/usr/bin/make -fclean: dh_testdir dh_testroot dh_clean $(MAKE) cleanbuild: $(MAKE) testinstall: 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

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

DebianCDBS

#!/usr/bin/make -f

include /usr/share/cdbs/1/class/perlmodule.mkinclude /usr/share/cdbs/1/rules/debhelper.mk

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

Debiandh-make-perl

Одной строкой:$ dh-make-perl [email protected]

Другой строкой:$ sudo dh-make-perl --install --cpan Some::Module

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

Debiandh-make-perl

Одной строкой:$ dh-make-perl [email protected]

Другой строкой:$ sudo dh-make-perl --install --cpan Some::Module

http://wiki.debian.org/Teams/DebianPerlGroup:...just send a signed mail to [email protected] and list the packages you want us to take over.

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

Наши расширения debhelper

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

Debhelper

Как отобразить зависимости perl-модулей в зависимости пакетов?

dh_perldeps

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

Debhelperdh_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

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

Debhelperdh_perldeps

1.Читаем весь код в пакете2.Ищем /\buse\s+((?:\w+::)*\w+)(?:\s+(v?[\d_\.]+))?/sg3.Просматриваем @INC в поисках файлов4.Делаем dpkg -S на каждый файл5. ???6. PROFIT!

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

Debhelperdh_perldeps

$ grep Depends debian/controlDepends: ${perl:Depends}

До:

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

Debhelperdh_perldeps

$ debc | grep Depends Depends: libyandex-logger-perl, libyandex-tmpfile-perl, perl (>= 5.6.0-16), perl-base, perl-modules

После:

$ grep Depends debian/controlDepends: ${perl:Depends}

До:

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

Debhelperdh_builddeps$ dh_builddeps

$ cat debian/control...Build-Depends: perl, libyandex-ppb-ssh-perl, libyandex-unrotate-perl# [dh_builddeps] previous line is autogenerated...

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

Debhelperdh_builddeps

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

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

Debhelperdh_perldeps и dh_builddeps

Безумная альтернатива - dpkg-depcheck

• Использует strace• Тормозит

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

Debhelperdh_versions

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

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

Debhelperdh_versions

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

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

Debhelperdh_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/;

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

Debhelperdh_versions

$ grep Logger ./scheduler.pluse Yandex::Logger 1.0.2;$ debuild...$ debc | grep DependsDepends: libyandex-logger-perl (>= 1.0.2), perl (>= 5.6.0-16), perl-base, perl-modules

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

DebhelperИ снова CDBS

#!/usr/bin/make -f

include /usr/share/cdbs/1/class/perlmodule.mk# include /usr/share/cdbs/1/rules/debhelper.mkinclude /usr/share/cdbs/1/rules/ppb.mk

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

Тестирование

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

Тестирование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”);

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

ТестированиеYandex::Config

• Дефолтный CONFIG_PATH - “./etc:/etc”• Проверяет, что параметры объявлены• Работает на стадии компиляции

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

ТестированиеYandex::DB

# в коде:use Yandex::DB;$db_scheduler = connectdb(“scheduler”);

$ # в консоли:$ connectdb scheduler

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

$ cat /etc/db.d/scheduler[ { “priority” : 1, “base” : “scheduler”, “host” : “db.feeds.yandex.net”, “pass” : “pass”, “user” : “user”, }]

Yandex::DBТестирование

Yandex::DB::Plugin::File

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

$ cat /etc/db.d/meta[{ "base" : "meta", "host" : "meta-db.feeds.yandex.net", ...}, ...]

[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::Meta

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

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Тестирование

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

Yandex::DBТестирование

Yandex::DB::Plugin::Sandbox

• Индивидуальные базы у каждого пользователя• Пересоздается на каждый запуск тестов• Но остается работать после запуска тестов

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

Разработчик

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

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

[email protected]

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