Este bot de holgura mejora el flujo de trabajo de los equipos de desarrollo. Especialmente con el enfoque en Jenkins, Github, Gitlab y Jira, ya que la integración está funcionando fuera de la caja. Pero también los comandos personalizados, las macros, los crons y otros comandos específicos del proyecto se pueden implementar de manera simple y flexible.
_metadata :
major_version : 1
minor_version : 1
display_information :
name : slack_bot
background_color : " #382e38 "
features :
app_home :
messages_tab_enabled : true
messages_tab_read_only_enabled : false
bot_user :
display_name : bot
always_online : true
oauth_config :
scopes :
bot :
- app_mentions:read
- channels:read
- channels:history
- groups:history
- chat:write
- im:history
- im:write
- mpim:history
- reactions:read
- reactions:write
- users:read
- files:read
- pins:write
settings :
event_subscriptions :
bot_events :
- app_mention
- message.im
interactivity :
is_enabled : true
org_deploy_enabled : false
socket_mode_enabled : true
token_rotation_enabled : false Primero prepare el config.yaml , solo eche un vistazo a config-exame.yaml
go run github.com/innogames/slack-bot/v2/cmd/botdocker-compose upgo run cmd/bot/main.go o make run para ejecutar la aplicación GO Como usuario de Slack, solo tiene que enviar un mensaje privado al usuario/aplicación BOT que contiene el comando para ejecutar. Además, puede agregar el bot a cualquier canal y ejecutar comandos BOT en él prefijo su comando con @bot_name, por ejemplo, @slack-bot start job DailyDeployment
Nota: debe invitar al bot al canal para poder manejar comandos.
El comando help solo imprime una lista de todos los comandos disponibles de este bot. Con help *command* obtendrá una breve descripción y algunos ejemplos para un solo comando.

El bot es capaz de comenzar y monitorear el trabajo de Jenkins de una manera simple pero poderosa.
Por defecto, los comandos no están disponibles y no son visibles en la "Ayuda", hasta que el "Jenkins.host" se define en el archivo de configuración.
El comando start job comienza un trabajo de Jenkins y muestra el progreso actual. Atención: ¡solo los trabajos con la lista blanca en la configuración son de inicio!
Además, cada trabajo puede tener un trigger configurable que haga posible crear comandos personalizados para iniciar trabajos. (Es una regexp que tiene en cuenta los nombres de los parámetros). Por ejemplo, "comenzar la implementación diaria" podría ser el desencadenante de un trabajo de Jenkins. Enviar este mensaje de texto al bot comenzaría el trabajo.
Después de comenzar un trabajo, el bot mostrará el tiempo de construcción estimado y algunos botones de acción. Allí puede abrir los registros o abortar la compilación directamente.
El bot también puede analizar los parámetros y los nombres de ramas de búsqueda utilizando una búsqueda de rama difusa.
Ejemplos:
trigger job DeployBetastart job BackendTests TEST-123 (busque un nombre de rama completo, que contenga la prueba-123. EG característica/prueba-123-Feature-Feature-456) 

