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