Migrando Notificaciones de Changelog: De Slack a Discord en Reimpact/platform
En el proyecto Reimpact/platform, manteníamos un sistema de notificaciones de changelog diario para informar sobre la actividad de desarrollo. Originalmente, este sistema utilizaba Slack, pero nos encontramos con una limitación crítica: el plan gratuito de Slack restringe el número de aplicaciones a 10, un límite que habíamos alcanzado, impidiendo nuevas integraciones.
Para superar esta barrera, hemos migrado nuestro sistema de notificaciones a Discord. Esta plataforma ofrece una solución robusta y flexible mediante webhooks, sin las mismas restricciones que Slack, lo que nos permite escalar sin preocupaciones.
La implementación en Discord mantiene la misma funcionalidad esencial. Se sigue generando un resumen diario de cambios a las 07:00 hora de Chile, agrupado convenientemente por autor para facilitar la revisión. Además, hemos implementado un mecanismo de deduplicación utilizando una tabla discord_sent_commits (gestionada con PostgreSQL, una de las tecnologías detectadas), asegurando que solo se envíen notificaciones únicas y relevantes.
Visualmente, las notificaciones de Discord aprovechan los embeds para presentar la información de manera clara y estructurada, alineándose con nuestra marca al usar el color azul distintivo de ReImpact (#1E40AF).
El desarrollo de esta funcionalidad se realizó utilizando PHP y el framework Laravel, tecnologías fundamentales en nuestro stack. A continuación, un ejemplo conceptual de cómo se podría estructurar el envío de un webhook a Discord en PHP:
<?php
namespace App\Services;
use Illuminate\Support\Facades\Http;
class DiscordNotificationService
{
protected string $webhookUrl;
public function __construct(string $webhookUrl)
{
$this->webhookUrl = $webhookUrl;
}
public function sendChangelog(array $changelogData):
{
$embeds = [
[
'title' => 'Resumen Diario de Cambios',
'description' => 'Aquí los cambios de hoy...', // Generar dinámicamente
'color' => hexdec('1E40AF'), // ReImpact Blue
'fields' => [
// Campos de ejemplo: autor, commits, etc.
['name' => 'Autor', 'value' => $changelogData['author'], 'inline' => true],
['name' => 'Commits', 'value' => count($changelogData['commits']), 'inline' => true]
],
'timestamp' => now()->toISOString(),
]
];
Http::post($this->webhookUrl, [
'content' => 'Nuevas actualizaciones en la plataforma.',
'embeds' => $embeds,
])->throw();
}
}
Este cambio nos permite mantener un flujo de comunicación eficiente y sin interrupciones sobre las novedades del proyecto, aprovechando la versatilidad de Discord para nuestras notificaciones internas.