Hubot: meu primeiro 'robô'
E aí galera, ontem eu estava trocando ideia com uma galera no trabalho, e ouvi falar pela décima vez do Hubot, mas dessa vez eu realmente fiquei interessado.
Hubot
É um pequeno robô, capaz de fazer uma infinidade de coisas (via scripts), até mesmo aquelas coisas que as vezes esquecemos (que tem pull request aberto), foi feito pela galera do Github, e se quiser saber mais tem o link no parágrafo de cima.
Ele ainda é bem recente na minha vida, e estou aprendendo o que fazer com ele. Mas para esse post, vou dar o exemplo dele me mostrar os PR abertos em um determinado repositório, certo?
Let is code it
Bom, a primeira coisa que precisamos fazer é instalar o bendito, o Getting Started do Github é muito justo, não faz sentido eu reescrevê-lo, então clica nele e depois volta pra cá.
Como no tutorial do Github diz, todos os scripts podem ser escritos em .js
ou .coffee
, não sou muito fã de CoffeeScript, mas isso não vem ao caso, vamos escrever o script em coffee mesmo.
Todos os scripts ficam embaixo da pasta /scripts
, sendo assim, vamos criar o nosso pull-request.coffee
:
module.exports = (robot) ->
robot.respond /how many pull requests has in (.*) from (.*)/i, (msg) ->
term = msg.match[1]
repo = msg.match[2]
msg.http("https://api.github.com/repos/#{repo}/#{term}/pulls?access_token={seu-token-vai-aqui}")
.header('Accept', 'application/json')
.get() (err, response, body) ->
try
data = JSON.parse(body)
count = 0
for pr in data
count+=1
msg.reply "Has #{count} pull requests"
catch error
msg.reply "Error while parsing JSON :("
Tem um pedacinho ali que você precisa colocar seu access_token, se não o Github não permite você fazer mais que 60 requests por minuto, para gerar o access_token é bem simples, daí você pode mandar como query string ou mesmo como header. No caso, é só colar seu token no {seu-token-vai-aqui}
. O token também te possibilita de ver seus repositórios privados.
Bom, agora ficou fácil, vá para o root do seu hubot e digite:
> bin/hubot
jarvis> jarvis how many pull requests has in oahu from elo7
jarvis> Shell: Has 2 pull requests
Bumm! Ele consome a API do Github e parseia os dados, isso é extremamente simples de fazer, mas pense nos poderes que isso te da, ainda mais sabendo que ele integra facilmente com o Slack, fica fácil encher o saco do time que está com preguiça de abrir o Github para ver os PRs abertos.
Cara, é simples, mas to achando demais. Agora vamos deixar ele mais legal, enchendo o saco de alguém pra revisar o PR:
team_members = [
"Abner",
"Fernando",
"Paulo",
"Wagner"
]
robot.respond /who can review PR in (.*) from (.*)/i, (msg) ->
term = msg.match[1]
repo = msg.match[2]
msg.http("https://api.github.com/repos/#{repo}/#{term}/pulls?access_token={seu-token-vai-aqui}")
.header('Accept', 'application/json')
.get() (err, response, body) ->
try
data = JSON.parse(body)
for pull in data
msg.reply "#{msg.random team_members} should review #{pull.title}"
catch err
msg.reply "No PRs to review"
Ta aí o script enchedor de saco, os nomes dos membros do time eu deixei hardcoded porque ainda não sei uma fonte pra esses dados, certamente quando eu fizer a integração com o slack, vou conseguir pegar os membros de lá.
O teste:
> jarvis who can review PR in oahu from elo7
> Abner should review add-tests Adiciona Testes de qualquer coisa
> Paulo should review hot-fix Corrige redirec de qualquer coisa
Ele está imprimindo no formato {nome} should review {title pull request}
, e pronto, com certeza da pra melhorar o código, mas aprendi coffeescript e hubot agora de manhã, tento fazer coisas mais elegantes depois, prometo :)
Qualquer dúvida, pode me mandar email: abner.terribili@gmail.com
E deixei um repositório no Github