私はこれを以前に構築しましたが、完全に単純ではありません。
最初のステップは、デプロイされたコードの現在のリビジョンの 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
。