El bot también tiene la posibilidad de crear notificaciones únicas para las compilaciones de Jenkins. Esto podría ser útil para trabajos de larga duración donde los desarrolladores están esperando el resultado.
Ejemplo:
inform me about build NightlyTests (observa la construcción de ejecución más reciente)inform me about build MyJobName #423 (especifique un número de compilación)inform job MyJobName (sintaxis alternativa)Reciba mensajes flojos para todas las compilaciones de procesos para el trabajo dado:
Ejemplo:
watch JenkinsSelfCheck notifica sobre cualquier construcción de trabajo JenkinsSelfCheckunwatch JenkinsSelfCheckPequeño comando para deshabilitar/habilitar la ejecución del trabajo en el lado de Jenkins.
Ejemplo:
disable job NightlyTests (Desactivar trabajo en Jenkins)enable job NightlyTestsCuando falló una construcción, puede volver a intentar cualquier construcción por:
Ejemplo:
retry build NightlyTests (vuelve a reemplazar la última construcción de un trabajo)retry build NightlyTests #100 (reintentos dados la construcción) jenkins nodes enumera todos los nodos de Jenkins disponibles. El estado en línea/fuera de línea y el número de ejecutores son visibles. 
Si solo pega un enlace a una solicitud GitHub/Gitlab/Bitbucket/Stash Pull, ¡el BOT rastreará el estado del boleto!
También puede establecer reacciones "aprobadas" personalizadas. Por ejemplo, ver directamente quién o qué componente/departamento aprobó una solicitud de extracción, puede usar el nombre de la reacción o el directorio de caracteres Unicode
pullrequest :
reactions :
merged : custom_merge_arrow
review : ?
custom_approve_reaction :
nerdydev : " approved_backend "
iamamobiledev : " approved_mobile "
iamamobiledev2 : " approved_mobile " 
Características adicionales: para bitbucket, el bot es capaz de extraer el estado de compilación actual (por ejemplo, de Jenkins/Bamboo, etc.) y mostrar compilaciones fallidas y en funcionamiento (reacción de fuego) como reacción (reacción de flecha circular). Cuando la construcción es estable, las reacciones de construcción desaparecen. 
El comando queue (con el alias then ) puede colocar el comando dado, hasta que el comando en ejecución actualmente finalizado.
Ejemplo siguiente escenario: tiene un trabajo de compilación (que puede llevar algunos minutos) y un trabajo de implementación que se basa en los artefactos de compilación. Ahora puedes hacer:
trigger job Build feature1234 para comenzar el trabajo de compilación con la rama dadaqueue trigger job DeployBranch feature1234queue reply Deployment is done!Otro ejemplo:
delay 1hthen send message #backend coffee time?Para ver todos los comandos de fondo (como Jenkins Jobs o PR Watcher) use este comando:
list queueEl bot puede consultar información de JIRA, ya sea con un solo boleto o una lista completa de boletos.
Por defecto, los comandos no están disponibles y no están visibles en la "Ayuda", hasta que el "Jira.host" se define en el archivo de configuración.
Ejemplos
jira TEST-1234jira 1242 (abre el boleto, utilizando el proyecto JIRA predeterminado configurado)jql type=bug and status=open (use el proyecto predeterminado de forma predeterminada)jira "Second city" (búsqueda de texto en boletos en el proyecto predeterminado) 

También es posible recibir una notificación cuando hay un cambio estatal en un determinado boleto de JIRA.
Ejemplo
watch ticket PROJ-12234Es posible crear botones que realicen cualquier acción de bot al presionar el botón. Interacciones flojas

Ejemplos:
add button "Start Deployment" "trigger job LiveDeployment"Nota
Configurar variables específicas del usuario para personalizar el comportamiento de BOT. Por ejemplo, cada desarrollador tiene su propio entorno de servidor.
Ejemplo: Tener esta configuración global:
commands :
- name : Deploy
trigger : " deploy (?P<branch>.*) "
commands :
- deploy {{.branch}} to {{ customVariable "defaultServer" }} Cada desarrollador ahora puede llamar una vez que estos comandos me gustan: set variable defaultSerer foobarX.local para registrar el "Defaultserver" personalizado.
Cuando ahora llame a deploy mater , implementará la rama master en foobarX.local Server.
Otro ejemplo aquí una versión avanzada que usa plantillas GO. Al final, el comando generará un subcomando, como: reply <!here> demo for <https://jira.example.com/TEST-1234|TEST-1234: Example-Ticket> que publicará el enlace al canal Slack.
- name : demo
trigger : " demo (?P<ticketId> \ w+- \ d+) "
commands :
- |
{{ $ticket := jiraTicket .ticketId }}
{{ if $ticket }}
reply <!here> demo for <{{ jiraTicketUrl $ticket.Key }}|{{ $ticket.Key }}: {{ $ticket.Fields.Summary }}>
{{ else }}
reply Ticket {{ .ticketId }} not found :white_frowning_face:
{{ end }}
description : Informs the current channel about a demo of a Jira ticket. It directly posts a link to the ticket
examples :
- demo XYZ-1232 El usuario puede definir su entorno predeterminado una vez mediante el uso set variable serverEnvironment aws-02 .
Luego, la deploy feature-123 implementará la rama en el entorno aws-02 definido. Cada usuario puede definir sus propias variables.
¡También es posible tener una conversación de chatgpt con la integración oficial de Operai (GPT3.5)!

Simplemente escriba "OpenAI" o "ChatGPT" antes de su pregunta para crear un nuevo hilo que se comporta como la conocida página de ChatGPT. El contenido de los últimos 10 mensajes se usa como contexto. Para que funcione, se debe proporcionar un "OpenAI.api_Key" válido en la configuración.
Configuración extendida:
openai :
api_key : " sk-123....789 "
initial_system_message : " You are a Slack bot for Project XYZ, please answer shortly. "
update_interval : ' 3s ' # fewer Slack messages update during generation
model : gpt-3.5-turbo
temperature : 0.8
log_texts : true # opt in: log all input/output text to the logAl usar el comando "OpenAI XXX" dentro de un hilo existente, los mensajes anteriores se usan como contexto para nuevas llamadas.
También es posible usar la función en las plantillas (como en comandos personalizados o crons).
{{ openai "Say some short welcome words to @Jon_Doe"}} imprimirían algo como Hello Jon, welcome! How can I assist you today?
El bot también puede generar imágenes con la ayuda de Dall-E. Simplemente prefije que solicite con "Dalle" y el bot generará una imagen basada en su texto.

