Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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
Hexa
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away