conducte de implementare în practică

Conducte de implementare în practică

Rezumat. rețeaua există o mulțime de materiale teoretice privind livrarea continuă Implementarea Pipeline'ov, dar implementările practice ale exemplelor care nu este încă găsit. De fapt, aici vreau să împărtășesc un exemplu de modul în care am implementat Deployment Pipeline in cadrul proiectului nostru deschis JTalks sursa. Toate open source, astfel încât să nu se poate citi numai explicația, dar să fure, și punerea în aplicare.







Dacă nu înțelegeți ce Deployment Pipeline și de ce ai nevoie de ea, aici sunt unele puncte, cu toate acestea, pentru a înțelege pe deplin necesitatea de a citi până la sfârșit:

Conducta de implementare - un set de practici pentru a automatiza implementarea aplicațiilor la diferite medii, inclusiv producția

Implementarea Pipeline vă permite să facă comunicate de frecvente și de a reduce riscul unui eșec

Implementarea Pipeline vă permite să accelereze activitatea diferitelor echipe (Dev, QA, DevOps) prin automatizarea lucrărilor de rutină

Se poate uita la exemplul asa

Primul și central - l sobsno serverul nostru continuu de integrare. Vă recomandăm să-l utilizați Jenkins,
pentru că el are la îndemână sute de plug-in-uri, și jumătate dintre ei nu vă va oferi orice tip de instrumente comerciale
Echipa City, Bamboo. Un paragraf suplimentar în favoarea Jenkins - acesta este deschis și vă puteți face pentru a construi pe plugin-uri sale. aceasta
oportunitate vine de obicei în proiecte foarte mari, în special la îndemână în cazul în care caracteristicile standard nu sunt adecvate și au nevoie de o mulțime
să scrie deciziile lor.

Ce plugin-uri Jenkins'a ar trebui să fie luate în considerare pentru punerea în aplicare de implementare Pipeline'ov:

  • Build Pipeline Plugin - sobsno. Acest plug-in-ul este departe de a fi ideal ca cele mai multe plugin-uri Jenkins, cu un număr de bug-uri (pe care le puteți repara). Acesta oferă posibilitatea de a vizualiza banda transportoare. Vizualizarea este foarte important ca toți membrii echipei, inclusiv viitorii nou-veniții dat seama repede ce sunt mediul înconjurător și cum să evolueze aplicația. De asemenea, acest plugin controlează capacitatea de a rula unele sau alte planuri. Pentru a pune în aplicare această implementare Pipeline'a important pentru tine pentru a face artefacte dvs. nu trece la faza următoare până la finalizarea celui precedent. De exemplu, cererea dumneavoastră nu ar trebui să aibă loc la UAT, sau mediul PREPROD înainte de teste de sistem automate trecut.
  • Rebuild Plugin - de exemplu, vă decideți nelansate cererea dumneavoastră, iar în PROD înconjurat sa dovedit că ceva este greșit. În practica mea am fost de așa natură încât cererea să ruleze inacceptabil lent pe date reale. Atunci ar trebui să fie în măsură să se rostogolească înapoi schimbarea ta. Retroactivitatea nu ar trebui să fie în mod ideal diferit de eliberare obișnuită, iar dacă se întâmplă să fie în această situație - doar zarelizte versiune anterioară a aplicației! Rebuild Plugin permite repornire anterior construiește cu aceiași parametri.
    Desigur, o astfel de situație nu este întotdeauna simplu - uneori trebuie să se rostogolească înapoi modificări ale bazei de date. Apoi, desigur, încă mai trebuie să restaurați copii de rezervă. Fă-l, astfel încât oricare dintre toate împrejurimile au folosit același script - atunci când le ottestiruete de sute de ori mai mult pe faza de proiectare.
  • SCM Sync Configurare Plugin - nu este legată direct de bandă rulantă, dar este mai bine la schimbările de versiune în serverul de integrare continuă. Pentru mai departe în pădure, mai mult lemn - CI la un moment dat devine instrumentul cel mai important și central cu o configurație complexă. Acest plug trebuie utilizat cu mare precauție, deoarece sa întâmplat că el pur și simplu a refuzat. Recent, am început să se gândească la backup-uri manuale.

Artifacts (Binaries)

Urmatoarea oprire - magazia de artefacte tale. Una dintre principalele caracteristici ale acestor Pipeline'ov de implementare - artefacte tale sunt colectate doar o singură dată și utilizate în fiecare mediu. Acest lucru este important din mai multe motive:

