Статьи

Виджеты мониторинга сборки с помощью Ruby и BitBar

BitBar-маленький

Разработчики Ruby привыкли находить невероятно полезные проекты с открытым исходным кодом, упакованные в виде гемов. В этом руководстве мы рассмотрим BitBar, проект с открытым исходным кодом, который не построен на Ruby, но в сочетании с небольшим количеством Ruby может быть невероятно мощным.

Хотя первоначальный проект больше не поддерживается, обновленную ветку проекта можно найти здесь: https://github.com/kamenevn/bitbar

BitBar предоставляет пользователям Mac OS X простой способ создать элемент строки меню из стандартного вывода скрипта. Я покажу вам, как создать простой монитор проверки связи с сайтом, а затем мы создадим счетчик подписчиков в Твиттере.

Установка BitBar

Чтобы установить BitBar, посетите репозиторий GitHub по адресу https://github.com/kamenevn/bitbar . Загрузите zip-файл (кнопка для загрузки находится на правой боковой панели). Внутри архивной папки вы найдете папку «Releases», в которой находится файл BitBar.app Поместите это в свой каталог приложений. Открытие этого приложения запускает BitBar.

Как работает BitBar: структура файла

BitBar — это простое приложение, которое запускает все сценарии оболочки в заданном каталоге с интервалом, который определяется именем файла. Конечно, вы должны быть очень осторожны при добавлении сценариев в BitBar, особенно если вы добавляете небольшой интервал времени.

Чтобы запускать данный файл каждые 5 минут, структура имен будет выглядеть примерно так:

 my_script.5m.sh

Конечно, вы также захотите сделать ваши скрипты исполняемыми. Обратите внимание, что в своей документации BitBar называет эти скрипты «плагинами».

Как работает BitBar: вывод скрипта

Чтобы добавить видимый текст в ваш плагин BitBar, вам нужно будет отправить вывод в STDOUT В Ruby это просто вывод puts По умолчанию BitBar будет циклически проходить по каждой строке вывода, если вы не выводите конкретную строку «-»; все, что находится после этой строки, будет отображаться в раскрывающемся списке после того, как вы щелкнете элемент BitBar в строке меню.

BitBar также позволяет изменять цвет текста и реагировать на клики. Клики могут открывать URL-адрес или запускать другой сценарий оболочки, и его можно настроить в фоновом режиме.

Вот простой скрипт на Ruby, который создает ссылку на StackOverflow в BitBar:

 url = "https://stackoverflow.com"
puts "Go to StackOverflow | href=#{url}"

Обратите внимание на | разделение выводимого текста и параметров для нажатия. Параметр href Вот более сложный пример, показывающий некоторый красный текст, который запускает другой исполняемый скрипт:

 puts "Run My Script | color=#ff0000 bash=/path/to/your/script.sh"

Конечно, еще раз, вы захотите, чтобы этот скрипт был настроен на выполнение с помощью chmod

Наконец, если скрипт принимает параметры, вы можете добавить их, используя param1param2param3 Если вы хотите выполнить скрипт bash в фоновом режиме при нажатии, установите для параметра terminal=false Например, вы можете использовать текущее время в качестве параметра для сценария, который выполняется в фоновом режиме:

 current_time = Time.now.to_i
puts "Run My Script | color=#ff0000 bash=/path/to/your/background_script.sh terminal=false param1=#{current_time}"

Создание монитора сайта

Теперь, когда мы знаем, как работает BitBar, давайте создадим монитор сайта в Ruby, который мы затем сможем использовать с BitBar. Как заявление об отказе от ответственности, вы должны знать, что только проверка статуса сайта с вашего собственного компьютера может не дать вам полную картину. Чтобы действительно знать, не работают ли ваши сайты, используйте службы мониторинга и такие сайты, как uptimerobot.com . Но этот маленький виджет обеспечит быстрый взгляд и сигнализирует о потенциальных проблемах по мере их возникновения.

Требуемым поведением является точка маркера, красная или зеленая, в зависимости от состояния списка сайтов. Я хочу иметь возможность сохранить этот список сайтов в легко обновляемом файле YAML. Когда один из сайтов выходит из строя, я хочу иметь возможность щелкнуть пункт маркера в моей строке меню и увидеть сбойный сайт. Я также хочу иметь возможность щелкнуть этот пункт меню, чтобы посетить сайт в моем браузере.

Давайте начнем с некоторого Ruby!

Класс проверки сайта

Сначала мы создадим простой класс с именем SiteChecker

 # /path/to/bitbar_plugins/site_checker/site_checker.rb
require 'yaml'
require 'net/http'

class SiteChecker

  def initialize(sites)
    @sites = sites
  end

  def up?(server, port=80)
    http = Net::HTTP.start(server, port, {open_timeout: 5, read_timeout: 5})
    response = http.head("/")
    response.code == "200"
  rescue Timeout::Error, SocketError
    false
  end

  def run
    results = {}
    @sites.map {|s| results[s] = up?(s) }
    results
  end
