Skip to content

Instantly share code, notes, and snippets.

@okinaka
Last active August 29, 2015 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save okinaka/8796034 to your computer and use it in GitHub Desktop.
Save okinaka/8796034 to your computer and use it in GitHub Desktop.
chefのdeployリソースを使ってみる

ソース: https://github.com/mechamogera/MyTips/wiki/chef%E3%81%AEdeploy%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B より

デプロイ構成

  • 構成の例
 [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つのフェーズを実行する
  1. checkout
  • 指定されたリビジョンをSCMリソースを使って取得する。
  • SCMリソースは取得したコードをcached-copyに配置し、releasesにコピーする
  1. migrate
  • migrateが実行されるなら、Chefはデータベース設定ファイルのsharedからreleasesに配置したコードへのシンボルリンクを作成する
  • railsアプリでは、migration_commandは一般的にrake db:migrateに設定される
  1. symlink
  • releasesに配置したコードから特定のディレクトリを消してsharedからリンクをはる(デフォルトはlog、tmp/pid、public/system)
  • ユーザがsharedにリンクするディレクトリを用意する必要がある
  • 完了したらreleasesからcurrentにシンボルリンクされる
  1. restart
  • レシピのリスタートコマンドに従ってアプリがリスタートされる

Deploy Provider

  • Deploy ProviderはTimestamped DeployとDeploy Revisionの2つがある
  • 2つの主な違いはリリースディレクトリの名前が異なることであり、その違いがデプロイの方式に影響する。

Timestamped Deploy

  • deploy、timestamped_deployリソースで指定(デフォルトのDeploy Provider)
  • リリースディレクトリはYYYYMMDDHHMMSSの形式のタイムスタンプの名前となる
  • リリースディレクトリの例) [deploy root]/releases/20040815162342
  • 毎回デプロイが実施される

Deploy Revision

  • 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment