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 ヘッダによる情報が取得できない点です
構成
GitHub Services
Webhooks & Services
の Services から MQTT
を選択して設定します
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