Creative Utilizează pentru Webhooks

Sursa de control este modul de a merge pentru dezvoltarea de software, iar utilizarea unui serviciu de gazduire de depozit vă permite să vă gestionați codul chiar mai departe.

Pe lângă multiplele beneficii ale Bitbucket pe care le-am menționat deja, puteți crea și Webhook-uri pentru a automatiza procesele și pentru a crea tot felul de alerte și interacțiuni pe baza acțiunilor executate în depozitul dvs. În acest articol vom examina ce hârlii web sunt și cum le puteți utiliza și vom trece printr-un exemplu de implementare a implementării codurilor prin intermediul webhooks-urilor.

Ce e un Webhook?

Când efectuați anumite acțiuni într-un depozit Git, aveți posibilitatea de a invoca un script dat. Acesta este numit un cârlig, iar în Git există mai multe tipuri de cârlige. De exemplu, puteți executa un script chiar înainte de a efectua modificări în depozit sau înainte de a vă deplasa la depozitul de la distanță.

Aceste exemple se referă la un depozit local. Cu toate acestea, atunci când utilizați un serviciu de gazduire de depozit, cum ar fi Bitbucket, aveți posibilitatea de a executa huburi web. Acestea sunt foarte asemănătoare cu un cârlig Git, dar în loc să executați un script, trimiteți o solicitare HTTP către o anumită adresă URL, încărcarea variază în funcție de tipul de webhook.

Îmbunătățirea fluxului de lucru

Deși nu este greu, implementarea codului dvs. pe un server de producție poate fi foarte consumatoare de timp și un adevărat dăunător. Cu toate acestea, este un pas necesar în orice dezvoltare de aplicații moderne. Într-un depozit local puteți crea un script care vă construiește codul de fiecare dată când comiți ceva sau se îmbină cu sucursala dvs. și când lucrați cu Bitbucket acest lucru nu ar trebui să fie diferit. Pentru a emula acest lucru, vom profita de cârligul Bitbucket POST.

Configurarea cârligului POST

Primul pas pentru a configura cârligul POST pentru un depozit dat este de a avea depozit în loc. Pentru acest tutorial voi folosi o versiune modificată a exemplului lui Bootstrap Jumbotron. Puteți să luați depozitul din Bitbucket sau pur și simplu să îl dați în cont. Acest exemplu este același cu Jumbotron-ul Bootstrap, dar folosind RequireJS și gestionarea dependențelor prin npm și Bower.

Odată ce ați depozitat în loc, este timpul să configurați cârligul POST. Accesați prezentarea generală a depozitului, navigați la Setări, și du-te la Hooks secțiune. Pentru tipul de cârlig selectați POST, și introduceți adresa URL pentru a trimite solicitarea HTTP la data la care depozitul a fost împins. Acesta este tot ce trebuie să faceți în partea Bitbucket pentru a vă automatiza procesul de implementare prin webhooks.


Manipulați cererea de cârlig

Odată ce ați configurat cârligul POST pentru depozit, următorul lucru pe care trebuie să-l faceți este să prindeți cererea și, în acest caz, să clonați și să construiți depozitul în calea HTML publică. Pentru aceasta vom folosi NodeJS cu ExpressJS. Să creăm scenariul care va gestiona clonarea, instalarea, construirea și mutarea aplicației. Este un script de bash pe care îl putem executa de pe serverul nostru NodeJS.

# / bin / bash git clona $ 1 cd tuts-webhooks npm instalare bower instalare 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-webhook-uri

Acest script are grijă de toți pașii necesari pentru obținerea codului aplicației, precum și pentru construirea, optimizarea și mutarea rezultatelor în locația publică a serverului. $ de 1 se referă la primul argument al scriptului, care, în acest caz, este adresa URL a repozitorului. Rețineți totuși că căile sunt setate pe căile din serverul meu, iar a ta va fi probabil diferită, deci actualizați-le pentru ca scriptul să funcționeze corect.

Cu acest script în loc, îl putem rula manual cu adresa URL a repozitorului și vom obține o versiune de producție a site-ului nostru. Cu toate acestea, nu vrem să îl executăm manual, iar în acest caz NodeJS și cererea POST Bitbucket vor străluci. Să creăm un server care să răspundă cererii de cârlig POST și să execute scriptul anterior.

Package.json

Descrierea pentru serverul care va ocupa cererile de cârlig POST este după cum urmează.

"nume": "WebHooksTutsPlus", "descriere": "Aplicație de server utilizată pentru capturarea cererilor trimise de la magazia Webtubs Tuts Bitbucket.", "versiune": "1.0.0", "privat": true; "corp-parser": "~ 1.0.x", "expres": "4.xx"

