読者です 読者をやめる 読者になる 読者になる

ようへいの日々精進XP

よかろうもん

オペミス防止、削減の為にいつも打っているコマンドを rake コマンドに置き換えるマイクロ八苦の続きメモ

ruby rake 超メモ

tl;dr

前回の「オペミス防止、削減の為にいつも打っているコマンドを rake コマンドに置き換えるマイクロ八苦」の続きということで、も少し凝った(自分比)ことをやる。


メモ

参考

教材

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

shruby にブロックを渡すことでコマンドの実行結果(ステータスコード等)を取得できる。例えば、上記を実行すると以下のように出力される。

$ 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 <top (required)>'
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/cleanrequire することで :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 等に書いた上で実行できるようにしていこうと思った次第。