end

Большой! Теперь у нас есть простой класс Ruby, который может проверять любой данный сайт, может быть инициализирован списком проверяемых сайтов и возвращает хэш результатов.

Далее, давайте напишем фактический плагин BitBar, который будет использовать класс SiteChecker Добавьте папку в папку плагинов BitBar с именем site_checkerтам файл site_checker.rb . Затем создайте файл с именем site_checker.3m.sh и поместите его в каталог плагинов BitBar. Вот как выглядит этот файл:

 #!/usr/bin/env ruby
# Note: the ruby path above should point to your Ruby installation.
# You can verify this by checking `which ruby`
$:.unshift File.dirname(__FILE__)
require 'site_checker/site_checker.rb'
require 'yaml'
def run
  sites = YAML.load_file(File.join(__dir__, 'site_checker/sites.yml'))["sites"]
  site_checker = SiteChecker.new(sites)
  results = site_checker.run
  if results.values.include? false
    puts "• | color=#ff0000"
    puts "---"
    results.select {|key, val| val == false }.keys.each do |site|
      puts "#{site} down | href=http://#{site}"
    end
  else
    puts "• | color=#82B021"
  end
end
run

Этот простой скрипт форматирует выходные данные нашего класса SiteChecker для использования BitBar. Наконец, нам нужно убедиться, что мы добавили наш файл sites.yml в наш каталог site_checker :

 SiteChecker

Убедитесь, что ваш сайт использует только свое доменное имя (без каких-либо протоколов).

Последний шаг — сделать скрипт исполняемым. Вы можете сделать это, запустив sites:
- "google.com"
- "twitter.com"
- "yoursite.com"
Полученная файловая структура должна выглядеть следующим образом:

 chmod +x site_checker.3m.sh

Счетчик Твиттера

Далее, давайте сделаем что-то более сложное. Мы покажем, сколько пользователей мы подписываемся и сколько пользователей подписались на нас в Twitter.

Первым шагом является регистрация приложения в Twitter . После того, как вы выполнили все шаги и успешно создали свой проект, вам нужно будет найти ключи API и токены доступа для приложения.

Затем создайте папку в каталоге плагинов BitBar с именем twitter_counter и соответствующий файл плагина с именем twitter_counter.10m.sh .

Внутри только что созданной папки twitter_counter создайте файл account_detail.rb . Мы будем использовать это для создания простого класса, который будет возвращать информацию о количестве подписок для учетной записи Twitter.

Класс ├── site_checker
│ ├── site_checker.rb
│ └── sites.yml
├── site_checker.3m.sh

 AccountDetail

Убедитесь, что вы запустили require 'twitter'
class AccountDetail
attr_accessor :user

def initialize(username)
@client = create_client
@user = @client.user(username)
end

def followers
user.followers_count
end
def followings
user.friends_count
end

private

def create_client
Twitter::REST::Client.new do |config|
config.consumer_key = "YOUR CONSUMER KEY"
config.consumer_secret = "YOUR CONSUMER SECRET"
config.access_token = "YOUR ACCESS TOKEN"
config.access_token_secret = "YOUR ACCESS TOKEN SECRET"
end
end
end
В предыдущем примере мы использовали встроенные библиотеки. Твиттер — это сторонний гем, который должен быть установлен до того, как этот класс заработает.

Класс gem install twitterAccountDetail Затем отредактируйте файл twitter_counter.10m.sh, чтобы он выглядел так:

 #!/usr/bin/env

$:.unshift File.dirname(__FILE__)
require 'twitter_counter/account_detail'

def run
  @account_detail = AccountDetail.new('your_twitter_name')
  puts "#{@account_detail.followers} followers"
  puts "#{@account_detail.followings} following"
end
run

Наконец, отредактируйте разрешения для скрипта, чтобы сделать его исполняемым. Пока все настроено правильно, в меню вы должны увидеть простой виджет, который переключается между вашим счетом «подписчиков» и счетчиком «подписчиков». Конечно, мы могли бы использовать гораздо больше API Twitter, чтобы делать еще более интересные вещи!

Вывод

Хотя этот инструмент нельзя использовать в проекте, который вы собираетесь отправить своим клиентам, он, безусловно, может быть полезным и интересным инструментом для создания ваших собственных нативных приложений. Вот несколько идей для других проектов, использующих BitBar:

  • Индикатор состояния сборки (интеграция с чем-то вроде CircleCI или Codeship)
  • Полоса продажи тикер
  • Простой простой в доступе список действий для выполнения распространенных задач или макрофункций
  • Визуальное отображение вещей с чем-то вроде (Spark) [https://github.com/holman/spark]

Поделитесь своими идеями с нами здесь! Счастливого взлома!