6

nginx + unicorn の背後で一連の Rails/Sinatra アプリを実行しており、ダウンタイムなしでデプロイできます。この設定は気に入っていますが、Unicorn の再起動が完了するまでに時間がかかるため、完了したら何らかの通知を送信したいと考えています。

ユニコーンのドキュメントで見つけることができる唯一のコールバックは、ワーカーのフォークに関連していますが、これでは機能しないと思います。

私が報奨金から探しているものは次のとおりです。古いユニコーン マスターが新しいマスターを開始し、新しいマスターがワーカーを開始し、古いマスターがワーカーを停止して、新しいマスターに引き継がせます。その引き継ぎが完了したら、いくつかの ruby​​ コードを実行したいと考えています。

理想的には、これを行うために複雑なプロセス監視を実装したくありません。それが唯一の方法なら、それでいいのです。しかし、そのルートに進む前に、より簡単なオプションを探しています。

4

2 に答える 2

2

私はこれを以前に構築しましたが、完全に単純ではありません。

最初のステップは、デプロイされたコードの現在のリビジョンの git SHA を返す API を追加することです。たとえば、AAAA をデプロイします。これで BBBB をデプロイすると、それが返されます。たとえば、SHA を返すAPI 「/checks/version」を追加したとします。

この API を実装する Rails コントローラーのサンプルを次に示します。capistrano REVISION ファイルが存在すると想定し、アプリの読み込み時に現在のリリースの SHA をメモリに読み込みます。

class ChecksController
  VERSION = File.read(File.join(Rails.root, 'REVISION')) rescue 'UNKNOWN'

  def version
    render(:text => VERSION)
  end
end

次に、API を介して SHA のローカル ユニコーンをポーリングし、新しいリリースに変更されるのを待ちます。

Capistrano を使用して、実行中のアプリ バージョン SHA と新しくデプロイされたアプリ バージョン SHA を比較する例を次に示します。

namespace :deploy do
  desc "Compare running app version to deployed app version"
  task :check_release_version, :roles => :app, :except => { :no_release => true } do
    timeout_at = Time.now + 60
    while( Time.now < timeout_at) do
      expected_version = capture("cat /data/server/current/REVISION")
      running_version = capture("curl -f http://localhost:8080/checks/version; exit 0")

      if expected_version.strip == running_version.strip
        puts "deploy:check_release_version: OK"
        break
      else
        puts "=[WARNING]==========================================================="
        puts "= Stale Code Version"
        puts "=[Expected]=========================================================="
        puts expected_version
        puts "=[Running]==========================================================="
        puts running_version
        puts "====================================================================="
        Kernel.sleep(10)
      end
    end
  end
end

アプリの平均起動時間と一致するように、ポーリングのタイムアウト/再試行を調整する必要があります。/data/server/currentこの例では、 app が inで port がローカルのユニコーンである capistrano 構造を想定しています8080

于 2013-11-27T09:00:03.813 に答える