Ai medii repetabile. Nu există nici măcar posibilitatea ca medii diferite au fost diferite surse. Dacă se colectează de fiecare dată când noi artefacte, atunci spune acest lucru nu se mai poate. În primul rând, pentru că în timpul asamblării poate fi utilizat pentru unii parametri ai mediului, în al doilea rând și de a construi instrumente se pot scoate în evidență. De exemplu, Maven poate utiliza o altă versiune a unui artefact dacă utilizați intervale versiune: [1,5-1,7) .
Un alt exemplu - it yourself Maven Report (Nexus, de exemplu), care poate reveni artefacte diferite, în funcție de setările și descrierile lor pom.xml. Aceasta se poate întâmpla în cazul în care grupurile de Repository sunt folosite, care se referă la mai multe arhive cu aceleași artefacte.

În cazul în care a fost găsit nici un bug mediu, puteți descărca întotdeauna același artefact într-un alt mediu pentru a verifica ce se întâmplă.







Alte echipe (QA) pot rula înapoi versiuni de ei înșiși și să localizeze astfel versiunea în care a fost introdus bug-ul.

CI-ul funcționează mai rapid, deoarece Nu trebuie să faceți ansambluri suplimentare.

Ei au caracteristici speciale pentru lucrul cu artefaktrami, cum ar fi de căutare și indexare. Puteți crea mai multe arhive în cadrul acestora și de a le limita la o parte din acces. Puteți crea chiar și un depozit numai cu artefacte stabile, și toate celelalte depozitate separat.

Încă nevoie de ele pentru a lucra cu Maven, Gradle - pentru a descărca de dependenta lor.

artefacte de stocare Jenkins'e care lucrează cu el complică, de exemplu, trebuie să se gândească la modul de a face backup-uri mai eficiente.

Total, am stabilit că artefactele stocate și istoria lor este importantă pentru noi. Cum de a face acest lucru corect? Atunci când o comite, trebuie să rulați testele necesare și trecerea lor și de a colecta artefacte pentru a umple magazia dumneavoastră. Fiecare artefact trebuie să aibă un fel de identificator, o versiune a, așa mai departe s-ar putea dezumfla artefactul în alte medii.

De exemplu, în JTalks noastre planul de asamblare arată astfel:

Fiecare plan Jenkins au variabile speciale, cum ar fi BUILD_NUMBER (am redenumit în PIPELINE_NUMBER) - această variabilă este folosit pentru unic, adică fiecare artefact primește sufixul corespunzător. Mai mult, cu acest sufix, completam artefactul Nexus într-un depozit special. pentru că Fiecare ansamblu are un număr unic de sufix - vom trece acest număr în alte planuri de implementare a acestei Pipeline'a. ei găsesc artefactul dorit și implementați-l pe mediile de dreapta.

Configurarea proiectelor

Pentru a realiza un frumos și simplu conducte de implementare, dezvoltatorii trebuie să facă un efort. De exemplu, nu veți reuși dacă configurați proiectul la momentul construi. Și astfel este (Doamne ferește!) - Punerea pe artefactul pentru fiecare mediu în cazul în care singura diferență este în configurație, și codul - la fel. Pentru a obține aceasta trebuie să rămânem la o singură regulă: trebuie să configurați ansamblul din exterior! Puteți lăsa o parte a mediului (inclusiv locale generale) în cadrul atrefaktov și vă permite să comutați între ele cu ajutorul unor steaguri: -Denvironment = UAT. dar, de asemenea, ar trebui să poată stabili parametrii de afară. Aceasta este a) permite artefactul de a disloca orice mediu b) da posibilitatea de a stoca configurația sensibile (de exemplu, parole PROD bază) într-un depozit separat, fără a permite accesul.

Acum, pentru practica: în JTalks ne-am dat seama posibilitatea extinderii sale Sping'ovogo PropertyPlaceholderConfigurer JndiAwarePropertyPlaceholderConfigurer. Ideea este că vom verifica mai întâi dacă există o variabilă JNDI, și numai atunci, în cazul în care nu a fost găsit, uita-te la variabilele de mediu, precum și fișiere de proprietăți în cadrul unui proiect. O definiție a unor opțiuni ar putea arăta astfel:

