L-implimentazzjoni tagħna ta' Skjerament Kontinwu fuq il-pjattaforma tal-klijent

Aħna ta 'True Engineering waqqafna proċess għall-kunsinna kontinwa ta' aġġornamenti lis-servers tal-klijenti u rridu naqsmu din l-esperjenza.

Biex nibdew, żviluppajna sistema onlajn għall-klijent u skjerajnaha fil-grupp Kubernetes tagħna stess. Issa s-soluzzjoni ta 'tagħbija għolja tagħna mxiet għall-pjattaforma tal-klijent, li għaliha waqqafna proċess ta' Skjerament Kontinwu kompletament awtomatiku. Grazzi għal dan, aħna aċċelleraw iż-żmien tas-suq - it-twassil ta 'bidliet fl-ambjent tal-prodott.

F'dan l-artikolu ser nitkellmu dwar l-istadji kollha tal-proċess ta' Skjerament Kontinwu (CD) jew il-kunsinna ta' aġġornamenti lill-pjattaforma tal-klijent:

  1. Kif jibda dan il-proċess?
  2. sinkronizzazzjoni mar-repożitorju Git tal-klijent,
  3. assemblaġġ ta 'backend u frontend,
  4. skjerament awtomatiku ta' applikazzjoni f'ambjent tat-test,
  5. skjerament awtomatiku għal Prod.

Aħna ser naqsmu d-dettalji tas-setup tul it-triq.

L-implimentazzjoni tagħna ta' Skjerament Kontinwu fuq il-pjattaforma tal-klijent

1. Ibda CD

L-Iskjerament Kontinwu jibda bl-iżviluppatur li jimbotta bidliet fil-fergħa tar-rilaxx tar-repożitorju Git tagħna.

L-applikazzjoni tagħna taħdem fuq arkitettura ta’ mikroservizzi u l-komponenti kollha tagħha huma maħżuna f’repożitorju wieħed. Grazzi għal dan, il-mikroservizzi kollha jinġabru u jiġu installati, anki jekk wieħed minnhom inbidel.

Aħna organizzajna xogħol permezz ta' repożitorju wieħed għal diversi raġunijiet:

  • Faċilità ta 'żvilupp - l-applikazzjoni qed tiżviluppa b'mod attiv, sabiex tkun tista' taħdem mal-kodiċi kollu f'daqqa.
  • Pipeline CI/CD wieħed li jiggarantixxi li l-applikazzjoni bħala sistema waħda tgħaddi mit-testijiet kollha u titwassal lill-ambjent tal-produzzjoni tal-klijent.
  • Aħna neliminaw il-konfużjoni fil-verżjonijiet - m'għandniex għalfejn naħżnu mappa tal-verżjonijiet tal-mikroservizz u niddeskrivu l-konfigurazzjoni tagħha għal kull mikroservizz fi skripts Helm.

2. Sinkronizzazzjoni mar-repożitorju Git tal-kodiċi tas-sors tal-klijent

Il-bidliet li jsiru huma awtomatikament sinkronizzati mar-repożitorju Git tal-klijent. Hemm l-assemblaġġ ta 'applikazzjoni huwa kkonfigurat, li titnieda wara l-aġġornament tal-fergħa, u l-iskjerament għall-kontinwazzjoni. Iż-żewġ proċessi joriġinaw fl-ambjent tagħhom minn repożitorju Git.

Ma nistgħux naħdmu mar-repożitorju tal-klijent direttament għaliex għandna bżonn l-ambjenti tagħna stess għall-iżvilupp u l-ittestjar. Aħna nużaw ir-repożitorju Git tagħna għal dawn l-għanijiet - huwa sinkronizzat mar-repożitorju Git tagħhom. Hekk kif żviluppatur ipoġġi bidliet fil-fergħa xierqa tar-repożitorju tagħna, GitLab immedjatament jimbotta dawn il-bidliet lill-klijent.

L-implimentazzjoni tagħna ta' Skjerament Kontinwu fuq il-pjattaforma tal-klijent

Wara dan għandek bżonn tagħmel l-assemblaġġ. Tikkonsisti f'diversi stadji: assemblaġġ backend u frontend, ittestjar u kunsinna għall-produzzjoni.

3. L-assemblaġġ tal-backend u l-frontend

Il-bini tal-backend u l-frontend huma żewġ kompiti paralleli li jsiru fis-sistema GitLab Runner. Il-konfigurazzjoni oriġinali tal-assemblaġġ tagħha tinsab fl-istess repożitorju.

