LoginSignup
9
9

More than 5 years have passed since last update.

GitHub から MQTT PUBLISH されたメッセージを受信して、POST リクエストで送信する

Last updated at Posted at 2014-11-30

LAN 内に GitHub WebHooks の HTTP リクエストを届ける - Qiita の MQTT 版です

GitHub WebHooks の代わりに MQTT publish を使用して、git push 時に GitHub から直接 MQTT as a Service sango に メッセージを送信させてみました

WebHooks の場合との違いは、LAN 内に GitHub WebHooks の HTTP リクエストを届ける - Qiita の EC2 インスタンスが不要になる点と、
X-GitHub-Event 等の WebHooks では取得できた HTTP ヘッダによる情報が取得できない点です

構成

drone 2.png

GitHub Services

Webhooks & Services の Services から MQTT を選択して設定します

スクリーンショット 2014-11-30 20.24.37.png

Topic

PUBLISH する Topic は {{ sango の username }}/github/{{ POST リクエスト送信時のパス }} を指定しておきます

POST リクエスト送信時のパス は、Subscriber が POST リクエストを作成する際に使用します

MQTT Subscriber

SUBSCRIBE 時の Topic に Multi-level wildcard で指定しておき、
GitHub で指定した Topic から POST リクエストの送信先のパスを取得して、Drone に POST を送信します

require 'mqtt'
require 'net/http'

username = ''
password = ''
sango_host = ''
sango_port = 1883
drone_host = ''
drone_port = 80
Topic = [username, 'github', '#'].join('/')

client = MQTT::Client.connect(
  :host => sango_host,
  :port => sango_port,
  :ssl => false,
  :username => username,
  :password => password
)

client.get(Topic) do |topic, msg|
  path = topic.split([username, 'github'].join('/'))[1]

  uri = URI.parse("http://#{drone_host}:#{drone_port}#{path}")
  request = Net::HTTP::Post.new(
    uri,
    initheader = {
      'Host' => "#{uri.host}:#{uri.port}",
      'Accept' => "*/*",
      'Content-Type' => 'application/json',
      'Content-Length' => "#{msg.length}"})
  request.body = msg

  Net::HTTP.start(uri.host, uri.port) do |http|
    http.request(request)
  end
end
9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9