Acum, cum să setați proprietățile la exterior? Probabil că toată lumea are AppServer'a JNDI, Tomcat nu este o excepție. Creați un fișier și puneți-l în conf / Catalina / localhost / [app-namme] .xml. Și apoi scrie:

Toți parametrii sunt stabilite în JNDI și dacă se rezolvă, se va lua de acolo. Dacă nu este acolo, atunci ne uităm la env sau fișiere VAR proprietăți.

instrument de asamblare

Fiecare curs de proiect ar trebui să îndeplinească instrumentul special. Există tot felul de Ant, Maven, Gradle. Aici luăm în considerare ultimele două. Maven, din păcate, nu se încadrează în imaginea de ansamblu. Ideea noastra - au un artefact unic după fiecare comitere, dar Maven înregistrează versiunea sa în pom.xml și schimbați-le după fiecare nu comme il faut comite într-un fel. Am văzut această opțiune în proiecte mari, atunci când a avut loc ramuri tematice folosite și de validare la prekommita etapă, versiunea este actualizată numai atunci când codul de ajuns pentru a dezvolta o ramură ca aceasta să-i înfățișeze ca Fetishists GIT. Cu toate acestea, pentru proiecte mici și mijlocii - este nejustificată, precum și faptul că mare nu este o opțiune bună. Pe scurt, am deșuruba JTalks în doar acea versiune substitut, artefact încorporat, dar comite schimbările pe care le-am făcut în fișierele POM.

Gradle este un instrument mai modern și flexibil, care, probabil, va fi capabil de a personaliza după cum doriți. Dar el folosește de obicei aceleași convenții pentru versionare care Maven. Prin urmare, se pare că instrumentele de asamblare nu trebuie să afecteze versiunea unică a artefactelor. Poate că ideea unei versiuni substitut fără a comite este normal și nu o carja cum părea inițial.

Limbaj de scriptare

Pentru a automatiza comunicatele pe care trebuie să scrie script-uri. Acesta poate fi un bash, Python, Ruby, Groovy, sunteți liber să aleagă pentru tine. Bash'a este puțin probabil să fie suficient, și toate celelalte speciale unul față de celălalt nu diferă. Cu toate acestea, există avantaje ale fiecăreia dintre ele:

Python instalat pe cele mai multe distribuții Linux, în plus, nu trebuie să pună orice platforme.

Pro-uri ca Ruby, care, atunci am putea avea nevoie de instrumente pentru configurarea medii, cum ar fi Chef. care utilizează Ruby. Poti pune chiar în buna Pipeline Chef. Cu toate acestea, toate serverele ar trebui să fie preinstalat cu soft'om pentru acest lucru.

Groovy este convenabil, deoarece puteți utiliza Gradle și apoi porniți script-urile din codul sursă al proiectului ei înșiși ca un instrument de construcție.

Script-urile ar trebui să fie ambalate, de exemplu, Python are propriul manager de pachete - PIP. Acest lucru este convenabil, deoarece puteți script versionare artefacte ele însele, iar instalarea va fi mult mai banal.

Un exemplu de astfel de scripturi în Python, puteți vizualiza open source noastre.

virtualizare

Pentru a se asigura că toate mediile sunt mai asemănătoare și nu există situații neprevăzute legate de orice sistem de operare de hardware, ar trebui să ia în considerare mediile de virtualizare, până la PROD'a virtualizare. Acesta va oferi, de asemenea, o creștere a productivității ca elimina configurarea manuală a noilor medii. Un avantaj suplimentar poate fi faptul că la un moment dat pe care doriți să utilizați soluții bazate pe cloud, cum ar fi Amazon EC2, apoi sari pe ele vor fi chiar mai simplu.

Există un instrument de mare ca Hoinar. care simplifică foarte mult problema cu repetarea împrejurimile. Trebuie doar să descrie ce imagine pentru a utiliza, ceea ce software-ul este instalat (acest lucru se face prin integrarea cu Chef și păpuși) și vu la - mediu gata într-o singură comandă. Acum, chiar și cei mai malotehnicheskie pot extinde sistemul fără probleme. JTalks VM demonstrează capacitățile Vagrant'a:

Ai instalat Hoinar, scuturarea ei înșiși script vagaboande din depozit git de mai sus

Hoinar în sus - și după un timp, atunci când toate descărcați și instalați, veți obține o distribuție Ubuntu cu proiect de scripturi de implementare stabilit acolo, precum și MySQL, Tomcat'om.