orepan と cpanm を使ったcpan モジュールの部分ミラーの運用管理 :yokohama.pm #8

27
OrePAN cpanm を使った CPAN モジュールの部分ミラーの運用管 大窪 聡 ボンヌ / bonnu / id:boxphere

Upload: satoshi-ohkubo

Post on 03-Jul-2015

3.136 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理

大窪聡ボンヌ / bonnu / id:boxphere

Page 2: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

アウトライン

1. はじめに

2. なぜ CPAN ミラーをローカルに作るのか

3. ミラーを作り、維持するために必要な道具

4. ローカルミラーを作る

5. ローカルミラーを利用したデプロイ

6. ローカルミラーを運用する

7. ...チラ裏

8. まとめ / おわりに

Page 3: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

はじめに

今回の発表の内容は kazeburo さんの11年2月時点のブログの内容が大元のベースになっています。

http://blog.nomadscafe.jp/2011/02/orepancpanmcpancpan.html

当時は kazeburo さん作の patch があたった状態での運用フローが紹介されていましたが、現在は本家 cpanm に patch の内容の

一部が組み込まれたりなど、状況も少し変わりましたので、整理をかねつつ僭越ながら発表させていただきます。

Page 4: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

なぜ CPAN ミラーをローカルに作るのか

本家 CPAN の更新に影響を受けずにモジュールをインストールしたい

アプリケーションが依存するモジュールの挙動を保障するためにバージョンを固定する必要があります。

アプリケーションをネットに依存せずに確実にインストールしたい

search.cpan.org やそのミラーは作者による取り下げも反映されてしまう。

何より必ず CPAN ネットワークが上がっている保障はない。

複数台をセットアップする際に外部ネットワークに接続したくない

数十台規模になればなおさら。セットアップを素早く行うためにも重要。

企業によっては外部ネットワークへの接続ポリシーに縛られることも。

社内向けパッケージを CPAN モジュールと同様に扱いたい

Page 6: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ミラーを作り、維持するために必要な道具

cpanm をセットアップする

OrePAN をセットアップする

orepan.pl、orepan_index.pl にパスを通す※ PERL5_LIB を local::lib で rc ファイルに追加する等、好みで設定します。

私の場合は環境変数に何も設定したくないので alias を rc に入れています。

$ cd ~/bin

$ curl -LO http://xrl.us/cpanm

$ chmod +x cpanm

$ cpanm https://github.com/tokuhirom/OrePAN/tarball/master

$ alias orepan.pl='perl -Mlocal::lib=~/perl5 ~/perl5/bin/orepan.pl'

$ alias orepan_index.pl='perl -Mlocal::lib=~/perl5 ~/perl5/bin/orepan_index.pl'

Page 7: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを作る

Page 8: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを作る.モジュールのダウンロード

アプリケーションの Makefile.PL から依存モジュールをダウンロードする

$ cd /path/to/Proj

$ cat Makefile.PLuse inc::Module::Install;

name 'Proj';

version '0.1';

requires 'HTTP::Server::Simple::PSGI';

requires 'Plack';

...

WriteAll;

Page 9: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを作る.モジュールのダウンロード

アプリケーションの Makefile.PL から依存モジュールをダウンロードする

※削除されたモジュールが必要な場合もあるため、ここでは backpan を指定しています。

※インストール先に指定している local-tmpは消してもよいディレクトリを指定します。

$ cpanm -L local-tmp --mirror=http://backpan.perl.org/ \

--save-dists=cpan-mirror –n --installdeps .Configuring Proj-0.1 ... OK

==> Found dependencies:

HTTP::Server::Simple::PSGI, URI, HTTP::Body, MIME::Types, LWP

--> Working on HTTP::Server::Simple::PSGI

Fetching http://backpan.perl.org/authors/id/M/MI/MIYAGAWA/HTTP-Server-Simple-

PSGI-0.14.tar.gz ... OK

Configuring HTTP-Server-Simple-PSGI-0.14 ... OK

==> Found dependencies: HTTP::Server::Simple

...

<== Installed dependencies for .. Finishing.

21 distributions installed

Page 10: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを作る.モジュールのダウンロード

ダウンロードしたファイルの確認

$ find ./cpan-mirror -name "*.tar.gz"./cpan-mirror/authors/id/R/RJ/RJBS/Test-Deep-0.108.tar.gz

./cpan-mirror/authors/id/P/PE/PETDANCE/HTML-Tagset-3.20.tar.gz

./cpan-mirror/authors/id/M/MA/MARKOV/MIME-Types-1.32.tar.gz

