目标
快速做到任何有网的地方可以处理
背景说明
- 我们部分服务是内网的,也就是出了公司就无法处理,或者需要打开电脑,需要vpn,相对来说,有一点不方便
- 一个功能开发是需要时间的,例如一个审批流程,涉及逻辑,界面,测试
- 假设我们现在有个git仓库,代码提交后,我们希望做一些事情,但前提是在做之前,需要人工审核下提交的内容,如何可以做到不用开电脑,不用vpn,用一台手机就可以快速地进行处理?BearyChat就可以,如果需要更强大,更方便,可以整合Hubot
BearyChat的2个机器人
BearyChat自带了2个机器人,Incoming和Outgoing,现在让我们来看看如何用他们来把我们的审核流程串起来
- 注册BearyChat,进去后,添加一个讨论组,例如叫abc
- 去到机器人管理,添加Incoming机器人,给它一个名字,例如叫chathubot,选择发给它的内容要转发到哪里,我们选择发送到abc,这时会得到一个hook地址,还有说明文档,我们拿到hook地址
- 在git里部署hook,和svn一样,git钩子分2种:客户端和服务器端,本例中,比较理想是用服务器端的post-receive,但查了资料,gitbucket并不支持服务器端钩子,那本例中只能用post-commit这个本地钩子,钩子代码见下面
- 此时,git提交的diff内容和版本号已经发送到abc讨论组了,我们来设置Outgoing,设置名字后,设置“触发词”和“POST地址”,就是定义在聊天里发送了什么内容,触发BearyChat这个Outing机器人,向“POST地址”提交内容。我们设置触发词为「!upgit」,post地址为我们httpsqs的地址
- 我们安装BearyChat客户端或者在网页端,选择abc讨论组,发送「!upgit 1ae4082」,「1ae4082」为本次git提交的版本号,这时机器人就会把一段信息发送到httpsqs,发送的消息内容见下文
- 从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
一些说明
- 环境说明:CentOS 6.2 64bit
- 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是它的默认插件,所以,最简单的应该是这个指令
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