Il controllo del codice sorgente è la via da seguire per lo sviluppo del software e l'utilizzo di un servizio di hosting del repository consente di gestire ulteriormente il codice.
Oltre ai molteplici vantaggi di Bitbucket che abbiamo già menzionato, puoi anche configurare webhook per automatizzare i processi e creare tutti i tipi di avvisi e interazioni basate sulle azioni eseguite nel tuo repository. In questo articolo daremo un'occhiata a quali sono i webhook e come li puoi utilizzare, e vedremo un esempio di implementazione del codice tramite webhooks.
Quando esegui determinate azioni in un repository Git, hai la possibilità di invocare un determinato script. Questo è chiamato hook e ci sono diversi tipi di hook in Git. È possibile, ad esempio, eseguire uno script prima di commettere le modifiche al repository o prima di premere sul repository remoto.
Questi esempi sono per un repository locale. Tuttavia, quando si utilizza un servizio di hosting di repository come Bitbucket, si ha la possibilità di eseguire webhook. Questi sono molto simili a un hook Git, ma invece di eseguire uno script, si invia una richiesta HTTP a un determinato URL, con il carico utile che varia in base al tipo di webhook.
Sebbene non sia difficile, l'implementazione del codice su un server di produzione può richiedere molto tempo e una vera e propria peste. Tuttavia, è un passaggio necessario in qualsiasi sviluppo di applicazioni moderne. In un repository locale puoi creare uno script che costruisca il tuo codice ogni volta che commetti qualcosa o unisci al tuo ramo principale, e quando lavori con Bitbucket questo non dovrebbe essere diverso. Per emulare questo, trarremo vantaggio dal gancio POST di Bitbucket.
Il primo passo per impostare l'hook POST per un dato repository è avere il repository in posto. Per questo tutorial userò una versione modificata dell'esempio di Jumbotron di Bootstrap. Puoi prendere il repository da Bitbucket o semplicemente inserirlo nel tuo account. Questo esempio è uguale al Jumbotron di Bootstrap, ma usando RequireJS e gestendo le dipendenze tramite npm e Bower.
Una volta installato il repository, è ora di impostare il gancio POST. Vai alla panoramica del repository, vai a impostazioni, e vai al ganci sezione. Per il tipo di gancio selezionare INVIARE, e inserire l'URL per inviare la richiesta HTTP a una volta che il repository è stato premuto. Questo è tutto ciò che devi fare da parte di Bitbucket per automatizzare il tuo processo di distribuzione tramite webhooks.
Una volta configurato l'hook POST per il tuo repository, la prossima cosa che devi fare è catturare la richiesta e in questo caso clonare e costruire il repository nel percorso HTML pubblico. Per questo useremo NodeJS con ExpressJS. Creiamo lo script che gestirà la clonazione, l'installazione, la costruzione e lo spostamento dell'applicazione. È uno script bash che possiamo eseguire dal nostro server NodeJS.
# / bin / bash git clone $ 1 cd tuts-webhooks npm installa bower installa node_modules / requirejs / bin / r.js -o build.js rm build / build.txt rm -rf / usr / share / nginx / www / tuts- webhooks.bitslice.net/html/* mv build / * /usr/share/nginx/www/tuts-webhooks.bitslice.net/html/. cd ... / rm -rf tuts-webhooks
Questo script si occupa di tutti i passaggi necessari per ottenere il codice dell'applicazione, oltre a creare, ottimizzare e spostare il risultato nella posizione pubblica del server. Il $ 1
fa riferimento al primo argomento dello script, che, in questo caso, è l'URL del repository. Si noti tuttavia che i percorsi sono impostati sui percorsi nel mio server, e il tuo sarà probabilmente diverso, quindi aggiornali in modo che lo script funzioni correttamente.
Con questo script, possiamo eseguirlo manualmente con l'URL del repository e ottenere una versione di produzione del nostro sito web. Tuttavia non vogliamo eseguirlo manualmente, ed è qui che brillano NodeJS e la richiesta POST di Bitbucket. Creiamo un server che risponderà alla richiesta di hook POST ed eseguirà lo script precedente.
Il descrittore del server che gestirà le richieste di hook POST è il seguente.
"name": "WebHooksTutsPlus", "description": "Applicazione server utilizzata per intercettare le richieste inviate dal repository di Tuts Webbook di Bitbucket.", "version": "1.0.0", "private": true, "dependencies": "body-parser": "~ 1.0.x", "express": "4.xx"
Le uniche dipendenze per questo semplice server sono Express e body-parser per la gestione del payload delle richieste JSON.
Ora per il server NodeJS attuale, il codice è il seguente.
var bodyParser = require ('body-parser'), express = require ('express'), app = express (); var site = require ('./routers/site'); app.use (bodyParser.json ()); app.use (bodyParser.urlencoded ()); app.get ('/', function (req, res, next) res.send ('Hooks listener running');); app.use ('/ site', sito); app.listen (9090);
Questo è un server Web molto semplice che ascolta sulla porta 9090 del localhost. Alla riga 10 abbiamo un metodo che ascolta l'URL del server base e risponde con un messaggio di testo solo per verificare che il server sia in esecuzione. Ora per lo script che gestisce effettivamente il gancio POST, aggiungi il seguente script e inseriscilo nel file _routers_
cartella.
var express = require ('express'), router = express.Router (); router.post ('/', function (req, res, next) var payload = JSON.parse (req.param ('payload')), repo = payload.canon_url + payload.repository.absolute_url, exec = require ( 'child_process') .exec; exec ('./site.sh' + repo + 'sito', funzione (errore, stdout, stderr) ); res.json (messaggio: 'Sito aggiornato'); ); module.exports = router;
Questo router ascolta le richieste POST nell'URL del sito. Costruisce semplicemente l'URL del repository dal carico utile della richiesta ed esegue lo script precedentemente creato con l'URL del repository. Per semplicità non stiamo gestendo l'output del metodo exec di NodeJS o controllando la presenza di errori nell'esecuzione dello script.
Questo è tutto! Ora dopo ogni push al tuo repository, il tuo sito creerà automaticamente, ottimizzerà e distribuirà il codice. Ricordati solo di dargli un paio di minuti per installare tutte le dipendenze e compilare il codice.
OK, è grandioso: il nostro sito si aggiorna automaticamente quando trasferiamo le modifiche al repository. Ma al momento non stiamo convalidando alcuna informazione durante l'esecuzione del processo di aggiornamento. Uno dei controlli più basilari che possiamo e dobbiamo eseguire è l'origine della richiesta e Bitbucket ci fornisce gli IP da cui può derivare l'hook POST. Con queste informazioni possiamo ora modificare il nostro server per tentare solo di aggiornare il sito Web quando la richiesta proviene da questa origine. Aggiungi il seguente codice nella parte superiore del nostro metodo router.
if (req.ip! = '131.103.20.165' && req.ip! = '131.103.20.166') res.json (messaggio: 'Origine non attendibile'); ritorno;
Nota che se Bitbucket avesse aggiornato i suoi IP in uscita avremmo bisogno di aggiornare questa sezione. Un'altra cosa da tenere in considerazione è che, almeno nel mio caso, sto usando nginx come proxy inverso, quindi adesso req.ip
la chiamata tornerà 127.0.0.1
e non funzionerà. Per risolvere questo problema, dobbiamo dire al nostro server di fidarsi del proxy e utilizzare l'IP originale. Abbastanza semplice: abbiamo solo bisogno di aggiungere il seguente codice sopra il primo app.use ()
chiama nel nostro server.js.
app.enable ('trust proxy');
E questo è tutto, ora il nostro req.ip
fornirà l'indirizzo IP originale e possiamo controllare gli indirizzi in uscita di Bitbucket.
Questo esempio utilizza un server NodeJS per gestire la richiesta e il server è in ascolto su localhost di porta 9090. Pertanto, affinché funzioni, sto utilizzando nginx come proxy inverso per passare la richiesta remota al server NodeJS. L'impostazione di nginx come proxy inverso non rientra nell'ambito di questo tutorial, ma è importante menzionare e utilizzare una configurazione equivalente quando si segue. Ricorda anche di eseguire il installazione di npm
comando prima di avviare il server per la prima volta.
In questa serie abbiamo visto alcune fantastiche possibilità e modi per sfruttare le capacità di Bitbucket. E abbiamo appena graffiato la superficie dei webhooks. Esistono molti trigger e informazioni diversi forniti da ciascun hook (leggi quali altre informazioni vengono passate in un hook di POST di Bitbucket), quindi potresti, ad esempio, configurarlo per ricevere avvisi quando qualcuno deposita il tuo repository. Oppure, nella parte più avanzata dello spettro, è possibile creare un'applicazione mobile per ottenere notifiche push quando vengono eseguite determinate azioni.
Lasciate commenti, domande e altri commenti nella sezione commenti qui sotto.