Mina – Getting started 和訳

deploy.rb について

deploy.rb は Rake によって実行される Rakefile にすぎません。
実際、mina は deploy.rb をロードする Rake を実行するエイリアスです。

# config/deploy.rb のサンプル
set :domain, 'your.server.com'

task :restart do
  queue 'sudo service restart apache'
end

Rake のように、mina に実行させるタスクを定義できます。

この例のように、restart コマンドを定義できます。

あなたが新しく定義したこのコマンドには、Mina の魔法が込められています。

queue コマンドはリモートサーバで実行される bash コマンドをキューします。

mina restart を実行すると、your.server.com 上でキューされたコマンドがssh経由で実行されます。

詳しくは Command queue をご覧下さい。

コマンドキュー

At the heart of it, Mina is merely sugar on top of Rake to queue commands and execute them remotely at the end.

最小限の deploy.rb を見てください。

config/deploy.rb
set :user, 'john'
set :domain, 'flipstack.com'

task :logs do
  queue 'echo "Contents of the log file are as follows:"'
  queue "tail -f /var/log/apache.log"
end

ターミナルにて mina logs とタイプすると、キューされたコマンドが ssh john@flipstack.com を使ってリモートで実行されます。

$ mina logs --simulate
# Execute the following commands via
# ssh john@flipstack.com:
#
echo "Contents of the log file are as follows:"
tail -f /var/log/apache.log

サブタスク

Mina はタスクから他のタスクを実行するヘルパーを提供しています。

# config/deploy.rb
task :down do
  invoke :maintenance_on
  invoke :restart
end

task :maintenance_on
  queue 'touch maintenance.txt'
end

task :restart
  queue 'sudo service restart apache'
end

この例において、mina down とタイプすると、他のサブタスクてキューされたコマンドを実行する事ができます。
このコマンドは全ての後に実行されます。

ディレクトリ構造

デプロイは以下のようなディレクトリを生成します

/var/www/flipstack.com/ # deploy_to に設定したパス
 |-  releases/ # 一つのリリースにつき一つのディレクトリ
 |   |- 1/
 |   |- 2/
 |   |- 3/
 |   '- ...
 |-  shared/ # リリース間で共有されるファイル
 |   |- logs/ # ログファイルはここに保存される
 |   `- ...
 '-  current/ # 現在のリリースへのシンボリックリンク

デプロイ

Mina はデプロイスクリプトをキューするコマンドを提供します

# config/deploy.rb
set :domain, 'flipstack.com'
set :user, 'flipstack'
set :deploy_to, '/var/www/flipstack.com'
set :repository, 'http://github.com/flipstack/flipstack.git'

task :deploy do
  deploy do
    # Put things that prepare the empty release folder here.
    # Commands queued here will be ran on a new release directory.
    invoke :'git:clone'
    invoke :'bundle:install'

    # These are instructions to start the app after it's been prepared.
    to :launch do
      queue 'touch tmp/restart.txt'
    end

    # This optional block defines how a broken release should be cleaned up.
    to :clean do
      queue 'log "failed deployment"'
    end
  end
end

It works by capturing the queued commands inside the block, wrapping them in a deploy script, then queueing them back in.

どのようにデプロイが行われるのか

デプロイの例を上げます。

(いくつかのコマンドは要点を分かりやすくするために省略しています)

ステップ1 ビルド

デプロイプロセスは指定した処理を含んだ新しい一時フォルダをビルドします。

この例では、git clone と bundle install をしています

$ mina deploy --verbose
-----> Creating the build path
       $ mkdir tmp/build-128293482394
-----> Cloning the Git repository
       $ git clone  . -n --recursive
       Cloning... done.
-----> Installing gem dependencies using Bundler
       $ bundle install --without development:test
       Using i18n (0.6.0)
       Using multi_json (1.0.4)
       ...
       Your bundle is complete! It was installed to ./vendor/bundle

ステップ2 リリースへ移動

プロジェクトがビルドされたら、released/ へ移動します。

current/ のシンボリックリンクは最新のリリースへ張り替えられます。

-----> Moving to releases/4
       $ mv "./tmp/build-128293482394" "releases/4"
-----> Symlinking to current
       $ ln -nfs releases/4 current

ステップ3 ローンチ

:launch ブロックのキューされたコマンドが実行されます。
ここではウェブサーバの再起動などをしたりします。
これが成功すれば、完了です!

-----> Launching
       $ cd releases/4
       $ sudo service nginx restart
-----> Done. Deployed v4

失敗した場合は?

どのステップでも失敗した場合はリリースパスは削除され、:clean ブロックでキューされたコマンドが実行されます。そして何も起きなかったことになります。

ビルドが失敗した場合を見てください。

-----> Launching
       $ cd releases/4
       $ sudo service nginx restart
       Starting nginx... error: can't start service
-----> ERROR: Deploy failed.
-----> Cleaning up build
       $ rm -rf tmp/build-128293482394
-----> Unlinking current
       $ ln -nfs releases/3 current
       OK

大した訳じゃないので、あまり参考になら無いどころか余計に分かりにくくなってるかもしれませんが、雰囲気だけでも伝われば、と思います。

しかも微妙にうまく訳せなかった部分がそのまま…カッコわるい…。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする