å人ç¨ã® Slack ã« Hubot ãå ¥ãããä¼ç¤¾ã®ãã¤ã¯ãµã¼ãã¼ã«ç½®ãã¦ãã£ãã®ã§ãGitHub ã« push ãã¦ããã£ããä¸ãã update ãæç¤ºããã¨ããå½¢ã ã£ãããã©ãå人ã®ã¯é¢åãªã®ã§ Heroku ã«ç½®ã㦠GitHub 飿ºã§ push ãããèªåçã«ãããã¤ããããã«ããã
ãããã¤ãã¦ãããã¨ãè¦è¦çã«åããããã«ãããã£ãã®ã§ãWebhook ã§ push ãããã¨ãéç¥ãã¦ããããã¤ä¸ã§ãããã¨ã表示ããããã«ãã¦ã¿ããããã¤ãããã£ãã®ã§ã¡ã¢ã
HTTP Listener
Hubot ã¯èµ·åãã㨠express ã使ã£ã¦ Web ãµã¼ãã¼ãç«ã¡ä¸ãããããã使ã£ã¦ HTTP ãªã¯ã¨ã¹ããåãä»ãã HTTP Listener ãå®ç¾ãã¦ãããããã使ã£ã¦ /hubot/gh-commits
ã« Webhook ãåãåããã¨ã«ããã
æåã¯ä½ãèããã«ä»¥ä¸ã®ããã«æ¸ãã¦ããã
robot.router.post "/hubot/gh-commits", (req, res) -> data = JSON.parse(req.body.payload) robot.messageRoom "general", "[deploy] #{data.user.login}: deploying #{dat.ref} - #{data.compare}" res.send "ok"
ããã¯å®ã¯ééãã§ãpayload
ãªãã¦ãã©ã¡ã¼ã¿ã¯ãªã㦠body
ã«ãã®ã¾ã¾ JSON ãå
¥ã£ã¦ããã
ã§ã¯ãããã¨æã£ãããããéã£ããJSON ã®ãã¼ã¹ã¨ã©ã¼ã«ãªãã
data = JSON.parse(req.body)
å®ã¯ Hubot 㯠express ãç«ã¡ä¸ããã¨ãã« bodyParser
ã¨ãã Middleware ãçµã¿è¾¼ãã§ããããã㯠ã¯ã¨ãªã¹ããªã³ã° ã body ããªã©ã«ããããJSON ã£ã½ãã£ãã JSON ã¿ããã«ç©ºæ°èªãã§ãã¼ã¹ã㦠Object ã«ãã¦ããã¦ãããã
ã¤ã¾ããreq.body
ã¯ãã§ã« Object ã«ãªã£ã¦ããã®ã ã£ãã
data = req.body
secret
GitHub ã® Webhook ã«ã¯ secret
ãæå®åºæ¥ãããããæå®ãã¦ããã¨ããªã¯ã¨ã¹ãã® X-Hub-Signature
ã¨ãããããã«ç½²åãã¤ãã¦ãããããã«ãªãã
ç½²åã¯Digest ã®ã¢ã«ã´ãªãºã (ãã®å ´å㯠sha1
)ã¨ãæ¬ä½ã® JSON ãæå®ãã secret
ã使ã£ã¦ HMAC-SHA1 ã® hexdigest ã«ãããã®ã =
ã§ãã£ã¤ãããã®ã«ãªã£ã¦ããã(ã³ã¼ã)
å¥ã«å½é ãããã¨ããã§è¢«å®³ã¯ãªããã ããã©ããããä¸å¿ãã§ãã¯ãã¦ããã¾ãã
signature = req.header("X-Hub-Signature") hmac = crypto.createHmac("sha1", "secret") hmac.update(JSON.stringify(req.body)) # Object ã«ãªã£ã¦ãã¾ã£ã¦ããã®ã§ hashed_data = hmac.digest("hex") generated_signature = "sha1=#{hashed_data}" if signature is generated_signature # å¦ç
å¾©å¸°å ±å
ãããã¤ãå§ã¾ãã®ã¯ããã®ã ããã©ãçµãã£ããã¨ãå ±åãã¦æ¬²ããã
æåã¯åç´ã«ã¹ã¯ãªãããèªã¿è¾¼ã¾ããç¬éã«çºè¨ããã°è¯ãã®ã§ã¯ã¨æã£ãã®ã ããã©ãã©ãã䏿ããããªãã¦ãsetTimeout
ãããã¡ã«ãªã£ãã
connected
ã¤ãã³ãã emit ããããã¨ã«åã¹ã¯ãªãããèªã¿ã«è¡ã£ã¦ããã®ã§ãã¾ããããããªãã ããã©â¦ããã¡ã¤ã«ã®èªã¿è¾¼ã¿ãçµãã£ã段éã§ãã¤ãã³ããæ¬²ããã
ä½ãããæ¹æ³ãããã°ç¥ãããã