Edited at

LAN 内に GitHub WebHooks の HTTP リクエストを届ける

More than 3 years have passed since last update.

git push 等による GitHub からの HTTP リクエストを受信するためには、GitHub WebHooks を利用するアプリケーションは GitHub から見えるサーバ上に設置する必要があります

今回は、GitHub から直接 HTTP リクエストを受信できない LAN 内の Drone に、GitHub から送信された HTTP リクエストを受信させてみました


構成

drone.png

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