Tutorja għall-kitba ta 'skript YAML għall-bini f'GitLab.

GitLab Runner jieħu l-kodiċi mir-repożitorju meħtieġ, jiġborha mal-kmand tal-bini tal-applikazzjoni Java u jibgħatha lir-reġistru Docker. Hawnhekk niġbru l-backend u l-frontend, niksbu immaġini Docker, li npoġġu f'repożitorju fuq in-naħa tal-klijent. Biex timmaniġġja l-immaġini Docker nużaw Plugin Gradle.

Aħna nissinkronizzaw il-verżjonijiet tal-immaġini tagħna mal-verżjoni tar-rilaxx li se tiġi ppubblikata f'Docker. Għal tħaddim bla xkiel għamilna diversi aġġustamenti:

1. Il-kontenituri ma jerġgħux jinbnew bejn l-ambjent tat-test u l-ambjent tal-produzzjoni. Għamilna parametrizzazzjonijiet sabiex l-istess kontenitur ikun jista 'jaħdem mas-settings, il-varjabbli ambjentali u s-servizzi kollha kemm fl-ambjent tat-test kif ukoll fil-produzzjoni mingħajr bini mill-ġdid.

2. Biex taġġorna applikazzjoni permezz ta' Helm, trid tispeċifika l-verżjoni tagħha. Nibnu l-backend, il-frontend u naġġornaw l-applikazzjoni - dawn huma tliet kompiti differenti, għalhekk huwa importanti li tuża l-istess verżjoni tal-applikazzjoni kullimkien. Għal dan il-kompitu, nużaw dejta mill-istorja Git, peress li l-konfigurazzjoni u l-applikazzjonijiet tal-cluster K8S tagħna huma fl-istess repożitorju Git.

Aħna nġibu l-verżjoni tal-applikazzjoni mir-riżultati tal-eżekuzzjoni tal-kmand
git describe --tags --abbrev=7.

4. Skjerament awtomatiku tal-bidliet kollha fl-ambjent tat-test (UAT)

Il-pass li jmiss f'dan l-iskritt tal-bini huwa li taġġorna awtomatikament il-cluster K8S. Dan iseħħ sakemm l-applikazzjoni kollha tkun inbniet u l-artifacts kollha jkunu ġew ippubblikati fir-Reġistru Docker. Wara dan, jibda l-aġġornament tal-ambjent tat-test.

L-aġġornament tal-cluster huwa beda juża Aġġornament tat-Tmun. Jekk, bħala riżultat, xi ħaġa ma marretx skond il-pjan, Helm awtomatikament u b'mod indipendenti jreġġa' lura l-bidliet kollha tiegħu. Ix-xogħol tiegħu m'għandux għalfejn jiġi kkontrollat.

Aħna nipprovdu l-konfigurazzjoni tal-cluster K8S flimkien mal-assemblaġġ. Għalhekk, il-pass li jmiss huwa li taġġornaha: configMaps, skjeramenti, servizzi, sigrieti u kwalunkwe konfigurazzjoni K8S oħra li nbiddlu.

Helm imbagħad imexxi aġġornament RollOut tal-applikazzjoni nnifisha fl-ambjent tat-test. Qabel ma l-applikazzjoni tiġi skjerata għall-produzzjoni. Dan isir sabiex l-utenti jkunu jistgħu jittestjaw manwalment il-karatteristiċi tan-negozju li npoġġu fl-ambjent tat-test.

5. Skjerament awtomatiku tal-bidliet kollha għall-Prod

Biex tiskjera aġġornament għall-ambjent tal-produzzjoni, trid biss tikklikkja buttuna waħda f'GitLab - u l-kontenituri jitwasslu immedjatament fl-ambjent tal-produzzjoni.

L-istess applikazzjoni tista 'taħdem f'ambjenti differenti—test u produzzjoni—mingħajr bini mill-ġdid. Aħna nużaw l-istess artifacts mingħajr ma nibdlu xejn fl-applikazzjoni, u nissettjaw il-parametri esternament.

Il-parametrizzazzjoni flessibbli tas-settings tal-applikazzjoni tiddependi fuq l-ambjent li fih se tiġi eżegwita l-applikazzjoni. Imċaqlaqna s-settings ambjentali kollha esternament: kollox huwa parametrizzat permezz tal-konfigurazzjoni K8S u l-parametri Helm. Meta Helm juża assemblaġġ fl-ambjent tat-test, is-settings tat-test jiġu applikati għalih, u s-settings tal-prodott jiġu applikati għall-ambjent tal-produzzjoni.

L-iktar ħaġa diffiċli kienet li jiġu parametrizzati s-servizzi u l-varjabbli kollha użati li jiddependu fuq l-ambjent, u jittraduċuhom f'varjabbli ambjentali u deskrizzjoni-konfigurazzjonijiet ta 'parametri ambjentali għal Helm.

Is-settings tal-applikazzjoni jużaw varjabbli tal-ambjent. Il-valuri tagħhom huma stabbiliti f'kontenituri bl-użu tal-konfigurazzjoni K8S, li hija mudellata bl-użu ta 'mudelli Go. Pereżempju, l-issettjar ta’ varjabbli ambjentali għall-isem tad-dominju jista’ jsir hekk:

APP_EXTERNAL_DOMAIN: {{ (pluck .Values.global.env .Values.app.properties.app_external_domain | first) }}

.Valuri.global.env – din il-varjabbli taħżen l-isem tal-ambjent (prod, stage, UAT).
.Valuri.app.properties.app_dominju_estern – f'din il-varjabbli nissettjaw id-dominju mixtieq fil-fajl .Values.yaml

Meta jaġġorna applikazzjoni, Helm joħloq fajl configmap.yaml minn mudelli u jimla l-valur APP_EXTERNAL_DOMAIN bil-valur mixtieq skont l-ambjent li fih jibda l-aġġornament tal-applikazzjoni. Din il-varjabbli hija diġà stabbilita fil-kontenitur. Jista 'jkun aċċessat mill-applikazzjoni, għalhekk kull ambjent ta' applikazzjoni se jkollu valur differenti għal din il-varjabbli.

Relattivament reċentement, l-appoġġ K8S deher fi Spring Cloud, inkluż ix-xogħol ma 'configMaps: Rebbiegħa Cloud Kubernetes. Filwaqt li l-proġett qed jiżviluppa b'mod attiv u jinbidel radikalment, ma nistgħux nużawh fil-produzzjoni. Iżda aħna nissorveljaw b'mod attiv il-kundizzjoni tagħha u nużawha f'konfigurazzjonijiet DEV. Hekk kif jistabbilizza, se naqilbu milli nużaw varjabbli ambjentali għaliha.

B'kollox

Allura, Skjerament Kontinwu huwa kkonfigurat u jaħdem. L-aġġornamenti kollha jseħħu b'keystroke waħda. Il-kunsinna ta 'bidliet fl-ambjent tal-prodott hija awtomatika. U, importanti, l-aġġornamenti ma jwaqqfux is-sistema.

L-implimentazzjoni tagħna ta' Skjerament Kontinwu fuq il-pjattaforma tal-klijent

Pjanijiet futuri: migrazzjoni awtomatika tad-database

Ħsibna dwar l-aġġornament tad-database u l-possibbiltà li jerġgħu lura dawn il-bidliet. Wara kollox, żewġ verżjonijiet differenti tal-applikazzjoni qed jaħdmu fl-istess ħin: il-qadima qed taħdem, u l-ġdida qed taħdem. U se nitfi l-qadima biss meta nkunu ċerti li l-verżjoni l-ġdida taħdem. Il-migrazzjoni tad-database għandha tippermettilek taħdem maż-żewġ verżjonijiet tal-applikazzjoni.

Għalhekk, ma nistgħux sempliċement nibdlu l-isem tal-kolonna jew dejta oħra. Iżda nistgħu noħolqu kolonna ġdida, nikkopja dejta mill-kolonna l-antika fiha u niktbu triggers li, meta taġġorna d-dejta, simultanjament se tikkopjaha u taġġornaha f'kolonna oħra. U wara l-iskjerament b'suċċess tal-verżjoni l-ġdida tal-applikazzjoni, wara l-perjodu ta 'appoġġ ta' wara t-tnedija, inkunu nistgħu nħassru l-kolonna l-qadima u l-grillu li sar bla bżonn.

Jekk il-verżjoni l-ġdida tal-applikazzjoni ma taħdimx b'mod korrett, nistgħu nerġgħu lura għall-verżjoni preċedenti, inkluża l-verżjoni preċedenti tad-database. Fil-qosor, il-bidliet tagħna se jippermettulek taħdem simultanjament ma 'diversi verżjonijiet tal-applikazzjoni.

Qed nippjanaw li nawtomatizzaw il-migrazzjoni tad-database permezz tax-xogħol K8S, billi nintegrawha fil-proċess tas-CD. U żgur li se naqsmu din l-esperjenza fuq Habré.

Sors: www.habr.com

Żid kumment