orepan と cpanm を使ったcpan モジュールの部分ミラーの運用管理 :yokohama.pm #8
Post on 03-Jul-2015
3.145 Views
Preview:
TRANSCRIPT
OrePAN と cpanm を使ったCPAN モジュールの部分ミラーの運用管理
大窪聡ボンヌ / bonnu / id:boxphere
アウトライン
1. はじめに
2. なぜ CPAN ミラーをローカルに作るのか
3. ミラーを作り、維持するために必要な道具
4. ローカルミラーを作る
5. ローカルミラーを利用したデプロイ
6. ローカルミラーを運用する
7. ...チラ裏
8. まとめ / おわりに
はじめに
今回の発表の内容は kazeburo さんの11年2月時点のブログの内容が大元のベースになっています。
http://blog.nomadscafe.jp/2011/02/orepancpanmcpancpan.html
当時は kazeburo さん作の patch があたった状態での運用フローが紹介されていましたが、現在は本家 cpanm に patch の内容の
一部が組み込まれたりなど、状況も少し変わりましたので、整理をかねつつ僭越ながら発表させていただきます。
なぜ CPAN ミラーをローカルに作るのか
本家 CPAN の更新に影響を受けずにモジュールをインストールしたい
アプリケーションが依存するモジュールの挙動を保障するためにバージョンを固定する必要があります。
アプリケーションをネットに依存せずに確実にインストールしたい
search.cpan.org やそのミラーは作者による取り下げも反映されてしまう。
何より必ず CPAN ネットワークが上がっている保障はない。
複数台をセットアップする際に外部ネットワークに接続したくない
数十台規模になればなおさら。セットアップを素早く行うためにも重要。
企業によっては外部ネットワークへの接続ポリシーに縛られることも。
社内向けパッケージを CPAN モジュールと同様に扱いたい
ミラーを作り、維持するために必要な道具
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/
ミラーを作り、維持するために必要な道具
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'
ローカルミラーを作る
ローカルミラーを作る.モジュールのダウンロード
アプリケーションの 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;
ローカルミラーを作る.モジュールのダウンロード
アプリケーションの 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
ローカルミラーを作る.モジュールのダウンロード
ダウンロードしたファイルの確認
$ 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
...
ローカルミラーを作る.インデックスの作成
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
ローカルミラーを作る.インデックスの作成
作成したインデックスファイルの確認
ローカルミラーが出来上がりました。
$ tree -L 2 ./cpan-mirrorcpan-mirror
|-- authors
| |-- 00whois.xml
| `-- id/
`-- modules
`-- 02packages.details.txt.gz
ローカルミラーを作る.バージョン管理システムへの登録
例として、アプリケーションのプロジェクト直下にミラーを登録する
※デプロイを行う際にローカルで完結するため非常に便利です。
$ git add cpan-mirror
$ git commit -a -m 'initial mirror'
$ git push origin master
ローカルミラーを利用してのデプロイ
ローカルミラーを利用してのデプロイ
デプロイしたいサーバ上でプロジェクトをチェックアウトする
プロジェクトに含まれるミラーを使って 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
ローカルミラーを運用する
ローカルミラーを運用する.ミラーの共有・公開
ミラーを 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"
ローカルミラーを運用する.依存モジュールを追加する
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 からダウンロードされる)...
ローカルミラーを運用する.依存モジュールを追加する
orepan_index.pl を使ってインデックスを再生成する
$ rm ./cpan-mirror/modules/02packages.details.txt.gz
$ orepan_index.pl -r ./cpan-mirror
...
$ git commit –m 'update mirror' cpan-mirror
ローカルミラーを運用する.オリジナルモジュールを追加する
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';
ローカルミラーを運用するモジュールを削除/ダウングレードする
ミラーでは:その 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
ローカルミラーを運用するモジュールを削除/ダウングレードする
デプロイ先では: 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 .
チラ裏
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
チラ裏
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
チラ裏
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
まとめ / おわりに
ミラーを運用することでサービスを簡単に設置できる状態を整える 実際にはプロジェクトに関連づけて tarball をまとめておくだけです
3年後、今の CPAN モジュールをベースにして書かれたアプリケーションを楽にセットアップできるように 昔話: CatMoose 以前のバージョンで書かれているプロジェクトを(リ
ファクタなしで)すんなり動かせる気は僕はしません...
API が変更されるモジュールも時折ある。
一時期のブログで参照されていた野良リポジトリのモジュール等は、リポジトリがなくなっていることも。
オリジナルが見つからなかったり、探すのに苦労したり...
開発者と運用者が違う場合にも有効な伝達ツールに 業務分掌、または今の自分と未来の自分/後輩。
ご清聴ありがとうございました。
各種モジュール・ツール作者の
tokuhirom さん、miyagawa さん、xaicron さん、
ベースとなった記事を書かれた kazeburo さん
に感謝します。
top related