何の記事
Capistrano3.4から3.5へバージョンアップした際に確認したCHANGELOGを日本語約+検証結果を添えて記載する
個人的に使用する機能だけをPickUpしているので全てではないが、英語読むの面倒。どんな効果があるの?が誰かの参考になれば幸い。
CHANGELOG
https://github.com/capistrano/capistrano/blob/master/CHANGELOG.md
新機能
the default logging format has been changed to Airbrussh.
ログの出力に使っているライブラリを Airbrussh に変えたらしい。
何もしなくてもバージョンアップすると切り替わる。
deploy.rbやstage.rbに以下を定義する事で、format_options
を変更できる。
set :format_options, banner: 'Capistrano start.', color: true, command_output: true, truncate: false
設定可能項目はairbrussh#configurationを確認。
個人的には
- ログファイル出力と標準出力を同時にする機能がデフォルトで搭載になったのが嬉しい。
- 出力内容は見やすくなったかもしれない。が余り変わらないかもしれない。
task doctor
doctorタスクが新規に実装されたらしい。3.5以後のHEADにはさらに機能が増えている様子。
doctorタスクは今まで出力しずらかったCapistrano実行中の内部の変数の状況やら、(3.5以後のHEADでは)、Server一覧を出したりとか定義を出力する事を主たる機能として開発している様子。
3.5では environment
が出力できる様になった。setで定義したけど値が空っぽのものもまるわかりで凄く使いやすいと思う。
# Sample
$ cap local doctor app=my_app
Capistrano start.
Environment
Ruby ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
Rubygems 2.4.5.1
Bundler N/A
Command /opt/mware/ruby/bin/cap local doctor app=my_app
Gems
capistrano 3.5.0
airbrussh 1.0.2
rake 11.2.2
sshkit 1.11.1
capistrano-harrow 0.5.2
Variables
:application "my_app"
:branch "master"
:default_env {}
:distributed_retention_days 0
:environment "local"
:format :airbrussh
~~(割愛)~~
:slack_channel is not a recognized Capistrano setting (config/deploy/local.rb:56)
:slack_webhook_url is not a recognized Capistrano setting (config/deploy/local.rb:57)
--print-config-variables option
taskを実行しながら、environment
がset
されるタイミングで何の値がセットされたかをログに出力してくれる機能。
# sample
$ cap staging doctor --print-config-variables
Config variable set: :print_config_variables => true
Config variable set: :stage => :staging
Config variable set: :scm => :git
Config variable set: :branch => "master"
Config variable set: :deploy_to => #
Config variable set: :tmp_dir => "/tmp"
Config variable set: :default_env => {}
Config variable set: :keep_releases => 5
Config variable set: :format => :airbrussh
Config variable set: :log_level => :debug
Config variable set: :pty => false
Config variable set: :local_user => #Config variable set: :format => :airbrussh
Config variable set: :application => "my_app_name"
Config variable set: :repo_url => "git@example.com:me/my_repo.git"
Config variable set: :git_environmental_variables => #
Environment
Ruby ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
Rubygems 2.4.5.1
Bundler N/A
・
・
・
(ここから下は上述のdoctorの結果と同じ)
Added a dry_run? helper method
dry_run?
メソッドが実装されたらしい!
コレ欲しかった、自作タスクで run_locally を使うと、dry_runが効かなかったっていう問題の対応だと思う。
こんなタスクを用意した時に
task :command_test do
on('localhost') do
info(capture "echo on localhost hostname=`hostname`")
end
end
task :command_test2 do
run_locally() do
info(capture "echo run_locally hostname=`hostname`")
end
end
cap hoge fuga --dry_run を実行すると、command_test
はコマンドだけ表示されて実際にリモート(経由のローカル)では実行されないが、 command_test2
では実行されてしまう。つまり、on('hostname')の時しか効かない。
それはdry_run
オプションを有効に使ってるのがSSHKitの部分で、SSKitのSSHコマンド発行時に実際に実行せず実行する予定のコマンドを出力する。という機能のオプションを使う為に、Capistranoにdru_run
オプションがある。
run_locally
を使うとSSH使わないのでdru_run
が効かないという事。
とはいえ、自作タスクでrun_locally
は使いたいわけで、
dry_run?
メソッドを使って、判定させると
-n
オプションがあるときには dry_run? = true
が返ってくる。
# Sample Task
task :command_test2 do
run_locally() do
p dry_run?
end
end
$ cap local test:command_test2
Capistrano start.
false
00:00 test:command_test2
$ cap local test:command_test2
Capistrano start.
true
00:00 test:command_test2
って書いて思ったけど、SSHKit 1.5から on('localhost')
が有効に書けるようになったので
run_locallyよりも on('localhost') を使えばよしなにやってくれるかもしれない。と考えたが
Capistranoを経由するとon('hostname')は使えるが、ROLES
やHOSTS
のFilterが有効に聞いてしまうので
server
定義にlocalhost
がないと実行されない。動的にserver
を定義してるとちょっと手間かもしれない。
BugFix / Changes
Allow use "all" as string for server filtering
SeverFiletr ( ENV['HOSTS']やENV['ROLES']等)にall
というStringが指定出来るようになった。
今までは予約語だったから使えなかったけど、ユーザーがall
ってのを定義してもよいという事になった。
(多分。試してない)
Capistrano is now fully-compatible with Rake 11.0. (@mattbrictson)
Rake11.0 と完全互換のRakeタスクが実装できる。
Fix filtering behaviour when using literal hostnames in on() block
on(hostname)
を定義した時にバグがあったのかな?リファクタした感じらしい。
Allow dot in :application name
:application
の名前に dot が許可された。まぁ使わないからいらないかも。