git push 等による GitHub からの HTTP リクエストを受信するためには、GitHub WebHooks を利用するアプリケーションは GitHub から見えるサーバ上に設置する必要があります
今回は、GitHub から直接 HTTP リクエストを受信できない LAN 内の Drone に、GitHub から送信された HTTP リクエストを受信させてみました
構成
GitHub からの POST リクエストを、EC2 上のスクリプトで受信して、
MQTT as a Service sango に POST リクエストを PUBLISH することで、
LAN 内の MQTT Subscriber に GitHub からの POST リクエストが送られ、
さらに、MQTT Subscriber は受信した POST リクエストを Drone に送ります
EC2
GitHub からの POST リクエストを受信して、そのまま sango に PUBLISH します
下記のような適当なスクリプトを準備します
require 'socket'
require 'mqtt'
sango_host = ''
sango_port = 1883
username = ''
password = ''
topic = [username, 'github'].join('/')
Socket.tcp_server_loop('0.0.0.0', 80) do |sock, addr|
payload = ''
length = nil
loop do
buffer = sock.recv(1024)
break if buffer == 0
payload += buffer
if length
body = payload.split("\r\n\r\n")[1]
if body
break if body.length == length.to_i
end
else
if payload =~ /content-length:\s(\d+)\r\n/i
length = $1
end
end
end
client = MQTT::Client.connect(
:host => sango_host,
:port => sango_port,
:ssl => false,
:username => username,
:password => password
)
client.publish(topic, payload)
sock.write("HTTP/1.1 200 OK\r\n\r\n")
sock.close
end
LAN
MQTT Subscriber
下記のようなスクリプトで、あらかじめ sango に SUBSCRIBE しておきます
メッセージを受信すると、そのまま Drone に送信されます
require 'socket'
require 'mqtt'
drone_host = '127.0.0.1'
drone port = 80
sango_host = ''
sango_port = 1883
username = ''
password = ''
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|
sock = TCPSocket.open(drone_host, drone_port)
sock.write(msg)
sock.close
end
追記
直接 sango に PUBLISH する場合は下記を参照
GitHub から MQTT PUBLISH されたメッセージを受信して、POST リクエストで送信する - Qiita