tl;dr
前回の「オペミス防止、削減の為にいつも打っているコマンドを rake コマンドに置き換えるマイクロ八苦」の続きということで、も少し凝った(自分比)ことをやる。
メモ
参考
- https://github.com/ruby/rake
- http://docs.seattlerb.org/rake/
- http://www2s.biglobe.ne.jp/~idesaku/sss/tech/rake/
- http://qiita.com/vzvu3k6k/items/7e6e5520eeb829ec1c8b
教材
github.com
Amazon ECR と Docker Compose の連携を試してみる例でコマンドのほとんどを rake
で叩けるようにしただけ。
コマンドを実行する
今更だけど Rake でコマンドを実行する場合には sh
を利用する。また、ruby
を利用することで Ruby
スクリプトを利用することが可能。これらは FileUtils
モジュールにて定義されている。
コマンドに実行については以下の記事にとても詳しく解説されている。
とても参考になった。有難うございました。
コマンドの実行結果を取得する
コマンドの実行結果を取得する場合には以下のように書く。
namespace :sample do desc "Check status_code" task :status_code do sh "exit 1" do |ok, res| p ok.to_s p res.exitstatus end end end
sh
や ruby
にブロックを渡すことでコマンドの実行結果(ステータスコード等)を取得できる。例えば、上記を実行すると以下のように出力される。
$ rake sample:status_code "false" 1
これをうまく使えばタスク内での処理の分岐が捗りそう。
ちなみに、ブロックを渡さない場合(デフォルト)はコマンドが失敗すると RuntimeError となる。
$ rake sample:status_code rake aborted! Command failed with status (1): [exit 1...] /home/vagrant/git/sample-rake-basic/Rakefile:12:in `block (2 levels) in' Tasks: TOP => sample:status_code (See full trace by running task with --trace)
変数
以下のように定数として変数を定義する例。
LOGIN_FILE = "login.txt"
変数の参照は以下のように。
desc "Login Repository" task :login => 'aws:get_login' do sh "sh #{LOGIN_FILE}" Rake::Task[:clean].execute end
成果物の削除
今回は aws:get_login
タスクで認証情報が出力された login.txt
を削除したいので rake/clean
をrequire
することで :clean
又は :clobber
タスクを利用して削除することが可能。
require 'rake/clean' LOGIN_FILE = "login.txt" CLEAN << "#{LOGIN_FILE}" task :clean
対象となるファイルは CLEAN
定数に配列として格納されており、デフォルトでは "**/*~", "**/*.bak", "**/core"
これらのファイルを削除するように定義されている。削除の対象を追加したい場合には上記のように対象のファイル名を配列として追加する
タスクの依存関係
A
のタスクが終了していることが前提で B
のタスクを実行(A
のタスクを実行してから B
のタスクを実行)を表現する例。
desc "Login Repository" task :login => 'aws:get_login' do sh "sh #{LOGIN_FILE}" Rake::Task[:clean].execute end
task :login => 'aws:get_login' do
のように書く。もちろん、namespace をまたいで書くことが出来る。
別のタスクを実行する
これまた以下の例。
desc "Login Repository" task :login => 'aws:get_login' do sh "sh #{LOGIN_FILE}" Rake::Task[:clean].execute end
Rake::Task[:clean].execute
のように書く。この場合には :clean
(成果物を削除するタスク)を実行する。
以上
もしかしたら加齢が原因なのかもしれないし、もともとの性格なのかもしれないけど、うっかりミスをやりガチな自分にとっては出来るだけ素のコマンドを叩かずに今回のように Rake 等に書いた上で実行できるようにしていこうと思った次第。