-
Notifications
You must be signed in to change notification settings - Fork 4
chefのdeployリソースを使ってみる
mechamogera edited this page Aug 29, 2012
·
11 revisions
- Providers - Chef - Opscode Open Source Wikiをもとに自分なりにまとめてみる
- 構成の例
[release dir]
|-- current -> [release dir]/releases/20120829044144
|-- releases
| |-- 20120829040421
| |-- 20120829042522
| |-- 20120829043409
| |-- 20120829043514
| `-- 20120829044144
`-- shared
- shared
- リリース毎のコードに依存しない設定ファイルや一時ファイルを管理する
- ユーザが管理する必要がある
- railsアプリだと一般的にはconfig、log、pids、systemディレクトリあたりが存在することになる
- releases
- 最新の5つのデプロイしたアプリを保持する
- デプロイプロセスが作成する
- current
- 現在のリリースバージョンへのリンク
- デプロイプロセスが作成する
- デプロイはcheckout、migrate、symlink、restartの4つのフェーズを実行する
- checkout
- 指定されたリビジョンをSCMリソースを使って取得する。
- SCMリソースは取得したコードをcached-copyに配置し、releasesにコピーする
- migrate
- migrateが実行されるなら、Chefはデータベース設定ファイルのsharedからreleasesに配置したコードへのシンボルリンクを作成する
- railsアプリでは、migration_commandは一般的にrake db:migrateに設定される
- symlink
- releasesに配置したコードから特定のディレクトリを消してsharedからリンクをはる(デフォルトはlog、tmp/pid、public/system)
- ユーザがsharedにリンクするディレクトリを用意する必要がある
- 完了したらreleasesからcurrentにシンボルリンクされる
- restart
- レシピのリスタートコマンドに従ってアプリがリスタートされる
- Deploy ProviderはTimestamped DeployとDeploy Revisionの2つがある
- 2つの主な違いはリリースディレクトリの名前が異なることであり、その違いがデプロイの方式に影響する。
- deploy、timestamped_deployリソースで指定(デフォルトのDeploy Provider)
- リリースディレクトリはYYYYMMDDHHMMSSの形式のタイムスタンプの名前となる
- リリースディレクトリの例) [deploy root]/releases/20040815162342
- 毎回デプロイが実施される
- deploy_revision、deploy_branchリソースで指定
- リリースディレクトリはSCMで使用されたリビジョンIDの名前となる
- git:SHAチェックサム
- subverion:リビジョンナンバー
- デプロイしようとしているリビジョンのリリースディレクトリが既に存在するとデプロイしない
%w{sqlite-devel}.each do |package_name|
package package_name do
action :install
end
end
directory "/var/hoge" do
owner "hoge"
group "hoge"
action :create
end
deploy "/var/hoge" do
repo "http://hoge/fisheye/git/hoge.git"
user "hoge"
group "hoge"
environment "RAILS_ENV" => "development"
action :deploy
restart_command "touch tmp/restart.txt"
symlink_before_migrate "db/development.sqlite3" => "db/development.sqlite3"
migrate true
migration_command "rake db:migrate"
before_migrate do
execute "db-migrate" do
user "hoge"
group "hoge"
command "cd #{release_path} && bundle install --path #{File.expand_path("../../shared/vendor/bundle", release_path)}"
action :run
end
end
end