./cpan-mirror/authors/id/M/MI/MIYAGAWA/HTTP-Server-Simple-PSGI-0.14.tar.gz

...

Page 11: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを作る.インデックスの作成

orepan_index.pl を利用してインデックスを作成する

$ orepan_index.pl -r ./cpan-mirror2011-11-16T20:22:46 [INFO] get package names of cpan-

mirror/authors/id/R/RJ/RJBS/Test-Deep-0.108.tar.gz at

/User/bonnu/perl5/bin/orepan_index.pl line 51

2011-11-16T20:22:46 [INFO] retrieve meta data at

/User/bonnu/perl5/lib/perl5/OrePAN/Archive.pm line 72

...

2011-11-16T20:22:47 [INFO] Adding HTTP-Server-Simple-0.44 at

/User/bonnu/perl5/lib/perl5/OrePAN/Package/Index.pm line 64

2011-11-16T20:22:47 [INFO] Save cpan-mirror/modules/02packages.details.txt.gz at

/User/bonnu/perl5/lib/perl5/OrePAN/Package/Index.pm line 92

Page 12: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを作る.インデックスの作成

作成したインデックスファイルの確認

ローカルミラーが出来上がりました。

$ tree -L 2 ./cpan-mirrorcpan-mirror

|-- authors

| |-- 00whois.xml

| `-- id/

`-- modules

