Gort é uma estrutura de chatbot projetada desde o início para chatops.
Gort traz o poder da linha de comando para o local onde você colabora com sua equipe: sua janela de bate-papo. Seu suporte de pacote de comandos aberto permite que os desenvolvedores implementem funcionalidades na linguagem de sua escolha, enquanto o poderoso controle de acesso significa que você pode colaborar até mesmo nas tarefas mais confidenciais com confiança. O foco na extensibilidade e adaptabilidade significa que você pode responder rapidamente ao inesperado, sem que sua equipe perca visibilidade.
A documentação oficial pode ser encontrada aqui: The Gort Guide.
Gort foi inicialmente concebido como uma reimplementação Go do Cog do Operable e, embora permaneça fortemente inspirado no Cog, Gort seguiu seu próprio caminho.
Durante nossa discussão inicial sobre design, descobrimos que muitos dos recursos do Cog, por mais inovadores que fossem, não eram utilizados e a base de código tornou-se difícil de estender e manter. Além disso, sua linguagem de implementação – Elixir – tinha relativamente poucos desenvolvedores proficientes. A solução, que foi discutida por muitos meses no espaço de trabalho Cog Slack, foi reescrever o Cog do zero em Go, removendo algumas funcionalidades menos utilizadas e reduzindo a complexidade do processo.
Isto nos deu a oportunidade de considerar e possivelmente redefinir o que Cog deveria ser. Escolher os recursos que fazem sentido e descartar aqueles que não fazem. Desta forma, Gort pode ser descrito mais como um “sucessor espiritual” de Cog do que uma reimplementação fiel.
A filosofia de design de Gort enfatiza flexibilidade e segurança, permitindo que você crie comandos em qualquer linguagem que desejar, usando ferramentas com as quais você já está familiarizado e pode controlar rigorosamente quem pode usá-los e como.
Mais especificamente:
Cada um deles é descrito com mais detalhes abaixo.
Os usuários interagem principalmente com Gort por meio de comandos , que são acionados por um caractere de comando ( !
por padrão), mas são conceitualmente idênticos aos comandos inseridos na linha de comando.
Por exemplo, usar um comando echo
pode ser parecido com o seguinte:
Conforme mostrado, a saída de comandos bem-sucedidos é retransmitida por Gort.
Mais informações sobre comandos podem ser encontradas no Guia Gort:
Os comandos Gort são criados como imagens de contêiner, o que significa que você pode construí-los em qualquer linguagem com a qual se sinta confortável.
Além do mais, como o seu executável recebe todas as entradas do chat exatamente como se estivesse sendo digitado na linha de comando, você pode usar qualquer interpretador de linha de comando que desejar. Os comandos podem até ser implementados como scripts Bash ou usando comandos existentes, como curl
!
Mais informações sobre como escrever comandos podem ser encontradas no Guia Gort:
No Gort, um conjunto de um ou mais comandos relacionados pode ser instalado como um "pacote de comandos".
Um pacote configurável é representado em YAML, especificando qual executável usar para cada comando e quem tem permissão para executar cada comando.
Um arquivo de pacote muito simples é mostrado abaixo.
---
gort_bundle_version : 1
name : echo
version : 0.0.1
image : ubuntu:20.04
author : Matt Titmus
homepage : https://guide.getgort.io
description : A test bundle.
long_description : |-
This is an example bundle. It lets you echo text using the "echo"
command that's built into Ubuntu 20.04.
permissions :
- can_echo
commands :
echo :
description : " Echos back anything sent to it. "
executable : [ "/bin/echo" ]
rules :
- must have echo:can_echo
Isso mostra um pacote chamado echo
, que define um comando (também chamado echo
) e uma permissão chamada can_echo
. Depois de instalado, qualquer usuário com permissão echo:can_echo
pode executá-lo no Slack.
Mais informações sobre pacotes podem ser encontradas no Guia Gort:
No Gort, os usuários podem ser mapeados exclusivamente para usuários em um ou mais provedores de chat. Os usuários Gort podem ser membros de um ou mais grupos , que por sua vez podem ter qualquer número de funções que podem ser consideradas coleções de permissões concedidas. Por exemplo, o usuário dave
pode estar em um grupo chamado developers
. Este grupo pode ter uma função anexada denominada deployers
que contém diversas permissões, incluindo uma chamada production_deploy
.
Mais informações sobre permissões e regras podem ser encontradas no Guia Gort:
Um sofisticado sistema de regras pode ser aplicado para cada comando definindo quem pode usá-lo. Eles podem ser bastante granulares e são até capazes de tomar decisões de permissões com base nos valores de sinalizadores ou parâmetros específicos.
As regras são atribuídas no nível do pacote e podem ser bastante sofisticadas. Abaixo temos um subconjunto de um pacote chamado deploy
.
name : deploy
version : 0.0.1
permissions :
- production_deploy
commands :
deploy :
description : " Deploys to the chosen environment. "
executable : [ "/bin/deploy" ]
rules :
- with arg[0] == "production" must have deploy:production_deploy
Como você pode ver, o exemplo acima inclui um comando, também chamado deploy
. Sua única regra afirma que qualquer usuário que passe "produção" como parâmetro deve ter a permissão production_deploy
(do pacote deploy
).
Mais informações sobre permissões e regras podem ser encontradas no Guia Gort:
Gort fornece um sofisticado sistema de modelos que permite controlar a apresentação de qualquer informação enviada aos usuários, incluindo mensagens do sistema, bem como saída de comandos e mensagens de erro.
Além do mais, os modelos podem ser definidos no nível do aplicativo na configuração, ou no pacote ou até mesmo no nível do comando em configurações de pacotes individuais.
Os modelos Gort usam a sintaxe do modelo Go para formatar a saída de maneira independente do chat. Por exemplo, um modelo de comando muito simples pode ser parecido com o seguinte:
{{ text | monospace true }}{{ .Response.Out }}{{ endtext }}
Este modelo emite a resposta do comando ( .Response.Out
) como texto monoespaçado, que pode ser parecido com o seguinte:
Um modelo um pouco mais complicado, este um modelo de erro de comando (na verdade o padrão), é mostrado abaixo.
{{ header | color "#FF0000" | title .Response.Title }}
{{ text }}The pipeline failed planning the invocation:{{ endtext }}
{{ text | monospace true }}{{ .Request.Bundle.Name }}:{{ .Request.Command.Name }} {{ .Request.Parameters }}{{ endtext }}
{{ text }}The specific error was:{{ endtext }}
{{ text | monospace true }}{{ .Response.Out }}{{ endtext }}
Este inclui um cabeçalho com cor e título, bem como algum texto alternado monoespaçado e padrão. Nesse caso, isso formatará um erro de comando semelhante ao seguinte:
Você notará algumas referências a .Response
: são referências ao envelope de resposta , uma estrutura de dados acessível a partir de qualquer modelo que disponibilize todos os dados e metadados em torno de uma solicitação, execução e resposta de comando.
Mais informações sobre o registro de auditoria podem ser encontradas no Guia Gort:
Gort oferece suporte ao Slack e ao Discord como provedores de bate-papo de primeira classe.
Cada provedor de bate-papo compatível possui uma seção dedicada na configuração. Observe que cada um deles é uma lista, então você não só pode interagir com o Slack e o Discord no mesmo controlador Gort, mas também pode interagir com várias instâncias de cada um, se desejar!
Depois de criar um usuário bot de acordo com as instruções fornecidas no Gort Quick Start, os administradores precisam apenas criar um usuário Gort (se ainda não o fizeram) e mapear esse usuário Gort para um ID de usuário do provedor de bate-papo, conforme mostrado abaixo:
$ gort user create mtitmus --email [email protected] --name " Matt Titmus " --password REDACTED
User " mtitmus " created.
$ gort user list
USER NAME FULL NAME EMAIL
admin Gort Administrator gort@localhost
mtitmus Matt Titmus [email protected]
$ gort user map mtitmus Slack U012P123456
User " mtitmus " mapped to " Slack:U012P123456 " .
$ gort user info mtitmus
Name mtitmus
Full Name Matt Titmus
Email [email protected]
Groups < undefined >
ADAPTER ID MAPPING
Slack U012P123456
A partir de então, quaisquer comandos inseridos pelo usuário do chat mapeado serão associados a esse usuário Gort!
Todas as atividades de comando são emitidas como eventos de log de alta cardinalidade (mostrados abaixo) e registradas em um log de auditoria mantido no banco de dados de Gort.
Tomemos, por exemplo, um usuário executando o comando !bundle list
do Slack:
Isso gerará uma saída de log semelhante a esta:
INFO [49594] Triggering command adapter.name=Gort bundle.default=false bundle.name=gort bundle.version=0.0.1
command.executable="[/bin/gort bundle]" command.name=bundle
command.params=list gort.user.name=admin provider.channel.id=C1238A01234
provider.channel.name=gort-dev [email protected]
provider.user.id=U012P123456 trace.id=476b3089c8ce0d38a2915a3b58fde032
Como você pode ver, este rico evento inclui:
Observe que este exemplo usa o formato "legível por humanos" para facilitar a leitura. No modo de produção, Gort gera eventos de log codificados em JSON.
Mais informações sobre o registro de auditoria podem ser encontradas no Guia Gort:
Para obter mais informações, dê uma olhada no Guia de início rápido no Guia Gort.
O binário gort
também serve como CLI de administração do controlador.
O cliente gort
usa um arquivo de configuração formatado em YAML, convencionalmente localizado no arquivo profile
em um diretório .gort
em seu diretório inicial. É aqui que você pode armazenar credenciais de conexão para permitir que gort
interaja com a API REST do controlador do Gort.
Um exemplo de arquivo .gort/profile
pode ser assim:
defaults :
profile : gort
gort :
url : https://gort.mycompany.com:4000
password : " seekrit#password "
user : me
preprod :
url : https://gort.preprod.mycompany.com:4000
password : " anotherseekrit#password "
user : me
Os comentários começam com um caractere #
; se sua senha contiver um #
, coloque toda a senha entre aspas, conforme ilustrado acima.
Você pode armazenar vários "perfis" neste arquivo, com um nome diferente para cada um (aqui temos gort
e preprod
). Qualquer que seja indicado como padrão (na seção defaults
) será usado por gort
. No entanto, você pode passar a opção --profile=$PROFILE
gort
usar um conjunto diferente de credenciais.
Embora você possa adicionar perfis a este arquivo manualmente, você também pode usar o comando gort profile create
para ajudar.
O executável gort
contém vários comandos e subcomandos. A ajuda está disponível para todos eles passando a opção --help
. Comece com gort --help
e continue a partir daí.
Gort está em um estado de forte desenvolvimento ativo. A data em que vários marcos foram alcançados está listada abaixo. O número e o foco dos marcos presentes e futuros estão sujeitos a alterações.