21
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-11-29

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

21
21
1

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
21
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?