Capistrano3.4->3.5のリリースノートを調べてみた

# 何の記事
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](https://github.com/mattbrictson/airbrussh) に変えたらしい。
何もしなくてもバージョンアップすると切り替わる。
deploy.rbやstage.rbに以下を定義する事で、`format_options`を変更できる。
`set :format_options, banner: 'Capistrano start.', color: true, command_output: true, truncate: false`

設定可能項目は[airbrussh#configuration](https://github.com/mattbrictson/airbrussh#configuration)を確認。

個人的には
 - ログファイル出力と標準出力を同時にする機能がデフォルトで搭載になったのが嬉しい。
 - 出力内容は見やすくなったかもしれない。が余り変わらないかもしれない。

## task doctor
doctorタスクが新規に実装されたらしい。3.5以後のHEADにはさらに機能が増えている様子。
doctorタスクは今まで出力しずらかったCapistrano実行中の内部の変数の状況やら、(3.5以後のHEADでは)、Server一覧を出したりとか定義を出力する事を主たる機能として開発している様子。

3.5では `environment` が出力できる様になった。setで定義したけど値が空っぽのものもまるわかりで凄く使いやすいと思う。

```bash
# 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`されるタイミングで何の値がセットされたかをログに出力してくれる機能。

```bash
# 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` が返ってくる。

```rb

# 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 が許可された。まぁ使わないからいらないかも。

@umisora