More Related Content Similar to OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8 Similar to OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #8 (20) OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理 :Yokohama.pm #81. OrePAN と cpanm を使った
CPAN モジュールの部分ミラーの運用管
理
大窪 聡
ボンヌ / bonnu / id:boxphere
2. アウトライン
1. はじめに
2. なぜ CPAN ミラーをローカルに作るのか
3. ミラーを作り、維持するために必要な道具
4. ローカルミラーを作る
5. ローカルミラーを利用したデプロイ
6. ローカルミラーを運用する
7. ...チラ裏
8. まとめ / おわりに
4. なぜ CPAN ミラーをローカルに作るのか
本家 CPAN の更新に影響を受けずにモジュールをインストールしたい
アプリケーションが依存するモジュールの挙動を保障するために
バージョンを固定する必要があります。
アプリケーションをネットに依存せずに確実にインストールしたい
search.cpan.org やそのミラーは作者による取り下げも反映されてし
まう。
何より必ず CPAN ネットワークが上がっている保障はない。
複数台をセットアップする際に外部ネットワークに接続したくない
数十台規模になればなおさら。セットアップを素早く行うためにも
重要。
企業によっては外部ネットワークへの接続ポリシーに縛られること
も。
社内向けパッケージを CPAN モジュールと同様に扱いたい
5. ミラーを作り、維持するために必要な道具
cpanm (App::cpanminus)
http://search.cpan.org/dist/App-cpanminus/
OrePAN
https://github.com/tokuhirom/OrePAN
pm-uninstall (App::pmuninstall)
http://search.cpan.org/dist/App-pmuninstall/
6. ミラーを作り、維持するために必要な道具
cpanm をセットアップする
$ cd ~/bin
$ curl -LO http://xrl.us/cpanm
$ chmod +x cpanm
OrePAN をセットアップする
$ cpanm https://github.com/tokuhirom/OrePAN/tarball/master
orepan.pl、orepan_index.pl にパスを通す
※ PERL5_LIB を local::lib で rc ファイルに追加する等、好みで設定します。
私の場合は環境変数に何も設定したくないので alias を rc に入れています。
$ alias orepan.pl='perl -Mlocal::lib=~/perl5 ~/perl5/bin/orepan.pl'
$ alias orepan_index.pl='perl -Mlocal::lib=~/perl5 ~/perl5/bin/orepan_index.pl'
8. ローカルミラーを作る.
モジュールのダウンロード
アプリケーションの Makefile.PL から依存モジュールをダウンロー
ドする
$ cd /path/to/Proj
$ cat Makefile.PL
use inc::Module::Install;
name 'Proj';
version '0.1';
requires 'HTTP::Server::Simple::PSGI';
requires 'Plack';
...
WriteAll;
9. ローカルミラーを作る.
モジュールのダウンロード
アプリケーションの Makefile.PL から依存モジュールをダウンロー
ドする
$ 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
※削除されたモジュールが必要な場合もあるため、ここでは backpan を指定してい
ます。
※ インストール先に指定している local-tmp は消してもよいディレクトリを指定し
10. ローカルミラーを作る.
モジュールのダウンロード
ダウンロードしたファイルの確認
$ 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
...
11. ローカルミラーを作る.
インデックスの作成
orepan_index.pl を利用してインデックスを作成する
$ orepan_index.pl -r ./cpan-mirror
2011-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
12. ローカルミラーを作る.
インデックスの作成
作成したインデックスファイルの確認
$ tree -L 2 ./cpan-mirror
cpan-mirror
|-- authors
| |-- 00whois.xml
| `-- id/
`-- modules
`-- 02packages.details.txt.gz
ローカルミラーが出来上がりました。
13. ローカルミラーを作る.
バージョン管理システムへの登録
例として、アプリケーションのプロジェクト直下にミラーを登録す
る
$ git add cpan-mirror
$ git commit -a -m 'initial mirror'
$ git push origin master
※ デプロイを行う際にローカルで完結するため非常に便利です。
15. ローカルミラーを利用してのデプロイ
デプロイしたいサーバ上でプロジェクトをチェックアウトする
$ git clone git@repos:bonnu/Proj.git
プロジェクトに含まれるミラーを使って cpanm を実行する
$ 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
17. ローカルミラーを運用する.
ミラーの共有・公開
ミラーを http で公開する
$ 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"
社内で立ち上がっているリポジトリサーバ等があればそこの httpd を
使って配信するのがベターです。
その場合はリポジトリサーバ上で、git などによるインデックスファイ
ルの更新を定期的に取得するようにします(crontab や daemon による
git pull / svn up 等。)
18. ローカルミラーを運用する.
依存モジュールを追加する
Makefile.PL に依存モジュールの記述を追加
$ cd /path/to/Proj
$ vi Makefile.PL
+ requires 'Text::Xslate';
cpanm を実行する
$ cpanm -L local
--mirror=$PWD/cpan-mirror
--mirror=http://backpan.perl.org/
--save-dists=$PWD/cpan-mirror
--installdeps .
...(ミラーに足りないもののみ CPAN からダウンロードされる)...
19. ローカルミラーを運用する.
依存モジュールを追加する
orepan_index.pl を使ってインデックスを再生成する
$ rm ./cpan-mirror/modules/02packages.details.txt.gz
$ orepan_index.pl -r ./cpan-mirror
...
$ git commit –m 'update mirror' cpan-mirror
20. ローカルミラーを運用する.
オリジナルモジュールを追加する
orepan.pl を利用してミラーに登録する
$ orepan.pl -d /path/to/Proj/cpan-mirror -p BOXPHERE
Encomp-0.01.tar.gz # 手前味噌のモジュールを作者 BOXPHERE で登録
...
github にはあるが CPAN にはない、というようなモジュールも orepan.pl
を使えば問題ありません。
社内のみで利用可能なモジュールについても同様です。
$ cd /path/to/Proj
$ vi Makefile.PL
+ requires 'Encomp';
21. ローカルミラーを運用する
モジュールを削除/ダウングレードする
ミラーでは: その 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
22. ローカルミラーを運用する
モジュールを削除/ダウングレードする
デプロイ先では: pm-uninstall を実行する
$ 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 .
※ダウングレードした後はアプリケーションの再起動やリロードが必要です
※デプロイ台数が多い場合、arch に対応しつつ rsync で local を配布したほうがよい
かと...
23. チラ裏
Carton でミラーを利用する: carton.lock の生成
$ PERL_CARTON_PATH=$PWD/local
PERL_CARTON_MIRROR=$PWD/cpan-mirror
carton install
Installing modules using Makefile.PL
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
やった!Complete ならばそのプロジェクトは配布できます!
プロジェクトに carton.lock をコミットしてデプロイサーバで使いましょう。
24. チラ裏
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
25. チラ裏
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
動くけど、改造したほうがよさそう・・・ 重い
26. まとめ / おわりに
ミラーを運用することでサービスを簡単に設置できる状態を
整える
実際にはプロジェクトに関連づけて tarball をまとめておくだけです
3年後、今の CPAN モジュールをベースにして書かれたアプ
リケーションを楽にセットアップできるように
昔話: CatMoose 以前のバージョンで書かれているプロジェクトを(リ
ファクタなしで)すんなり動かせる気は僕はしません...
API が変更されるモジュールも時折ある。
一時期のブログで参照されていた野良リポジトリのモジュール等は、
リポジトリがなくなっていることも。
オリジナルが見つからなかったり、探すのに苦労したり...
開発者と運用者が違う場合にも有効な伝達ツールに
業務分掌、または今の自分と未来の自分/後輩。