自动化测试中的Slack机器人-高级篇

背景介绍

自动化测试中的Slack机器人-基础篇一文中,我们介绍了如何在Slack上注册一个聊天机器人,并且让它负责Jenkins的运维工作。接下来,我们来详细介绍如何打造自己的自动化机器人。

开发准备

API简介

Slack API

Slack提供了多种语言的API客户端,方便用户使用API来与Slack进行交互。具体请参考Slack Bot API页面介绍。
这里,我们使用第三方的Slack API的封装库Botkit, Botkit实现了对API级别更高级的封装,屏蔽了底层的交互细节,使大家更专注于业务逻辑实现。非常方便,简单易使用。

安装botkit库

由于botkit是nodejs开发的,所以我们首先需要准备nodejs环境。

npm install --save botkit

原型开发

使我们的Bot处于在线状态

将token中填入自己创建的Bot的API Token序列串。

var Botkit = require('botkit');
var controller = Botkit.slackbot();
var bot = controller.spawn({
  token: your_slack_bot_token
})
bot.startRTM(function(err,bot,payload) {
  if (err) {
    throw new Error('Could not connect to Slack');
  }
});

开始处于处于离线状态的autobot.

Bot Offline

将上面的代码保存为bot.js, 然后执行

node bot.js

就可以在Slack中看到我们开发的autobot机器人处于在线状态了,如下图所示;不过由于代码中,我们没做业务逻辑处理,所以我们的机器人还不会做任何事情。

Bot Online

使用一些基本的Bot命令

这里,我们使用botkit提供的bot.hears()命令,来监听聊天中的关键字信息,并进行回复。

基于如下模板编写代码

controller.hears(["keyword","^pattern$"],["direct_message","direct_mention","mention","ambient"],function(bot,message) {
  // do something to respond to message
  // all of the fields available in a normal Slack message object are available
  // https://api.slack.com/events/message
  bot.reply(message,'You used a keyword!');
});

我们监听消息open the (.*) doors, 然后回复该消息,如果是pod bay则回复Sorry信息,否则回复Okay.

controller.hears('open the (.*) doors',  ['message_received'],function(bot,message)
 { 
    var doorType = message.match[1]; //match[1] is the (.*) group. match[0] is the entire group (open the (.*) doors).
     if (doorType === 'pod bay')
     {
        return bot.reply(message, 'I\'m sorry, Dave. I\'m afraid I can\'t do     that.'); 
    }  
    return bot.reply(message, 'Okay');
});

Botkit的其他API介绍和使用样例,点击这里查看,我们在本章中就不过多介绍了。下面我们重点介绍如何使Bot机器人与我们的jenkins系统进行交互。

当前,我们的jenkins地址为 http://localhost:8080

添加自定义jenkins build 相关命令

controller.hears(['jenkins build job (.*)'], 'direct_message,direct_mention,mention', function(bot, message) {
  var matches = message.text.match(/build job (.*)/i);
  var job_name = matches[1];
  console.log(job_name)
  var job_url = encodeURI('http://localhost:8080/job/'+job_name+'/build')
  request.post({url: job_url}, function (error, response, body) {
        if (!error && response.statusCode == 201) {
          console.log(body)
          var str = 'I have notify jenkins server to run this command. ^_^'
          bot.reply(message, str)
        } else {
          bot.reply(message, 'error, maybe the job *'+job_name+'* not found. I am sorry for that. >_<!!')
        }
    })
})

我们主要是用到了nodejs的request库来调用Jenkins 提供的RESTful API实现与Jenkins交互的。如果提示错误信息,请确保jenkins的访问策略配置,我们的用例是没有带Jenkins API Token访问的。

nodejs requests

添加自定义jenkins robot 相关命令

例如,获取robot framework项目的执行结果情况。


bot jenkins commands

功能代码实现如下:

controller.hears(['jenkins get job-robot-result (.*)'], 'direct_message,direct_mention,mention', function(bot, message) {
  var matches = message.text.match(/get job-robot-result (.*)/i);
  var job_name = matches[1];
  console.log(job_name)
  var job_url = encodeURI('http://localhost:8080/job/'+job_name+'/lastBuild/robot/api/json?pretty=true')
  request({url: job_url}, function (error, response, body) {
    //   console.log(response)
      if (!error && response.statusCode == 200) {
        var json = JSON.parse(body)
        var critical_failed = json['criticalFailed']
        var critical_total = json['criticalTotal']
        var pass_percentage = json['passPercentage']

        var reply_with_attachments = {
            "attachments": [
                {
                    "fallback": "Required plain-text summary of the attachment.",
                    "color": "#36a64f",
                    "pretext": "result from jenkins server.",
                    "title": "The last build robot result of " + job_name,
                    "title_link": job_url,
                },
                {
                    "fields": [
                        {
                            "title": "Failed Cases",
                            "value": critical_failed,
                            "short": true
                        },
                        {
                            "title": "Total Cases",
                            "value": critical_total,
                            "short": true
                        },
                        {
                            "title": "Pass Percentage",
                            "value": pass_percentage + '%',
                            "short": true
                        }
                    ]
                }
            ]

        }
        console.log(JSON.stringify(reply_with_attachments))
        bot.reply(message, reply_with_attachments)

      }
      else {
          bot.reply(message, 'something error, maybe the job name is not correct. please make sure.')
      }
     })
})

还可以添加其他一些命令,这里就不再介绍了。

Get Job Build Info
All Commands

总结

好了,至此,我们也介绍完了如何打造自己的Slack聊天运维机器人了,至于如何使自己的机器人更智能,还需要自己慢慢完善,我这里仅仅是给出一个样例,方便大家入门。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容