Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

何の記事

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

# 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')は使えるが、ROLESHOSTSの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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away