Ce bot Slack améliore le flux de travail des équipes de développement. Surtout en mettant l'accent sur Jenkins, Github, Gitlab et Jira, car l'intégration fonctionne hors de la boîte. Mais également les commandes personnalisées, les macros, les crons et autres commandes spécifiques au projet peuvent être implémentées de manière simple et 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 Préparez d'abord le config.yaml , jetez un œil à config-example.yaml
go run github.com/innogames/slack-bot/v2/cmd/botdocker-compose upgo run cmd/bot/main.go ou make run pour exécuter l'application Go En tant qu'utilisateur Slack, il vous suffit d'envoyer un message privé à l'utilisateur / application BOT contenant la commande à exécuter. De plus, vous pouvez ajouter le bot à n'importe quelle chaîne et y exécuter des commandes de bot en préfixant votre commande avec @bot_name, par exemple @slack-bot start job DailyDeployment
Remarque: vous devez inviter le bot dans le canal pour pouvoir gérer les commandes.
La commande help imprime simplement une liste de toutes les commandes disponibles de ce bot. Avec help *command* vous obtiendrez une brève description et quelques exemples pour une seule commande.

Le bot est capable de démarrer et de surveiller le travail de Jenkins d'une manière simple mais puissante.
Par défaut, les commandes ne sont pas disponibles et ne sont pas visibles dans le "Help", jusqu'à ce que le "jenkins.host" soit défini dans le fichier de configuration.
La commande start job démarre un travail de Jenkins et affiche les progrès actuels. ATTENTION: Seuls les travaux de liste blanche dans la configuration sont startables!
En outre, chaque travail peut avoir un trigger configurable qui permet de créer des commandes personnalisées pour démarrer des travaux. (C'est un regexp qui prend en compte les noms de paramètres). Par exemple, "démarrer le déploiement quotidien" pourrait être le déclencheur d'un travail de Jenkins. L'envoi de ce texte au bot commencerait le travail.
Après avoir commencé un emploi, le bot montrera le temps de construction estimé et certains boutons d'action. Là, vous pouvez ouvrir les journaux ou abandonner la construction directement.
Le bot est également capable d'analyser les paramètres et de rechercher des noms de branche à l'aide d'une recherche de branche floue.
Exemples:
trigger job DeployBetastart job BackendTests TEST-123 (recherchez un nom de branche complet, contenant le test-123. Par exemple, fonctionnalité / test-123-Added-Feature-456) 

Le bot a également la possibilité de créer des notifications de temps pour les constructions de Jenkins. Cela pourrait être utile pour des emplois de longue date où les développeurs attendent le résultat.
Exemple:
inform me about build NightlyTests (regarde la construction de course la plus récente)inform me about build MyJobName #423 (spécifiez un numéro de construction)inform job MyJobName (syntaxe alternative)Recevez des messages Slack pour toutes les versions de processus pour le travail donné:
Exemple:
watch JenkinsSelfCheck informe toute construction de travail JenkinsSelfCheckunwatch JenkinsSelfCheckPetite commande pour désactiver / activer l'exécution du travail du côté Jenkins.
Exemple:
disable job NightlyTests (désactiver le travail sur Jenkins)enable job NightlyTestsLorsqu'une build a échoué, vous pouvez réessayer n'importe quelle construction par:
Exemple:
retry build NightlyTests (Retrie la dernière construction d'un emploi)retry build NightlyTests #100 (Retries Gitud Build) jenkins nodes répertorie tous les nœuds Jenkins disponibles. Le statut en ligne / hors ligne et le nombre d'exécuteurs sont visibles. 
Si vous cotez simplement un lien vers une demande de traction GitHub / Gitlab / Bitbucket / Stash, le bot suivra l'état du billet!
Vous pouvez également définir des réactions "approuvées" personnalisées. Par exemple pour voir directement qui ou quel composant / département a approuvé une demande de traction, vous pouvez utiliser le nom de la réaction ou le répertoire des caractères Unicode
pullrequest :
reactions :
merged : custom_merge_arrow
review : ?
custom_approve_reaction :
nerdydev : " approved_backend "
iamamobiledev : " approved_mobile "
iamamobiledev2 : " approved_mobile " 
Caractéristiques supplémentaires: Pour Bitbucket, le bot est capable d'extraire l'état de construction actuel (par exemple de Jenkins / Bamboo, etc.) et de montrer les constructions échouées et la réaction du feu) en tant que réaction (réaction de flèche du cercle). Lorsque la construction est stable, les réactions de construction disparaissent. 
La commande queue (avec l'alias then ) est capable de filer la commande donnée, jusqu'à la fin de la commande en cours d'exécution.
Exemple de scénario suivant: Vous avez un travail de construction (qui pourrait prendre quelques minutes) et un travail de déploiement qui repose sur les artefacts de construction. Maintenant, vous pouvez faire:
trigger job Build feature1234 pour démarrer le travail de construction avec une branche donnéequeue trigger job DeployBranch feature1234queue reply Deployment is done!Autre exemple:
delay 1hthen send message #backend coffee time?Pour voir toutes les commandes d'arrière-plan en cours d'exécution (comme Jenkins Jobs ou PR Watcher), utilisez cette commande:
list queueLe bot est capable d'interroger des informations de Jira, soit à partir d'un seul billet, soit une liste entière de billets.
Par défaut, les commandes ne sont pas disponibles et ne sont pas visibles dans le "Help", jusqu'à ce que le "jira.host" soit défini dans le fichier de configuration.
Exemples
jira TEST-1234jira 1242 (ouvre le billet, en utilisant le projet Jira par défaut configuré)jql type=bug and status=open (Utilisez le projet par défaut par défaut)jira "Second city" (recherche de texte des billets dans le projet par défaut) 

Il est également possible d'obtenir une notification lorsqu'il y a un changement d'État dans un certain billet Jira.
Exemple
watch ticket PROJ-12234Il est possible de créer des boutons qui effectuent une action BOT lors de la suppression du bouton. Interactions lâches

Exemples:
add button "Start Deployment" "trigger job LiveDeployment"Note
Configurez les variables spécifiques de l'utilisateur pour personnaliser le comportement des robots. Par exemple, chaque développeur a son propre environnement de serveur.
Exemple: avoir cette configuration globale:
commands :
- name : Deploy
trigger : " deploy (?P<branch>.*) "
commands :
- deploy {{.branch}} to {{ customVariable "defaultServer" }} Chaque développeur peut désormais appeler une fois que ces commandes comme: set variable defaultSerer foobarX.local pour enregistrer le "DefaultServer" personnalisé.
Lors de l'appel maintenant deploy mater , il déploiera la branche master sur foobarX.local Server.
Un autre exemple ici une version avancée qui utilise des modèles GO. En fin de compte, la commande générera une sous-commande, comme: reply <!here> demo for <https://jira.example.com/TEST-1234|TEST-1234: Example-Ticket> qui publiera le lien vers la chaîne 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 L'utilisateur peut définir son environnement par défaut une fois en utilisant set variable serverEnvironment aws-02 .
Ensuite, la deploy feature-123 déploiera la succursale dans l'environnement aws-02 défini. Chaque utilisateur peut définir ses propres variables.
Il est également possible d'avoir une conversation comme l'intégration officielle d'Openai (GPT3.5)!

Tapez simplement "Openai" ou "Chatgpt" avant votre question pour créer un nouveau fil qui se comporte comme la page Chatgpt bien connue. Le contenu des 10 derniers messages est utilisé comme contexte. Pour le faire fonctionner, un "openai.api_key" valide doit être fourni dans la configuration.
Configuration étendue:
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 logLorsque vous utilisez la commande "OpenAI XXX" dans un thread existant, les messages précédents sont utilisés comme contexte pour d'autres appels.
Il est également possible d'utiliser la fonction dans les modèles (comme dans les commandes personnalisées ou les Cons).
{{ openai "Say some short welcome words to @Jon_Doe"}} imprimeraient quelque chose comme Hello Jon, welcome! How can I assist you today?
Le bot est également capable de générer des images à l'aide de Dall-E. Préfixez simplement que vous vous demandez avec "Dalle" et le bot générera une image basée sur votre texte.

Si vous avez besoin d'une petite pause et que vous souhaitez jouer un petit jeu de quiz, vous pouvez le faire en appelant cette commande. Pas plus de 50 questions sont autorisées. Les questions proviennent de catégories différentes et de niveaux difficiles et sont soit des questions à choix multiples, soit vraies / fausses.
Commandes
quiz 10 pour démarrer un quiz avec 10 questionsanswer 1 pour répondre à une question avec la première réponse 
Il est possible de configurer l'Openweathermap pour obtenir des informations sur la météo actuelle à votre emplacement.

Exemple de configuration:
open_weather :
apikey : " 612325WD623562376678 "
location : " Hamburg, DE "
units : " metric " Chaque utilisateur est en mesure de définir ses propres alias de commande. Il s'agit d'une fonctionnalité pratique pour éviter de taper la même commande chaque jour.
Exemple d'utilisation
list commands pour simplement répertorier les commandes définies pour l'utilisateur actueladd command 'myCommand' 'trigger job RestoreWorld 7 -> Ensuite, appelez simplement myCommand plus tardadd command 'build master' 'trigger job Deploy master ; then trigger job DeployClient master'delete command 'build master'myCommand pour déclencher ce travail Jenkins 
Les "commandes" définies (anciennes "Macros") sont très magiques et peuvent être définies dans les fichiers de configuration YAML.
Ils ont un déclencheur (une expression régulière) et ont une liste de sous-commandes qui seront exécutées. Ils prennent en compte les groupes de paramètres de Regexp - afin qu'ils puissent être très flexibles!
Un exemple simple pour démarrer deux travaux Jenkins avec un nom de branche donné en même temps:
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: " 
Remarque : Dans les commandes, vous pouvez utiliser l'ensemble complet des fonctionnalités de modèle de go -> des boucles / conditions sont possibles!
À côté des fonctionnalités habituelles de modèle de GO, un tas de commandes spécifiques à BOT sont disponibles dans la portée du modèle.
Une liste de toutes les fonctions disponibles (avec des arguments et des types de retour) peut être générée en utilisant la commande list template functions . 
Remarque: Ce modèle Fonctions peut être utilisé dans différentes commandes / fonctionnalités:
En retry ou repeat votre dernière commande exécutée sera réexécutée. -> utile lorsqu'un travail défaillant de Jenkins a été corrigé.
Une petite commande qui pourrait être utile en combinaison avec la commande command ou comme crochet pour les travaux Jenkins.
Exemple de commande: delay 10m trigger job DeployWorldwide
Comme réponse, vous obtiendrez une commande pour arrêter le travail en file d'attente (comme stop timer 123456 ). Comme tout le monde peut envoyer la commande, la commande peut être utilisée pour annoncer un déploiement et en doute, l'exécution peut toujours être arrêtée par tout le monde.
reply et send message sont également de petites commandes qui sont utiles en combinaison avec command ou Jenkins Hooks.
Exemples:
send message to #backend The job failed :panic:delay 10m send message to @peter_pan I should notify you to...Commande simple si vous n'êtes pas en mesure de décider entre différentes options
Exemples
random Pizza Pasta -> Produire "Pizza" ou "Pasta"random Peter Paul Tom Jan -> Qui doit prendre pour organiser la nourriture aujourd'hui?config.yaml (vous pouvez jeter un œil à config.example.yaml ) Cette commande démarrera le bot, en utilisant le fichier config.yaml par défaut. Utilisez l'argument -config pour utiliser les fichiers de configuration à partir d'un autre emplacement.
go run cmd/bot/main.go
Attention : créez d'abord un fichier config.yaml
docker-compose up
La configuration est gérée via des fichiers .yaml simples qui stockent les informations d'identification pour les services externes et les commandes personnalisées, etc.
Le moyen le plus simple consiste à avoir un seul fichier config.yaml avec toutes les options nécessaires incluses, la config.yaml est chargée par défaut. Il est également possible de diviser la configuration en plusieurs fichiers.
Exemple de structure avec plusieurs fichiers de configuration:
secret.yaml contenant les informations d'identification pour les services externes (Slack, Jenkins) - peut être géré par Puppet / Ansible, etc.jenkins.yaml Configuration du travail Jenkins et de leurs paramètres, etc.project-X.yaml Commandes personnalisées pour une équipe spécifiqueproject-Y.yaml Pour charger les fichiers de configuration multiples, utilisez go run cmd/bot/main.go -config /path/to/config/*.yaml qui a fusionné toutes les configurations ensemble.
Pour exécuter ce bot, vous avez besoin d'un "jeton de bot" pour votre application Slack. Voir la section d'installation sur la façon de créer une application appropriée avec les jetons nécessaires.
Pour pouvoir démarrer ou surveiller les travaux Jenkins, vous devez d'abord configurer l'hôte et les informations d'identification. L'utilisateur a besoin de lire l'accès aux travaux et le droit de déclencher des travaux pour vos travaux de liste blanche.
jenkins :
host : https://jenkins.example.de
username : jenkinsuser
password : secretPour pouvoir démarrer un travail, le travail et ses paramètres doivent être définis dans la configuration.
Un travail sans paramètre semble très simple:
jenkins :
jobs :
CleanupJob : Ensuite, vous pouvez utiliser trigger job CleanupJob ou start job CleanupJob pour démarrer le travail. Il vous informera également lorsque le travail a réussi ou échoué (incluant le journal d'erreur).
Ensuite, un travail avec deux paramètres:
jenkins :
jobs :
RunTests :
parameters :
- name : BRANCH
default : master
type : branch
- name : GROUP
default : allCe travail peut gérer deux paramètres:
Si vous configurez le VSC dans la configuration, vous n'avez pas à passer le nom complet de la branche, mais que vous pouvez utiliser la recherche floue.
Exemple:
start job RunTests démarrerait "tous" des groupes sur Master Branchstart job JIRA-1224 unit Essayerait de trouver une succursale assortie pour le numéro de billet. (Message d'erreur s'il n'y a pas de résultat de recherche unique!)Maintenant un exemple plus complexe avec plus de magie:
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 Étape par étape: le trigger est une expression régulière pour démarrer le travail, qui peut contenir des groupes nommés. Les groupes regexp seront automatiquement adaptés aux paramètres du travail.
Ensuite, vous pouvez utiliser deploy bugfix-1234 to test pour démarrer le travail Jenkins.
Remarque: vous pouvez toujours démarrer ce travail également via start job DeployBranch master . Le trigger n'est qu'une alternative.
Le onsuccess est un crochet qui sera exécuté lorsqu'un travail sera démarré via ce bot. De plus, onsuccess and onerror est également disponible ... par exemple pour envoyer des messages d'erreur personnalisés.
Il est possible de définir des commandes périodiques via Cons, en utilisant la bibliothèque RobFig / Cron.
Exemple de configuration
crons :
- schedule : " 0 8 * * * "
commands :
- trigger job BuildClients
- then deploy master to staging
channel : " #backend " Pour pouvoir résoudre les noms de branche dans Jenkins Trigger, un système VCS peut être configuré (pour le moment, il est juste Stash / Bitbucket).
vcs :
type : bitbucket
host : https://bitbucket.example.com
username : readonlyuser
password : secret
project : MyProjectKey
repository : repo_nameSi aucune configuration n'est fournie, il n'y a pas de recherche de branche automatisée et les paramètres "branche" sont passés 1: 1 au travail Jenkins.
Certaines fonctionnalités peuvent ne pas être nécessaires dans votre environnement. La plupart des informations ne sont pas actives si les informations d'identification ne sont pas fournies, comme pour Jira ou Bitbucket.
Certains autres peuvent être désactivés via la configuration:
games :
enabled : false
custom_commands :
enabled : false
custom_variables :
enabled : falsebot/ Contient les classes de code du bot: connexion à Slack, gestion des utilisateurs, correspondance des commandes ...cmd/bot/ Points d'entrée aka main.go pour le bot et l'outil de test CLIcommand/ Commande réelle Implémentation de l'interface Bot.Command Si vous avez besoin d'une nouvelle commande, qui n'est pas implémentable avec une commande "Commande", vous devez écrire du code GO.
Il y a une application CLI pratique qui émule l'application Slack ... discutez simplement avec votre console locale sans aucune connexion Slack! 
make run-cli
make air pour utiliser "l'outil de rechargement Air Auto".
Il y a un tas de tests qui peuvent être exécutés via:
make test
La couverture de test est générée pour construire / couverture.html
make test-coverage