Singurele dependențe pentru acest server simplu sunt expresia și parserul de caractere pentru manipularea încărcăturii JSON cererilor.

Serverul NodeJS

Acum, pentru serverul NodeJS actual, codul merge după cum urmează.

var bodyParser = necesită ('body-parser'), express = necesită ('express'), app = express (); var site = cer ('./route/site'); app.use (bodyParser.json ()); app.use (bodyParser.urlencoded ()); app.get ('/', funcția (req, res, următoarea) res.send ('Hooks listener running');); app.use ('/ site', site); app.listen (9090);

Acesta este un server web foarte simplu care ascultă pe portul local 9090. La linia 10 avem o metodă care ascultă pe adresa de bază a serverului și răspunde cu un mesaj text pentru a verifica dacă serverul rulează. Acum, pentru scriptul care manipulează de fapt cârligul POST, adăugați următorul script și plasați-l în interiorul _routers_ pliant.

var express = cere ('expres'), router = express.Router (); router.post ('/', functie (req, res, urmatoarea) var payload = JSON.parse (req.param (payload)), repo = payload.canon_url + payload.repository.absolute_url, exec = (message: 'Site actualizat');; ); module.exports = router;

Acest router ascultă solicitările POST la adresa URL a site-ului. Se construiește URL-ul repository din sarcina utilă a cererii și execută scriptul nostru creat anterior cu adresa URL a repozitorului. Pentru simplitate, nu gestionăm ieșirea metodei NodeJS exec sau verificând erorile în execuția scriptului.

Asta e! Acum, după fiecare împingere către depozit, site-ul dvs. va construi, optimiza și implementa automat codul. Nu uitați să le dați câteva minute pentru a instala toate dependențele și pentru a compila codul.

Considerații privind securitatea

OK, este grozav: site-ul nostru actualizează automat atunci când împingem schimbări în depozit. Dar acum nu validăm nicio informație atunci când efectuăm procesul de actualizare. Unul dintre cele mai de bază verificări pe care le putem și ar trebui să le îndeplinim este originea solicitării, iar Bitbucket ne dă IP-urile pe care le poate proveni de la cârligul POST. Cu aceste informații putem modifica acum serverul nostru doar pentru a încerca să actualizeze site-ul atunci când cererea vine de la această origine. Adăugați următorul cod în partea de sus a metodei routerului nostru.

dacă req.ip! = '131.103.20.165' && req.ip! = '131.103.20.166') res.json (mesaj: 'Originea necondiționată'); întoarcere; 

Rețineți că, dacă Bitbucket va actualiza IP-urile de ieșire, va trebui să actualizăm această secțiune. Un alt lucru de luat în considerare este faptul că, cel puțin în cazul meu, folosesc nginx ca proxy invers, așa că chiar acum req.ip apelul va reveni 127.0.0.1 și nu va funcționa. Pentru a rezolva acest lucru, trebuie să le spunem serverului nostru să aibă încredere în proxy și să utilizeze IP-ul original. Destul de simplu: trebuie doar să adăugăm următorul cod deasupra primului app.use () sunați la server.js.

app.enable ("proxy de încredere");

Și asta e, acum pe noi req.ip va da adresa IP originală și vom putea verifica adresele Bitbucket de ieșire.

consideratii speciale

Acest exemplu utilizează un server NodeJS pentru a gestiona cererea, iar serverul ascultă pe localhost lui port 9090. Prin urmare, pentru ca aceasta să funcționeze, folosesc nginx ca proxy invers pentru a transmite cererea de la distanță către serverul NodeJS. Configurarea nginx ca proxy invers este în afara scopului acestui tutorial, dar este important să menționați și să utilizați o configurație echivalentă atunci când urmați. De asemenea, nu uitați să efectuați npm install înainte de a porni serverul pentru prima dată.

Concluzie

De-a lungul acestei serii am văzut câteva posibilități foarte interesante și modalități de a profita de capacitățile Bitbucket. Și tocmai am zgâriat suprafața hârliilor. Există o mulțime de declanșatoare și informații furnizate de fiecare cârlig (citiți ce alte informații sunt transmise într-un cârlig POST Bitbucket), astfel încât să puteți, de exemplu, să o configurați pentru a primi alerte atunci când cineva vă anulează depozitul. Sau la sfârșitul mai avansat al spectrului, puteți crea o aplicație mobilă pentru a obține notificări push atunci când se efectuează anumite acțiuni.

Lăsați orice comentarii, întrebări și orice alte reacții în secțiunea de comentarii de mai jos.

Cod