Недавно я писал о том, как сделать всплывающие уведомления об окончании работы rake-задач. После этого нововведения работать стало существенно приятнее, поэтому я решил развивать успех в это правлении и сделал такие же всплываюшие уведомления для Capistrano.

В отличии от rake, в Capistrano предусмотрена возможность создавать функционал, который подгружается при выполнении любых задач. Этот функционал необходимо размещать в файле .caprc в домашней папке пользователя, это обычный ruby-файл.

Кроме того, Capistrano предоставляет API для создания callback-ов, которые могут выполняться как для отдельных задач, так и для всех задач сразу:

Ruby Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
on :before do
  # Выполнится перед каждой задачей
end

on :after, :only => "deploy" do
  # Выполнится только после deploy
end

on :after, :except => "deploy:migrations" do
  # Выполнится после каждой задачи, кроме deploy:migrations
end

Доступные callback-и:

  • :before – вызывается перед выполнением задачи
  • :after – вызывается после выполнения задачи
  • :start – вызывается перед началом выполнения задачи верхнего уровня (вызванной через консольную команду cap)
  • :finish – вызывается после окончания выполнения задачи верхнего уровня
  • :load – вызывается после загрузки рецептов
  • :exit – вызывается после окончания выполнения всех задач

Мне необходимо добавить уведомление об окончании выполнения всех запрошенных задач, для этого я должен “повесить” свой код на событие :exit. Код для .caprc в этом случае у меня будет выглядеть вот так:

Ruby Code
1
2
3
4
5
6
7
def notify(message, body, urgency, icon = :info)
  system("notify-send --urgency=#{urgency} --icon=#{icon} '#{message}' '#{body}'")
end

on :exit do
  notify('Capistrano Task: Finished', ARGV.join(' '), :low)
end

После завершения выполнения команды cap deploy я теперь получаю вот такое уведомление:

Очень удобно, на мой взгляд. Не хватает только информации о времени выполнения задач. Но это как-нибудь в следующий раз.