View
1.922
Download
4
Category
Preview:
DESCRIPTION
YAPC Russia 2009 "May Perl 2"
Citation preview
Упаковка и развертывание программ на 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...
Debiandh_make
• Создает скелет нового пакета
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
Debiandh_make
• Создает скелет нового пакета• И много мусора• Карго-культ!
DebianНеобходимые файлы
• debian/control - метаданные пакета• debian/compat - для debhelper• debian/rules - makefile для сборки• debian/changelog
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
DebianCDBS
#!/usr/bin/make -f
include /usr/share/cdbs/1/class/perlmodule.mkinclude /usr/share/cdbs/1/rules/debhelper.mk
Debiandh-make-perl
Одной строкой:$ dh-make-perl --email=mmcleric@yandex-team.ru
Другой строкой:$ sudo dh-make-perl --install --cpan Some::Module
Debiandh-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
Как отобразить зависимости perl-модулей в зависимости пакетов?
dh_perldeps
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
Debhelperdh_perldeps
1.Читаем весь код в пакете2.Ищем /\buse\s+((?:\w+::)*\w+)(?:\s+(v?[\d_\.]+))?/sg3.Просматриваем @INC в поисках файлов4.Делаем dpkg -S на каждый файл5. ???6. PROFIT!
Debhelperdh_perldeps
$ grep Depends debian/controlDepends: ${perl:Depends}
До:
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}
До:
Debhelperdh_builddeps$ dh_builddeps
$ cat debian/control...Build-Depends: perl, libyandex-ppb-ssh-perl, libyandex-unrotate-perl# [dh_builddeps] previous line is autogenerated...
Debhelperdh_builddeps
- Debian policy запрещает генерировать control- Иногда некроссплатформенен+ Зато незаменим для автосборок
Debhelperdh_perldeps и dh_builddeps
Безумная альтернатива - dpkg-depcheck
• Использует strace• Тормозит
Debhelperdh_versions
Q: Для каких пакетов писать версии?
Debhelperdh_versions
Q: Для каких пакетов писать версии?A: Для некоторых.
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/;
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
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
Тестирование
Тестирование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
$ cat /etc/db.d/scheduler[ { “priority” : 1, “base” : “scheduler”, “host” : “db.feeds.yandex.net”, “pass” : “pass”, “user” : “user”, }]
Yandex::DBТестирование
Yandex::DB::Plugin::File
$ 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
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Тестирование
Yandex::DB::Plugin::Sandbox
• Индивидуальные базы у каждого пользователя• Пересоздается на каждый запуск тестов• Но остается работать после запуска тестов
Разработчик
Россия, Москва,ул. Льва Толстого, 16.
+7 (495) 739-00-00+7 (495) 739-70-70 — факс
mmcleric@yandex-team.ru
Вячеслав Матюхин
Recommended