Capistranoのタスクの実際の動作を確認したい時に--dry-run
を指定するのですが、その際に実際に実行するコマンドがサーバー台数分列挙して表示されるため、タスクの実行順序を確認したい際に苦労します。
そこで、タスクの実行順序のみを表示する方法を見つけたので、紹介します。
実行するコマンド
bundle exec cap development deploy --trace --dry-run 2>&1 | grep -E "\(first_time\)"
実行すると以下の様なタスク名が列挙されます。
** Invoke development (first_time)
** Invoke load:defaults (first_time)
** Invoke rbenv:validate (first_time)
** Invoke rbenv:map_bins (first_time)
** Invoke bundler:map_bins (first_time)
** Invoke deploy:set_rails_env (first_time)
** Invoke deploy:set_linked_dirs (first_time)
** Invoke deploy (first_time)
** Invoke deploy:starting (first_time)
** Invoke deploy:check (first_time)
** Invoke git:check (first_time)
** Invoke git:wrapper (first_time)
** Invoke deploy:check:directories (first_time)
** Invoke deploy:check:linked_dirs (first_time)
** Invoke deploy:check:make_linked_dirs (first_time)
** Invoke deploy:check:linked_files (first_time)
** Invoke deploy:set_previous_revision (first_time)
** Invoke deploy:started (first_time)
** Invoke deploy:updating (first_time)
** Invoke deploy:new_release_path (first_time)
** Invoke git:create_release (first_time)
** Invoke git:update (first_time)
** Invoke git:clone (first_time)
** Invoke deploy:set_current_revision (first_time)
** Invoke git:set_current_revision (first_time)
** Invoke deploy:symlink:shared (first_time)
** Invoke deploy:symlink:linked_files (first_time)
** Invoke deploy:symlink:linked_dirs (first_time)
** Invoke deploy:updated (first_time)
** Invoke bundler:install (first_time)
** Invoke deploy:compile_assets (first_time)
** Invoke deploy:assets:precompile (first_time)
** Invoke deploy:assets:backup_manifest (first_time)
** Invoke deploy:cleanup_assets (first_time)
** Invoke deploy:normalize_assets (first_time)
** Invoke deploy:migrate (first_time)
** Invoke deploy:migrating (first_time)
** Invoke deploy:publishing (first_time)
** Invoke deploy:symlink:release (first_time)
** Invoke deploy:published (first_time)
** Invoke deploy:finishing (first_time)
** Invoke deploy:cleanup (first_time)
** Invoke deploy:finished (first_time)
** Invoke deploy:log_revision (first_time)
解説
仕組みとしては、---dry-run
で実際の流れを追いつつも、--trace
でタスクの呼び出しを出力されるようにしています。
ここで、出力されるtraceのログは"** Invoke"や"** Execute"という形で標準エラー出力に出力されるので、2>&1
でエラー出力を標準出力にリダイレクトさせてます。
あとは、サーバ台数分の"** Invoke"や"** Execute"が出力される中から、** Invoke bundler:map_bins (first_time)
というように"(first_time)"が記載されたログのみを抽出するようにします。
after
やbefore
といったフックで複雑化したり、gemでそもそもどのタイミングなのかわかりづらく、全体の実行順序を把握しづらいCapistranoのタスクですが、これで把握できるようになります!