Comunicare gli avvisi nel contesto dell'elemento della configurazione: Nodejs, Grunt, Slack

2

Abbiamo un Gruntfile.js piuttosto complesso che esegue numerose operazioni per elaborare una serie di EPUB. Fa parte del nostro processo CI che viene eseguito regolarmente su Jenkins. A volte vogliamo avvisare la persona che ha avviato la compilazione di cose che si sono verificate - non errori ma piuttosto avvertimenti (l'attività può continuare ma è successo qualcosa di anormale). Usiamo Slack per la comunicazione. Che cos'è un meccanismo scalabile e gestibile per raggiungere questo obiettivo?

Al momento inseriamo una notifica da then() per attività basate su promesse, elaborando ciò che è stato passato in then() . A volte abbiamo moduli esterni noi require per non gonfiare ulteriormente il Gruntfile. Alcune delle attività non sono basate su promesse. Vogliamo gestire tutti questi in modo standard.

Abbiamo pensato di utilizzare eventing, ma poi dovremmo iniettare una dipendenza nel modulo esterno. C'è un modo per gestire senza iniettarne uno?

processThings = require('./scripts/process-things'),

grunt.initConfig({
    slack: {
        options: {
            username: 'Jenkins',
        },
        text: '{{message}}', // taken from grunt.option
}});

grunt.registerTask('validateSVGs', function () {
    var svgFiles = glob.sync("./**/*.svg");

    Promise.all(svgFiles.map(file => {
        // perform validation here
    })).then(values => {
        // compile a message for Slack:
        let errors = values.filter(el => { return el.err !== null; });
        let message = ':rotating_light: SVG files had errors:\n${errors.join('\n')}';

        grunt.option('message', message);
        grunt.task.run('slack');
    });
});

grunt.registerTask('downloadThings', function () {

    processThings.then((results) => {
        // push warnings from processThings to Slack - here or earlier, directly inside it
    });
});

Opzioni che posso vedere adesso:

  1. Iniettare una dipendenza in moduli esterni per gestire le comunicazioni (Slack o un bus di qualche tipo).
  2. Continua a gestire tutto in then() per le attività basate su promesse e "promuovi" tutte quelle non basate su promesse.
  3. Usa gli eventi, anche se non ho idea di come farlo nel contesto di NodeJS senza DOM (suppongo che potremmo usare grunt.event ).
posta montrealist 14.02.2017 - 17:43
fonte

1 risposta

1

Penso che i flussi Node.js possano essere la la soluzione per te, fornendo una API piena di eventi e molto orientata ai compiti.

Usiamo gulp per cose del genere e il nostro sistema è piuttosto complesso, gestendo l'intera architettura del prodotto / i cambiamenti della topologia e il suo processo di distribuzione. Codice basato su stream (e gulp) molto più conciso, e .... più task-like ... Ogni task può essere stream (risolve il flusso 'finish'), o qualsiasi altra struttura promettente (puoi mixare se è necessario).

Tale soluzione sarà conforme alla tua terza opzione, ma è molto avanzata - perché gli stream hanno determinate API / convenzioni di eventi ed è esattamente basata su flusso / attività. La loro natura è funzionale, puoi usarli in modalità oggetto e sono molto più performanti e più facili da gestire e comporre rispetto alle promesse o al codice di passaggio continuo. Ci sono un sacco di moduli / plug-in stream su npm, quindi copriranno ogni possibile compito / requisito di dev / ops / build / ci.

    
risposta data 18.02.2017 - 00:13
fonte