`-- 02packages.details.txt.gz

Page 13: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを作る.バージョン管理システムへの登録

例として、アプリケーションのプロジェクト直下にミラーを登録する

※デプロイを行う際にローカルで完結するため非常に便利です。

$ git add cpan-mirror

$ git commit -a -m 'initial mirror'

$ git push origin master

Page 14: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを利用してのデプロイ

Page 15: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを利用してのデプロイ

デプロイしたいサーバ上でプロジェクトをチェックアウトする

プロジェクトに含まれるミラーを使って cpanm を実行する

$ git clone git@repos:bonnu/Proj.git

$ cd Proj

$ cpanm -L local --mirror=$PWD/cpan-mirror --mirror-only \

--installdeps .

--> Working on .

Configuring Proj-0.1 ... OK==> Found dependencies: HTTP::Server::Simple::PSGI, URI, HTTP::Body, MIME::Types, LWP

--> Working on HTTP::Server::Simple::PSGI

Fetching file:///pato/to/Proj/cpan-mirror/authors/id/M/MI/MIYAGAWA/HTTP-Server-Simple-PSGI-0.14.tar.gz ...

OK

...

Building and testing libwww-perl-6.03 ... OK

Successfully installed libwww-perl-6.03

<== Installed dependencies for .. Finishing.

21 distributions installed

Page 16: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを運用する

Page 17: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを運用する.ミラーの共有・公開

ミラーを http で公開する

社内で立ち上がっているリポジトリサーバ等があればそこの httpd を使って配信するのがベターです。

その場合はリポジトリサーバ上で、git などによるインデックスファイルの更新を定期的に取得するようにします(crontab や daemon によるgit pull / svn up 等。)

$ perl -Mlocal::lib=$HOME/perl5 -MPlack::App::Directory \

$HOME/perl5/bin/plackup -p 8888 -e \

"Plack::App::Directory->new({root => '/path/to/Proj/cpan-mirror'})-

>to_app"

Page 18: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを運用する.依存モジュールを追加する

Makefile.PL に依存モジュールの記述を追加

cpanm を実行する

$ cd /path/to/Proj

$ vi Makefile.PL

+ requires 'Text::Xslate';

$ cpanm -L local \

--mirror=$PWD/cpan-mirror \

--mirror=http://backpan.perl.org/ \

--save-dists=$PWD/cpan-mirror \

--installdeps .

...(ミラーに足りないもののみ CPAN からダウンロードされる)...

Page 19: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを運用する.依存モジュールを追加する

orepan_index.pl を使ってインデックスを再生成する

$ rm ./cpan-mirror/modules/02packages.details.txt.gz

$ orepan_index.pl -r ./cpan-mirror

...

$ git commit –m 'update mirror' cpan-mirror

Page 20: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを運用する.オリジナルモジュールを追加する

orepan.pl を利用してミラーに登録する

github にはあるが CPAN にはない、というようなモジュールも orepan.plを使えば問題ありません。

社内のみで利用可能なモジュールについても同様です。

$ orepan.pl -d /path/to/Proj/cpan-mirror -p BOXPHERE \

Encomp-0.01.tar.gz # 手前味噌のモジュールを作者 BOXPHERE で登録...

$ cd /path/to/Proj

$ vi Makefile.PL+ requires 'Encomp';

Page 21: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを運用するモジュールを削除/ダウングレードする

ミラーでは:その tarball を削除してインデックスを再生成

ミラー上でダウングレードする場合は最新のバージョンが古いものになるように更新... ><

$ rm ./cpan-mirror/authors/id/D/DA/DANKOGAI/Regexp-Optimizer-

0.15.tar.gz

$ rm ./cpan-mirror/modules/02packages.details.txt.gz

$ orepan_index.pl -r ./cpan-mirror

$ rm ./cpan-mirror/authors/id/D/DA/DAVECROSS/XML-Feed-0.46.tar.gz

$ rm ./cpan-mirror/modules/02packages.details.txt.gz

$ orepan_index.pl -r ./cpan-mirror

$ wget http://search.cpan.org/CPAN/authors/id/S/SI/SIMONW/XML-Feed-

0.23.tar.gz

$ orepan.pl –d cpan-mirror –p SIMONW XML-Feed-0.23.tar.gz

Page 22: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ローカルミラーを運用するモジュールを削除/ダウングレードする

デプロイ先では: pm-uninstall を実行する

ダウングレードの場合は入れ直しも必要

※ダウングレードした後はアプリケーションの再起動やリロードが必要です

※デプロイ台数が多い場合、arch に対応しつつ rsync で local を配布したほうがよいかと...

$ cd /path/to/Proj

$ pm-uninstall –L local -f XML::Feed

...

Successfully uninstalled XML::Feed

$ git pull origin master # mirror と Makefile.PL を最新にしておく

$ pm-uninstall –L local -f XML::Feed

$ cpanm -L local --mirror=$PWD/cpan-mirror --mirror-only \

--installdeps .

Page 23: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

チラ裏

Carton でミラーを利用する: carton.lock の生成

やった!Complete ならばそのプロジェクトは配布できます!

プロジェクトに carton.lock をコミットしてデプロイサーバで使いましょう。

$ PERL_CARTON_PATH=$PWD/local \

PERL_CARTON_MIRROR=$PWD/cpan-mirror \

carton install

Installing modules using Makefile.PLSuccessfully installed HTTP-Server-Simple-0.44

Successfully installed HTTP-Server-Simple-PSGI-0.14

Successfully installed Mouse-0.97

...

29 distributions installed

Complete! Modules were installed into /path/to/Proj/local

Page 24: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

チラ裏

Carton でミラーを利用する:デプロイ

$ cd /path/to/Proj

$ git pull origin master

$ PERL_CARTON_PATH=$PWD/local \

PERL_CARTON_MIRROR=$PWD/cpan-mirror \

carton install --deployment

Installing modules using carton.lock (deployment mode)Successfully installed HTTP-Server-Simple-0.44

Successfully installed HTTP-Server-Simple-PSGI-0.14

Successfully installed Mouse-0.97

...

29 distributions installed

Complete! Modules were installed into /path/to/Proj/local

Page 25: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

チラ裏

minicpan_webserver で POD を見る

動くけど、改造したほうがよさそう・・・重い

$ cd;

$ cpanm CPAN::Mini::Webserver

# dummy file をインデックスに追加(使わない)$ touch /path/to/Proj/cpan-mirror/authors/01mailrc.txt.gz

$ echo 'local: /path/to/Proj/cpan-mirror' > ~/.minicpanrc

$ minicpan_webserver

Page 26: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

まとめ / おわりに

ミラーを運用することでサービスを簡単に設置できる状態を整える 実際にはプロジェクトに関連づけて tarball をまとめておくだけです

3年後、今の CPAN モジュールをベースにして書かれたアプリケーションを楽にセットアップできるように 昔話: CatMoose 以前のバージョンで書かれているプロジェクトを(リ

ファクタなしで)すんなり動かせる気は僕はしません...

API が変更されるモジュールも時折ある。

一時期のブログで参照されていた野良リポジトリのモジュール等は、リポジトリがなくなっていることも。

オリジナルが見つからなかったり、探すのに苦労したり...

開発者と運用者が違う場合にも有効な伝達ツールに 業務分掌、または今の自分と未来の自分/後輩。

Page 27: OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8

ご清聴ありがとうございました。

各種モジュール・ツール作者の

tokuhirom さん、miyagawa さん、xaicron さん、

ベースとなった記事を書かれた kazeburo さん

に感謝します。