Cinnamon - simple deploy tool

3,734 views

Published on

0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,734
On SlideShare
0
From Embeds
0
Number of Embeds
1,735
Actions
Shares
0
Downloads
8
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

Cinnamon - simple deploy tool

  1. 1. Cinnamonsimple deploy tool @shiba_yu36 2013/02/23 Kansai.pm
  2. 2. 自己紹介
  3. 3. shiba_yu36 & shibayu36 or etc... http://blog.hatena.ne.jp/shiba_yu36
  4. 4. Work• 株式会社はてな• アプリケーションエンジニア • はてなブログ • 外部API、課金などの基盤周り
  5. 5. Perl• perlbrew.el• DBIx::DataFactory• Kyoto.pm• Cinnamon • -> 今日のお話
  6. 6. アジェンダ• デプロイツールとは?• 自作ツールのCinnamonのご紹介• Demo• 技術的Tips
  7. 7. デプロイツールとは?• デプロイツール知っている人?• 使っている人?• capistrano使っている人?
  8. 8. デプロイツールとは?• サーバへのデプロイを支援 • 面倒な手順をまとめる • 複数台への一括デプロイ• 単純化すると、サーバへのコマンド実 行
  9. 9. デプロイツールとは?• Capistrano (Ruby製) • よく使われてる• Archer (Perl製)• etc...
  10. 10. Capistranoへの不満• Railsに紐付きすぎている• 中の実装が多く複雑 -> はまる
  11. 11. Capistranoへの不満• 複数サーバにコマンド発行するだけ• DSLで簡単に設定したい• Perl !!!!!!!!
  12. 12. Cinnamon
  13. 13. Cinnamonとは?• perl製デプロイツール• perlでDSLっぽく設定を書ける• ネーミングは弊社会長犬から
  14. 14. Cinnamonの思想•Minimum• Role x Task
  15. 15. Minimum• Cinnamon側ではサーバへのコマンド 実行のみ• デプロイの方法は利用者に
  16. 16. Role x Task環境とタスクの組み合わせ
  17. 17. Role x Task• サーバ群をroleとして定義• 実行したいものをtaskとして定義• roleとtaskを組み合わせて実行 • 例)「本番appサーバ」に「コードの反 映」を実行
  18. 18. cpanm Cinnamon
  19. 19. How to Use
  20. 20. Synopsisuse Cinnamon::DSL;set user => johndoe; # requiredset application => My-App; # custom valuerole production => production.host; # declare servertask update => sub { my ($host, @args) = @_; my $deploy_to = get(deploy_to); remote { run "cd $deploy_to && git pull"; } $host;};
  21. 21. use Cinnamon::DSL; • config/deploy.plset user => johndoe; # requiredset application => My-App; # custom value • useしてDSLを書けるようにrole production => production.host; # declare servertask update => sub { my ($host, @args) = @_; my $deploy_to = get(deploy_to); remote { run "cd $deploy_to && git pull"; } $host;};
  22. 22. use Cinnamon::DSL;set user => johndoe; # requiredset application => My-App; # custom value• ログインユーザ名をsetrole production => production.host; # declare servertask update => sub { my ($host, @args) = @_; my $deploy_to = get(deploy_to); remote { run "cd $deploy_to && git pull"; } $host;};
  23. 23. use Cinnamon::DSL;set user => johndoe; # requiredset application => My-App; # custom valuerole production => production.host; # declare server• roleでサーバ群を定義task update => sub { my ($host, @args) = @_; my $deploy_to = get(deploy_to);• 配列で複数サーバ渡せる remote { run "cd $deploy_to && git pull"; } $host;};
  24. 24. • taskで実行コマンドを定義use Cinnamon::DSL;set user => johndoe; # required• remote + runでサーバに実行set application => My-App; # custom valuerole production• runの代わりにsudo => production.host; # declare servertask update => sub { my ($host, @args) = @_; my $deploy_to = get(deploy_to); remote { run "cd $deploy_to && git pull"; } $host;};
  25. 25. use Cinnamon::DSL;set user => johndoe; # requiredset application => My-App; # custom valuerole production => production.host; # declare servertask update => sub { my ($host, @args) = @_; my $deploy_to = get(deploy_to); remote {• run "cd $deploy_to && git pull"; set/getを使ってユーザ定義値 } $host;};• 遅延評価することも可能
  26. 26. 実行• cinnamon (role) (task)• cinnamon production update
  27. 27. Demo• https://github.com/shibayu36/ cinnamon-deploy-sample• 反映、サーバ停止、サーバ起動• installdeps
  28. 28. Use Case
  29. 29. サーバ群を別の管理ツールから決めたい• 別にサーバ管理ツールがある• HTTPのAPIみたいなのがある• そこから動的にサーバを決めたい
  30. 30. サーバ群を 別の管理ツールから決めたいrole production => sub { my $res = LWP::UserAgent->get( http://servers.example.com/api/hosts, ); my $hosts = decode_json $res->content; $hosts;}; callbackで動的にサーバを決める 遅延ロードする
  31. 31. 開発環境は違うブランチ• 本番はmasterを反映• 開発環境はdevelopment• etc...
  32. 32. 開発環境は違うブランチrole production => [production.host], { branch => "master",};role development => [development.host], { branch => "development",};task update => sub { my $branch = get(branch); # ...}; roleで変数の上書きが出来る
  33. 33. How to Make
  34. 34. How to Make• サーバへのコマンド実行部 • Net::OpenSSH• DSL部
  35. 35. サーバへのコマンド実行• Net::OpenSSHが便利• コマンド実行 + 結果の取得• system, capture2, open3
  36. 36. サーバへのコマンド実行my $ssh = Net::OpenSSH->new( shiba.host, user => shibayu36,);$ssh->system(ls /home);my ($out, $err) = $ssh->capture2("ls /home");my ($in, $out, $err, $pid) = $ssh->open3("cpanm--installdeps .");
  37. 37. サーバへのコマンド実行my $ssh = Net::OpenSSH->new( shiba.host, user => shibayu36,);$ssh->system(ls /home);my ($out, $err) = $ssh->capture2("ls /home"); ホスト名とユーザ名を入れてnewmy ($in, $out, $err, $pid) = $ssh->open3("cpanm--installdeps .");
  38. 38. サーバへのコマンド実行my $ssh = Net::OpenSSH->new( shiba.host, user => shibayu36,); systemでコマンドの実行のみ$ssh->system(ls /home);my ($out, $err) = $ssh->capture2("ls /home");my ($in, $out, $err, $pid) = $ssh->open3("cpanm--installdeps .");
  39. 39. サーバへのコマンド実行my $ssh = Net::OpenSSH->new( shiba.host, user => shibayu36,); capture2で標準出力などを変数に$ssh->system(ls /home);my ($out, $err) = $ssh->capture2("ls /home");my ($in, $out, $err, $pid) = $ssh->open3("cpanm--installdeps .");
  40. 40. サーバへのコマンド実行my $ssh = Net::OpenSSH->new( shiba.host, user => shibayu36,); open3使うとファイルハンドラがもらえる$ssh->system(ls /home);my ($out, $err) = $ssh->capture2("ls /home");my ($in, $out, $err, $pid) = $ssh->open3("cpanm--installdeps .");
  41. 41. 使いどころ• サーバと連携するツールの開発に便利• CinnamonではAnyEvent::Handlerと 一緒に使って、出力をしている
  42. 42. DSL• 単なる関数export• Exporter::Lite
  43. 43. DSLの簡単な例package Cinnamon::DSL;use Exporter::Lite;our @EXPORT = qw(role);sub role ($$;$) { my ($name, $hosts, $params) = @_; # ...}
  44. 44. DSLの応用的な実装• Plack::Builderが参考になる• builderブロックの中でしかenableが使 えない
  45. 45. DSLの応用的な実装sub enable { $_add->(@_) }sub builder(&) { my $block = shift; my $self = __PACKAGE__->new; # ... local $_add = sub { $self->add_middleware(@_); }; # ...}
  46. 46. まとめ• デプロイツールのお話• シンプルなツールのCinnamonの紹介• pull requestお待ちしております!!!
  47. 47. ご清聴ありがとうございました

×