Slack#
Notifiche di deploy e approvazioni nei canali Slack. Con un bot token il messaggio di avvio viene aggiornato con l'esito, così un canale mostra un messaggio per deploy; le richieste di approvazione hanno i pulsanti Approva e Respingi, che passano dagli stessi controlli dei permessi dell'API.
Cosa serve
I diritti per creare un'app nel workspace Slack · un gestore dei segreti raggiungibile da manent (Vault negli esempi) · per i pulsanti di approvazione, l'indirizzo di manent raggiungibile da Slack in HTTPS
1. Crea l'app Slack#
- Su api.slack.com/apps scegli Create New App → From scratch, chiamala
manente scegli il workspace. - In OAuth & Permissions → Bot Token Scopes aggiungi
chat:write. Aggiungi ancheusers:read.emailse collegherai gli utenti Slack alle identità di manent tramite email (passo 5). - Install to Workspace e copia il Bot User OAuth Token (
xoxb-…). - In Basic Information → App Credentials copia il Signing Secret: manent lo usa per verificare che i clic sui pulsanti arrivino davvero da Slack.
- Invita il bot in ogni canale in cui scriverà:
/invite @manentnel canale.
Salva entrambi i valori nel gestore dei segreti:
2. Configura le notifiche#
integrations:
public_url: https://manent.example.com # i messaggi rimandano alla pagina del deploy
language: it # en (default) o it
slack:
bot_token_ref: "vault:secret/data/manent/slack#bot_token"
signing_secret_ref: "vault:secret/data/manent/slack#signing_secret"
notifications:
- name: prod
applications: ["*"]
environments: [prod]
slack: {channel: C0123456789} # ID del canale: dettagli del canale → Informazioni
- name: payments-team
applications: ["pay-*"]
environments: ["*"]
events: [deployment] # solo avvio ed esito, niente approvazioni
slack: {channel: C0456789012}
- Ogni voce è una destinazione per un insieme di applicazioni e ambienti; un deploy va a tutte le destinazioni che gli corrispondono.
eventsèdeployment(avvio ed esito) e/oapproval(richiesta e decisione). Default: entrambi.- I dry-run non vengono notificati, salvo che la destinazione abbia
dry_run: true.
Riavvia manent. Le destinazioni vengono fissate quando un deploy viene accodato: i deploy già in coda e le schedule ricorrenti esistenti mantengono quelle con cui sono stati creati.
Senza bot? Un incoming webhook
slack: {webhook_ref: "vault:…#webhook_url"} al posto di channel pubblica un messaggio per evento su un incoming webhook. I messaggi non vengono aggiornati, e i pulsanti di approvazione non sono disponibili.
3. Verifica#
Aggiungi una destinazione temporanea che notifica anche i dry-run, ed eseguine uno:
- name: slack-test
applications: [hello]
environments: [test]
dry_run: true
slack: {channel: C0123456789}
manent deploy -f deploy/test.yml --dry-run
manent steps <id> | jq -r '.[] | select(.name | startswith("notify:")) | "\(.name) \(.error // "ok")"'
Ogni invio è uno step DBOS con nome notify:<destinazione>:<evento>. Un invio fallito riporta lì il suo errore e nel log del worker (chat notification not sent, inviato anche al SIEM), ma non fa mai fallire il deploy.
4. Approvazioni da Slack#
Con signing_secret_ref configurato, manent registra POST /integrations/slack/interactions. Nell'app Slack:
- Interactivity & Shortcuts → On.
- Request URL:
https://manent.example.com/integrations/slack/interactions.
Quando un deploy richiede approvazioni, le destinazioni con l'evento approval ricevono un messaggio con Approva e Respingi. Un clic:
- viene verificato con il signing secret e rifiutato se più vecchio di 5 minuti;
- viene attribuito a un'identità di manent (passo successivo);
- viene registrato come decisione di quell'identità, con le stesse regole di
manent approve: il permessodeployment.approvee il divieto di approvare il proprio deploy; - riceve una risposta visibile solo a chi ha cliccato: decisione registrata, o perché è stata rifiutata.
Quando l'approvazione termina (approvata, rifiutata o scaduta) il messaggio viene aggiornato: pulsanti rimossi, decisioni elencate.
Raggiungibilità
Slack chiama la Request URL da Internet. Se manent è interno, pubblica solo questo percorso tramite il reverse proxy o l'API gateway; tutto il resto può restare privato.
5. Collega gli utenti Slack alle identità#
Un utente Slack non collegato a un'identità non può decidere nulla. Due modi:
Il collegamento fa parte della sicurezza
Chi è collegato a oidc:alice approva come Alice. Tieni identities nella configurazione gestita dal team di piattaforma, e rivedila come una lista di accesso.
Risoluzione dei problemi#
| Sintomo | Verifica |
|---|---|
| Nessun messaggio | applications/environments della destinazione corrispondono al deploy; il bot è membro del canale; l'errore dello step notify: in manent steps. |
| Un nuovo messaggio per evento invece di un aggiornamento | La destinazione usa webhook_ref, oppure manca il bot token. |
| I pulsanti non fanno nulla | Interactivity è attiva, la Request URL è raggiungibile da Slack, signing_secret_ref è impostato (altrimenti l'endpoint non viene registrato). |
| "Non collegato" o permesso negato | L'utente è in identities (o email_identity si risolve), e quell'identità ha deployment.approve sull'applicazione e sull'ambiente. |
Riferimento: Chat e change management.