寻觅生命中的那一片浅草......

ChatOps:Hubot和BearyChat简介

目标

快速做到任何有网的地方可以处理

背景说明

  1. 我们部分服务是内网的,也就是出了公司就无法处理,或者需要打开电脑,需要vpn,相对来说,有一点不方便
  2. 一个功能开发是需要时间的,例如一个审批流程,涉及逻辑,界面,测试
  3. 假设我们现在有个git仓库,代码提交后,我们希望做一些事情,但前提是在做之前,需要人工审核下提交的内容,如何可以做到不用开电脑,不用vpn,用一台手机就可以快速地进行处理?BearyChat就可以,如果需要更强大,更方便,可以整合Hubot

BearyChat的2个机器人

BearyChat自带了2个机器人,Incoming和Outgoing,现在让我们来看看如何用他们来把我们的审核流程串起来

  1. 注册BearyChat,进去后,添加一个讨论组,例如叫abc
  2. 去到机器人管理,添加Incoming机器人,给它一个名字,例如叫chathubot,选择发给它的内容要转发到哪里,我们选择发送到abc,这时会得到一个hook地址,还有说明文档,我们拿到hook地址
  3. 在git里部署hook,和svn一样,git钩子分2种:客户端和服务器端,本例中,比较理想是用服务器端的post-receive,但查了资料,gitbucket并不支持服务器端钩子,那本例中只能用post-commit这个本地钩子,钩子代码见下面
  4. 此时,git提交的diff内容和版本号已经发送到abc讨论组了,我们来设置Outgoing,设置名字后,设置“触发词”和“POST地址”,就是定义在聊天里发送了什么内容,触发BearyChat这个Outing机器人,向“POST地址”提交内容。我们设置触发词为「!upgit」,post地址为我们httpsqs的地址
  5. 我们安装BearyChat客户端或者在网页端,选择abc讨论组,发送「!upgit 1ae4082」,「1ae4082」为本次git提交的版本号,这时机器人就会把一段信息发送到httpsqs,发送的消息内容见下文
  6. 从httpsqs获取内容并做操作,好像没什么好说的了

post-commit

#!/usr/local/bin/python2.7
#-*- encoding:UTF-8 -*- 
# johncan 2016-04-03 17:32:17

import sys  
reload(sys)
sys.setdefaultencoding('utf8')

import commands
import requests
import json

incommint_url='https://hook.bearychat.com/xxxx'
git_ci_content = commands.getoutput('/usr/bin/git log -1 -p pre-commit')

payload = {"text":git_ci_content}

headers = {'content-type': 'application/json'}
r = requests.post(incommint_url, data=json.dumps(payload), headers=headers)
# print r.content

Outgoing机器人post的消息内容参考

{
    "channel_name": "abc",
    "subdomain": "xxxx",
    "text": "!upgit 1ae4082",
    "token": "xxxx",
    "trigger_word": "!upgit",
    "ts": 1459824707044,
    "user_name": "xxxx"
}

和Hubot整合

这个对于我们目前的需求来说,不是必须的

安装Hubot

一些说明

  1. 环境说明:CentOS 6.2 64bit
  2. Hubot很多东西都是通过环境变量来设置
# 设置debug模式
export HUBOT_LOG_LEVEL="debug"
# 设置监听端口
export EXPRESS_PORT=8081

开始安装

yum install nodejs npm redis -y
# 此处请修改redis安全配置,然后启动redis
# 网上也有资料说不用redis也可以
/etc/init.d/redis start
npm install -g coffee-script hubot yo generator-hubot
# 比较奇怪,用root初始化hubot会出错,下面用普通用户初始化hubot
useradd bchubot
su - bchubot
sudo mkdir /data/bchubot
cd /data
sudo chown bchubot.bchubot bchubot
cd bchubot
yo hubot
npm install hubot-bearychat --save

BearyChat添加Hubot

去到机器人管理,添加Hubot,这里会生产一个Token,复制Token

启动hubot

export HUBOT_BEARYCHAT_TOKENS='token_from_bearycaht'
export EXPRESS_PORT=8081
/data/bchubot/bin/hubot -a bearychat

BearyChat填写Hubot地址

http://hubot_ip:hubot_port/

此时可以测试发送消息给hubot,测试指令精选

# hubot会回PONG
ping
# 会发送一张gif的http地址
pug me

Hubot的动作是需要用coffee-sctipts写的,没有深入研究

其他

hubot的启动

网上很多资料都说可以直接运行hubot就可以跟它聊天,我测试是不行的,campfire是它的默认插件,所以,最简单的应该是这个指令

hubot -a campfire

post提交数据类型

如果data中含有换行符和&等字符,需要用这种方式发,当时在这里耗了一天的时间

import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
headers = {'content-type': 'application/json'}

r = requests.post(url, data=json.dumps(payload), headers=headers)

更多可以参考Requests的文档

一个用Hubot做发布的案例

湾区日报的第一个“员工”:Slack/Hubot

2020年十月
« 2月    
 1234
567891011
12131415161718
19202122232425
262728293031