Si necesitas un pequeño descanso y quieres jugar un pequeño juego de cuestionario, puedes hacerlo llamando a este comando. No se permiten más de 50 preguntas. Las preguntas son de diferentes categorías y niveles difíciles y son preguntas de opción múltiple o verdaderas/falsas.
Comandos
quiz 10 para comenzar una prueba con 10 preguntasanswer 1 para responder una pregunta con la primera respuesta 
Es posible configurar OpenWeathermap para obtener información sobre el clima actual en su ubicación.

Ejemplo de configuración:
open_weather :
apikey : " 612325WD623562376678 "
location : " Hamburg, DE "
units : " metric " Cada usuario puede definir alias de comando propios. Esta es una característica útil para evitar escribir el mismo comando todos los días.
Uso de ejemplo
list commands para solo enumerar los comandos definidos para el usuario actualadd command 'myCommand' 'trigger job RestoreWorld 7 -> Luego llame a myCommand más tardeadd command 'build master' 'trigger job Deploy master ; then trigger job DeployClient master'delete command 'build master'myCommand para activar este trabajo de Jenkins 
Los "comandos" definidos (anteriores llamados "macros") son muy mágicos y se pueden definir en los archivos de configuración YAML.
Tienen un desencadenante (una expresión regular) y tienen una lista de sub comandos que se ejecutarán. Tienen en cuenta los grupos de parámetros de Regexp, ¡por lo que pueden ser muy flexibles!
Un ejemplo simple para comenzar dos trabajos de Jenkins con un nombre de rama dado al mismo tiempo:
commands :
- name : build clients
trigger : " build clients (?P<branch>.*) "
commands :
- " reply I'll build {{ .branch }} for you "
- " trigger job BuildFrontendClient {{ .branch }} "
- " trigger job BuildMobileClient {{ .branch }} "
- " then reply done! :checkmark: " 
Nota : En los comandos, puede usar el conjunto completo de características de plantilla de GO -> ¡Los bucles/condiciones son posibles!
Además de las características de plantilla habituales de GO, hay un montón de comandos específicos de BOT disponibles en el alcance de la plantilla.
Se puede generar una lista de todas las funciones disponibles (con argumentos y tipos de retorno) utilizando el comando list template functions . 
Nota: Estas funciones de plantilla se pueden usar en diferentes comandos/características:
Con retry o repeat su último comando ejecutado se volverá a ejecutarse. -> Útil cuando se solucionó un trabajo fallido de Jenkins.
Un pequeño comando que podría ser útil en combinación con comando command o como gancho para Jenkins Jobs.
Comando de ejemplo: delay 10m trigger job DeployWorldwide
Como respuesta, obtendrá un comando para detener el trabajo en cola (como stop timer 123456 ). Como todos pueden enviar el comando, el comando se puede usar para anunciar una implementación y en duda, la ejecución aún puede ser detenida por todos.
El mensaje reply y send message también son comandos pequeños que son útiles en combinación con command o Jenkins Hooks.
Ejemplos:
send message to #backend The job failed :panic:delay 10m send message to @peter_pan I should notify you to...Comando simple si no puede decidir entre diferentes opciones
Ejemplos
random Pizza Pasta -> producir "pizza" o "pasta"random Peter Paul Tom Jan -> ¿Quién tiene que tomar la organización de la comida hoy?config.yaml (puede echar un vistazo a config.example.yaml ) Este comando iniciará el bot, utilizando el archivo config.yaml de forma predeterminada. Use el argumento -config para usar los archivos de configuración desde otra ubicación.
go run cmd/bot/main.go
Atención : cree un archivo config.yaml primero
docker-compose up
La configuración se administra a través de archivos .yaml simples que almacenan las credenciales para los servicios externos y los comandos personalizados, etc.
La forma más fácil es solo tener un archivo config.yaml con todas las opciones necesarias incluidas, el config.yaml se carga de forma predeterminada. También es posible dividir la configuración en múltiples archivos.
Estructura de ejemplo con múltiples archivos de configuración:
secret.yaml que contiene las credenciales para los servicios externos (Slack, Jenkins) - puede ser administrado por Puppet/Ansible, etc.jenkins.yaml Configuración de Jenkins Job y sus parámetros, etc.project-X.yaml comandos personalizados para un equipo específicoproject-Y.yaml Para cargar los múltiples archivos de configuración, use go run cmd/bot/main.go -config /path/to/config/*.yaml que fusionó todas las configuraciones juntas.
Para ejecutar este bot, necesita un "token de bot" para su aplicación Slack. Consulte la sección de instalación sobre cómo crear una aplicación adecuada con los tokens necesarios.
Para poder iniciar o monitorear los trabajos de Jenkins, primero debe configurar el host y las credenciales. El usuario necesita acceso de lectura a los trabajos y al derecho de activar trabajos para sus trabajos con la lista blanca.
jenkins :
host : https://jenkins.example.de
username : jenkinsuser
password : secretPara poder comenzar un trabajo, el trabajo y sus parámetros deben definirse en la configuración.
Un trabajo sin ningún parámetro parece muy simple:
jenkins :
jobs :
CleanupJob : Luego puede usar trigger job CleanupJob o start job CleanupJob para comenzar el trabajo. También le notificará cuándo el trabajo tuvo éxito o falló (incluido el registro de errores).
A continuación, un trabajo con dos parámetros:
jenkins :
jobs :
RunTests :
parameters :
- name : BRANCH
default : master
type : branch
- name : GROUP
default : allEste trabajo puede manejar dos parámetros:
Si configura el VSC en la configuración, no tiene que pasar el nombre completo de la rama, pero puede usar la búsqueda difusa.
Ejemplo:
start job RunTests comenzaría "todos" grupos en la rama maestrastart job JIRA-1224 unit intentaría encontrar una sucursal coincidente para el número de boleto. (¡Mensaje de error si no hay un resultado de búsqueda único!)Ahora un ejemplo más complejo con más magia:
jenkins :
jobs :
DeployBranch :
trigger : " deploy (?P<BRANCH>[ \ w \ -_ \ . \ /]*) to (?P<ENVIRONMENT>prod|test|dev) "
parameters :
- name : BRANCH
default : master
type : branch
- name : ENVIRONMENT
onsuccess :
- reply Tadaa : Take a look on http://{{ .ENVIRONMENT }}.example.com Paso a paso: el trigger es una expresión regular para iniciar el trabajo, que puede contener grupos con nombre. Los grupos REGEXP se combinarán automáticamente con los parámetros del trabajo.
Luego, puede usar deploy bugfix-1234 to test para iniciar el trabajo de Jenkins.
Nota: Siempre puede iniciar este trabajo también a través de start job DeployBranch master . El trigger es solo una alternativa.
El onsuccess es un gancho que se ejecutará cuando se inicie un trabajo a través de este bot. Además, onsuccess y onerror también están disponibles ... por ejemplo, enviar mensajes de error personalizados.
Es posible definir comandos periódicos a través de Crons, utilizando la biblioteca RobFig/Cron.
Ejemplo de configuración
crons :
- schedule : " 0 8 * * * "
commands :
- trigger job BuildClients
- then deploy master to staging
channel : " #backend " Para poder resolver los nombres de ramas en Jenkins Trigger, se puede configurar un sistema VCS (en este momento es solo Stash/Bitbucket).
vcs :
type : bitbucket
host : https://bitbucket.example.com
username : readonlyuser
password : secret
project : MyProjectKey
repository : repo_nameSi no se proporciona configuración, no hay una búsqueda de rama automatizada y los parámetros de "rama" pasan 1: 1 al trabajo de Jenkins.
Es posible que no se necesiten algunas características en su entorno. La mayoría de los que no están activos si no se proporcionan las credenciales, como para Jira o Bitbucket.
Algunos otros se pueden deshabilitar a través de la configuración:
games :
enabled : false
custom_commands :
enabled : false
custom_variables :
enabled : falsebot/ Contiene las clases de código del bot: conexión a Slack, Administración de usuarios, coincidencia de comandos ...cmd/bot/ Puntos de entrada, también conocido como Main.go para el bot y la herramienta de prueba CLIcommand/ comando real implementando la interfaz bot.Command Si necesita un nuevo comando, que no se puede implementar con un comando "comando", debe escribir el código GO.
Hay una práctica aplicación CLI que emula la aplicación Slack ... ¡solo chatea con tu consola local sin ninguna conexión Slack! 
make run-cli
make air para usar la "Herramienta de recarga automática de aire".
Hay un montón de pruebas que se pueden ejecutar a través de:
make test
La cobertura de prueba se genera para construir/cobertura.html
make test-coverage