Fi proġetti relatati mal-iżvilupp tal-arkitettura tal-mikroservizz, CI/CD jiċċaqlaq mill-kategorija ta 'opportunità pjaċevoli għall-kategorija ta' ħtieġa urġenti. L-ittestjar awtomatizzat huwa parti integrali mill-integrazzjoni kontinwa, li approċċ kompetenti għalih jista 'jagħti lit-tim ħafna serati pjaċevoli mal-familja u l-ħbieb. Inkella, il-proġett jirriskja li qatt ma jitlesta.
Huwa possibbli li tkopri l-kodiċi tal-mikroservizz kollu b'testijiet ta 'unità b'oġġetti finta, iżda dan issolvi biss parzjalment il-problema u jħalli ħafna mistoqsijiet u diffikultajiet, speċjalment meta tittestja x-xogħol bid-dejta. Bħal dejjem, dawk l-aktar urġenti huma l-ittestjar tal-konsistenza tad-dejta f'database relazzjonali, l-ittestjar tax-xogħol mas-servizzi tal-cloud, u li jagħmlu suppożizzjonijiet żbaljati meta tikteb oġġetti mock.
Dan kollu u ftit aktar jistgħu jiġu solvuti billi jiġi ttestjat il-mikroservizz kollu f'kontenitur Docker. Vantaġġ bla dubju biex tiġi żgurata l-validità tat-testijiet huwa li jiġu ttestjati l-istess immaġini Docker li jidħlu fil-produzzjoni.
L-awtomazzjoni ta' dan l-approċċ tippreżenta għadd ta' problemi, li s-soluzzjoni għalihom se tiġi deskritta hawn taħt:
- kunflitti ta' kompiti paralleli fl-istess docker host;
- kunflitti ta' identifikaturi fid-database waqt iterazzjonijiet tat-test;
- stennija li l-mikroservizzi jkunu lesti;
- Għaqda u ħruġ ta' zkuk għal sistemi esterni;
- ittestjar ta' talbiet HTTP ħerġin;
- Ittestjar ta' socket tal-web (bl-użu ta' SignalR);
- ittestjar tal-awtentikazzjoni u l-awtorizzazzjoni OAuth.
Dan l-artikolu huwa bbażat fuq
F'dan l-artikolu ser ngħidlek kif tuża script biex tmexxi s-servizz taħt test, database u servizzi Amazon AWS f'Docker, imbagħad testijiet fuq Postman u, wara li jitlestew, waqqaf u ħassar il-kontenituri maħluqa. It-testijiet isiru kull darba li l-kodiċi jinbidel. B'dan il-mod, aħna niżguraw li kull verżjoni taħdem b'mod korrett mad-database u s-servizzi tal-AWS.
L-istess skript jitmexxa kemm mill-iżviluppaturi nfushom fuq id-desktops tal-Windows tagħhom kif ukoll mis-server Gitlab CI taħt Linux.
Biex tkun iġġustifikata, l-introduzzjoni ta' testijiet ġodda m'għandhiex teħtieġ l-installazzjoni ta' għodod addizzjonali la fuq il-kompjuter tal-iżviluppatur jew fuq is-server fejn it-testijiet isiru fuq commit.Docker issolvi din il-problema.
It-test irid jaħdem fuq server lokali għar-raġunijiet li ġejjin:
- In-netwerk qatt ma huwa kompletament affidabbli. Minn elf talba, wieħed jista’ jfalli;
F'dan il-każ, it-test awtomatiku ma jaħdimx, ix-xogħol se jieqaf, u jkollok tfittex ir-raġuni fir-zkuk; - Talbiet frekwenti wisq mhumiex permessi minn xi servizzi ta’ partijiet terzi.
Barra minn hekk, mhux mixtieq li tuża l-istand minħabba li:
- Stand jista 'jinkisser mhux biss minn kodiċi ħażin li jaħdem fuqu, iżda wkoll minn data li l-kodiċi korrett ma jistax jipproċessa;
- Ma jimpurtax kemm nippruvaw nerġgħu lura l-bidliet kollha li saru mit-test matul it-test innifsu, xi ħaġa tista' tmur ħażin (inkella, għaliex it-test?).
Dwar il-proġett u l-organizzazzjoni tal-proċess
Il-kumpanija tagħna żviluppat applikazzjoni tal-web tal-mikroservizz li taħdem f'Docker fil-sħab tal-Amazon AWS. It-testijiet tal-unità kienu diġà użati fuq il-proġett, iżda spiss seħħew żbalji li t-testijiet tal-unità ma skoprewx. Kien meħtieġ li jiġi ttestjat mikroservizz kollu flimkien mad-database u s-servizzi tal-Amazon.
Il-proġett juża proċess ta 'integrazzjoni kontinwa standard, li jinkludi l-ittestjar tal-mikroservizz ma' kull impenn. Wara li jassenja kompitu, l-iżviluppatur jagħmel bidliet fil-mikroservizz, jittestjah manwalment u jwettaq it-testijiet awtomatizzati kollha disponibbli. Jekk meħtieġ, l-iżviluppatur jibdel it-testijiet. Jekk ma jinstabu l-ebda problemi, isir impenn għall-fergħa ta 'din il-kwistjoni. Wara kull impenn, it-testijiet jitmexxew awtomatikament fuq is-server. L-għaqda f'fergħa komuni u t-tnedija ta' testijiet awtomatiċi fuqha sseħħ wara reviżjoni b'suċċess. Jekk it-testijiet fuq il-fergħa kondiviża jgħaddu, is-servizz jiġi aġġornat awtomatikament fl-ambjent tat-test fuq Amazon Elastic Container Service (bank). L-istand huwa meħtieġ għall-iżviluppaturi u t-testers kollha, u mhux rakkomandabbli li tkisser. Dawk li jittestjaw f'dan l-ambjent jiċċekkjaw soluzzjoni jew karatteristika ġdida billi jwettqu testijiet manwali.
Arkitettura tal-proġett
L-applikazzjoni tikkonsisti f'aktar minn għaxar servizzi. Xi wħud minnhom huma miktuba f'.NET Core u xi wħud f'NodeJs. Kull servizz jaħdem f'kontenitur Docker fl-Amazon Elastic Container Service. Kull wieħed għandu d-database Postgres tiegħu, u xi wħud għandhom ukoll Redis. M'hemm l-ebda databases komuni. Jekk diversi servizzi jeħtieġu l-istess dejta, allura din id-dejta, meta tinbidel, tiġi trażmessa lil kull wieħed minn dawn is-servizzi permezz ta 'SNS (Servizz ta' Notifika Sempliċi) u SQS (Servizz ta 'Amazon Simple Queue), u s-servizzi jiffrankawha fid-databases separati tagħhom stess.
SQS u SNS
SQS jippermettilek tpoġġi messaġġi fi kju u taqra messaġġi mill-kju billi tuża l-protokoll HTTPS.
Jekk diversi servizzi jaqraw kju wieħed, allura kull messaġġ jasal biss lil wieħed minnhom. Dan huwa utli meta tħaddem diversi każijiet tal-istess servizz biex tqassam it-tagħbija bejniethom.
Jekk trid li kull messaġġ jitwassal lil servizzi multipli, kull riċevitur għandu jkollu l-kju tiegħu stess, u SNS huwa meħtieġ biex jidduplika messaġġi f'kjuwijiet multipli.
Fl-SNS inti toħloq suġġett u tabbona għalih, pereżempju, kju SQS. Tista 'tibgħat messaġġi lis-suġġett. F'dan il-każ, il-messaġġ jintbagħat lil kull kju abbonat għal dan is-suġġett. SNS m'għandux metodu għall-qari tal-messaġġi. Jekk waqt id-debugging jew l-ittestjar għandek bżonn issir taf x'inhu mibgħut lill-SNS, tista 'toħloq kju SQS, tabbonaha għas-suġġett mixtieq u aqra l-kju.
API Gateway
Il-biċċa l-kbira tas-servizzi mhumiex aċċessibbli direttament mill-Internet. L-aċċess isir permezz tal-API Gateway, li jiċċekkja d-drittijiet tal-aċċess. Dan huwa wkoll is-servizz tagħna, u hemm testijiet għalih ukoll.
Notifiki f'ħin reali
L-applikazzjoni tuża
Approċċ tal-Ittestjar Magħruf
It-testijiet tal-unità jissostitwixxu affarijiet bħall-database b'oġġetti mock. Jekk mikroservizz, pereżempju, jipprova joħloq rekord f'tabella b'ċavetta barranija, u r-rekord referenzjat minn dik iċ-ċavetta ma jeżistix, allura t-talba ma tistax tiġi esegwita. It-testijiet unitarji ma jistgħux jiskopru dan.
В
Id-database fil-memorja hija waħda mid-DBMSs appoġġjati mill-Qafas tal-Entitajiet. Inħoloq speċifikament għall-ittestjar. Data f'database bħal din tinħażen biss sakemm jintemm il-proċess li jużaha. Ma jeħtieġx li jinħolqu tabelli u ma jiċċekkjax l-integrità tad-dejta.
L-oġġetti mock jimmudellaw il-klassi li qed jissostitwixxu biss sal-punt li l-iżviluppatur tat-test jifhem kif taħdem.
Kif tikseb Postgres biex awtomatikament jibda u jwettaq migrazzjonijiet meta tmexxi test mhuwiex speċifikat fl-artikolu ta 'Microsoft. Is-soluzzjoni tiegħi tagħmel dan u, barra minn hekk, ma żżid l-ebda kodiċi speċifikament għat-testijiet mal-mikroservizz innifsu.
Ejja ngħaddu għas-soluzzjoni
Matul il-proċess ta 'żvilupp, deher ċar li t-testijiet tal-unità ma kinux biżżejjed biex jinstabu l-problemi kollha fil-ħin, għalhekk ġie deċiż li din il-kwistjoni tiġi approċċata minn angolu differenti.
Twaqqif ta' ambjent tat-test
L-ewwel kompitu huwa li tuża ambjent tat-test. Passi meħtieġa biex jitħaddem mikroservizz:
- Ikkonfigura s-servizz taħt test għall-ambjent lokali, speċifika d-dettalji għall-konnessjoni mad-database u AWS fil-varjabbli ambjentali;
- Ibda Postgres u wettaq il-migrazzjoni billi tħaddem Liquibase.
F'DBMSs relazzjonali, qabel ma tikteb data fid-database, għandek bżonn toħloq skema tad-data, fi kliem ieħor, tabelli. Meta tiġi aġġornata applikazzjoni, it-tabelli għandhom jinġiebu fil-forma użata mill-verżjoni l-ġdida, u, preferibbilment, mingħajr ma tintilef id-dejta. Din tissejjaħ migrazzjoni. Il-ħolqien ta' tabelli f'database inizjalment vojta huwa każ speċjali ta' migrazzjoni. Il-migrazzjoni tista' tinbena fl-applikazzjoni nnifisha. Kemm .NET kif ukoll NodeJS għandhom oqfsa ta 'migrazzjoni. Fil-każ tagħna, għal raġunijiet ta 'sigurtà, il-mikroservizzi huma mċaħħda mid-dritt li jibdlu l-iskema tad-dejta, u l-migrazzjoni titwettaq bl-użu ta' Liquibase. - Tnedija Amazon LocalStack. Din hija implimentazzjoni tas-servizzi tal-AWS biex titħaddem id-dar. Hemm immaġni lesta għal LocalStack fuq Docker Hub.
- Mexxi l-iskript biex toħloq l-entitajiet meħtieġa f'LocalStack. L-iskripts Shell jużaw l-AWS CLI.
Użat għall-ittestjar fuq il-proġett
Kif jaħdem it-test awtomatiku?
Matul it-test, kollox jaħdem f'Docker: is-servizz taħt test, Postgres, l-għodda tal-migrazzjoni, u Postman, jew aħjar il-verżjoni tal-console tiegħu - Newman.
Docker issolvi għadd ta' problemi:
- Indipendenza mill-konfigurazzjoni ospitanti;
- Installazzjoni tad-dipendenzi: Docker tniżżel immaġini minn Docker Hub;
- Ir-ritorn tas-sistema għall-istat oriġinali tagħha: sempliċiment tneħħi l-kontenituri.
Docker-jikkomponi jgħaqqad kontenituri f'netwerk virtwali, iżolat mill-Internet, li fih il-kontenituri jsibu lil xulxin bl-ismijiet tad-dominju.
It-test huwa kkontrollat minn script shell. Biex tmexxi t-test fuq il-Windows nużaw git-bash. Għalhekk, skript wieħed huwa biżżejjed kemm għall-Windows kif ukoll għall-Linux. Git u Docker huma installati mill-iżviluppaturi kollha fuq il-proġett. Meta tinstalla Git fuq Windows, git-bash huwa installat, għalhekk kulħadd għandu dan ukoll.
L-iskrittura twettaq il-passi li ġejjin:
- Stampi tal-bini tad-docker
docker-compose build
- Tnedija tad-database u LocalStack
docker-compose up -d <контейнер>
- Migrazzjoni tad-database u preparazzjoni ta' LocalStack
docker-compose run <контейнер>
- Tnedija tas-servizz taħt test
docker-compose up -d <сервис>
- Tmexxi t-test (Newman)
- Twaqqaf il-kontenituri kollha
docker-compose down
- Ir-riżultati tal-istazzjonar fi Slack
Għandna chat fejn imorru messaġġi b'marka ħadra jew salib ħamra u link għall-log.
L-immaġini Docker li ġejjin huma involuti f'dawn il-passi:
- Is-servizz li qed jiġi ttestjat huwa l-istess immaġni bħall-produzzjoni. Il-konfigurazzjoni għat-test hija permezz ta 'varjabbli ambjentali.
- Għal Postgres, Redis u LocalStack, jintużaw immaġini lesti minn Docker Hub. Hemm ukoll immaġini lesti għal Liquibase u Newman. Aħna nibnu tagħna fuq l-iskeletru tagħhom, inżidu l-fajls tagħna hemmhekk.
- Biex tipprepara LocalStack, tuża immaġni AWS CLI lesta u toħloq immaġni li jkun fiha skript ibbażat fuqha.
Bl-użu
Problemi li tista’ tiltaqa’ magħhom
Stennija għall-prontezza
Meta kontejner b'servizz ikun qed jaħdem, dan ma jfissirx li huwa lest li jaċċetta konnessjonijiet. Trid tistenna li l-konnessjoni tkompli.
Din il-problema xi drabi tissolva bl-użu ta 'kitba
deċiżjoni: skripts ta' forniment ta' LocalStack li jistennew rispons ta' 200 kemm minn SQS kif ukoll minn SNS.
Kunflitti ta' Kompiti Parallel
Testijiet multipli jistgħu jaħdmu simultanjament fuq l-istess host Docker, għalhekk l-ismijiet tal-kontenituri u tan-netwerks għandhom ikunu uniċi. Barra minn hekk, it-testijiet minn fergħat differenti tal-istess servizz jistgħu wkoll isiru simultanjament, għalhekk mhux biżżejjed li tikteb isimhom f'kull fajl ta 'komponiment.
deċiżjoni: L-iskritt jistabbilixxi l-varjabbli COMPOSE_PROJECT_NAME għal valur uniku.
Karatteristiċi tal-Windows
Hemm numru ta 'affarijiet li rrid nirrimarka meta nuża Docker fuq il-Windows, peress li dawn l-esperjenzi huma importanti biex nifhmu għaliex iseħħu żbalji.
- L-iskripts tal-shell f'kontenitur għandu jkollhom truf tal-linja Linux.
Is-simbolu CR tal-qoxra huwa żball ta' sintassi. Huwa diffiċli li tgħid mill-messaġġ ta 'żball li dan huwa l-każ. Meta teditja skripts bħal dawn fuq il-Windows, għandek bżonn editur tat-test xieraq. Barra minn hekk, is-sistema ta 'kontroll tal-verżjoni għandha tkun ikkonfigurata kif suppost.
Dan huwa kif git huwa kkonfigurat:
git config core.autocrlf input
- Git-bash jimita folders standard tal-Linux u, meta jsejjaħ fajl exe (inkluż docker.exe), jissostitwixxi mogħdijiet Linux assoluti b'mogħdijiet Windows. Madankollu, dan ma jagħmilx sens għal mogħdijiet mhux fuq il-magna lokali (jew mogħdijiet f'kontenitur). Din l-imġieba ma tistax tiġi diżattivata.
deċiżjoni: żid slash addizzjonali fil-bidu tat-triq: //bin minflok /bin. Linux jifhem mogħdijiet bħal dawn; għaliha, diversi slashes huma l-istess bħal waħda. Iżda git-bash ma jagħrafx mogħdijiet bħal dawn u ma jipprovax jikkonvertihom.
L-output tal-log
Meta nagħmel it-testijiet, nixtieq nara zkuk kemm minn Newman kif ukoll mis-servizz li jkunu qed jiġu ttestjati. Peress li l-avvenimenti ta 'dawn ir-zkuk huma interkonnessi, li tgħaqqadhom f'console waħda hija ħafna aktar konvenjenti minn żewġ fajls separati. Newman tniedi permezz docker-compose run, u għalhekk l-output tiegħu jispiċċa fil-console. Li jibqa 'huwa li jiġi żgurat li l-output tas-servizz imur hemm ukoll.
Is-soluzzjoni oriġinali kienet li tagħmel docker-jikkomponu ebda bandiera -d, iżda billi tuża l-kapaċitajiet tal-qoxra, ibgħat dan il-proċess fl-isfond:
docker-compose up <service> &
Dan ħadem sakemm kien meħtieġ li jintbagħtu zkuk minn Docker lil servizz ta 'parti terza. docker-jikkomponu waqaf joħroġ zkuk fuq il-console. Madankollu, it-tim ħadem docker ehmeż.
deċiżjoni:
docker attach --no-stdin ${COMPOSE_PROJECT_NAME}_<сервис>_1 &
Konflitt tal-identifikatur waqt iterazzjonijiet tat-test
It-testijiet isiru f'diversi iterazzjonijiet. Id-database mhix ikklerjata. Ir-rekords fid-database għandhom IDs uniċi. Jekk niktbu IDs speċifiċi fit-talbiet, se jkollna kunflitt fit-tieni iterazzjoni.
Biex jiġi evitat, jew l-IDs għandhom ikunu uniċi, jew l-oġġetti kollha maħluqa mit-test għandhom jitħassru. Xi oġġetti ma jistgħux jitħassru minħabba rekwiżiti.
deċiżjoni: iġġenera GUIDs bl-użu ta' skripts ta' Postman.
var uuid = require('uuid');
var myid = uuid.v4();
pm.environment.set('myUUID', myid);
Imbagħad uża s-simbolu fil-mistoqsija {{myUUID}}, li se jiġi sostitwit bil-valur tal-varjabbli.
Kollaborazzjoni permezz ta' LocalStack
Jekk is-servizz li qed jiġi ttestjat jaqra jew jikteb fi kju SQS, allura biex jivverifika dan, it-test innifsu jrid jaħdem ukoll ma 'dan il-kju.
deċiżjoni: talbiet minn Postman għal LocalStack.
L-API tas-servizzi tal-AWS hija dokumentata, li tippermetti li jsiru mistoqsijiet mingħajr SDK.
Jekk servizz jikteb fil-kju, allura naqrawha u niċċekkjaw il-kontenut tal-messaġġ.
Jekk is-servizz jibgħat messaġġi lil SNS, fl-istadju tal-preparazzjoni LocalStack joħloq ukoll kju u jissottoskrivi għal dan is-suġġett SNS. Imbagħad kollox nieżel għal dak li kien deskritt hawn fuq.
Jekk is-servizz jeħtieġ jaqra messaġġ mill-kju, allura fil-pass tat-test preċedenti niktbu dan il-messaġġ fil-kju.
Ittestjar ta' talbiet HTTP li joriġinaw mill-mikroservizz li qed jiġi ttestjat
Xi servizzi jaħdmu fuq HTTP ma 'xi ħaġa oħra għajr AWS, u xi karatteristiċi AWS mhumiex implimentati f'LocalStack.
deċiżjoni: f'dawn il-każijiet jista' jgħin
Ittestjar tal-Awtentikazzjoni u l-Awtorizzazzjoni OAuth
Aħna nużaw OAuth u
L-interazzjoni kollha bejn is-servizz u l-fornitur OAuth tinżel għal żewġ talbiet: l-ewwel, il-konfigurazzjoni hija mitluba /.magħruf/openid-configuration, u mbagħad iċ-ċavetta pubblika (JWKS) hija mitluba fl-indirizz mill-konfigurazzjoni. Dan kollu huwa kontenut statiku.
deċiżjoni: Il-fornitur OAuth tat-test tagħna huwa server tal-kontenut statiku u żewġ fajls fuqu. It-token jiġi ġġenerat darba u impenjat għal Git.
Karatteristiċi tal-ittestjar SignalR
Postman ma jaħdimx mal-websockets. Inħolqot għodda speċjali biex tittestja SignalR.
Klijent SignalR jista 'jkun aktar minn sempliċi browser. Hemm librerija klijent għaliha taħt .NET Core. Il-klijent, miktub f'.NET Core, jistabbilixxi konnessjoni, jiġi awtentikat, u jistenna sekwenza speċifika ta' messaġġi. Jekk jiġi riċevut messaġġ mhux mistenni jew il-konnessjoni tintilef, il-klijent joħroġ b'kodiċi ta '1. Jekk jasal l-aħħar messaġġ mistenni, il-klijent joħroġ b'kodiċi ta' 0.
Newman jaħdem fl-istess ħin mal-klijent. Diversi klijenti huma mnedija biex jiċċekkjaw li l-messaġġi jitwasslu lil kull min għandu bżonnhom.
Biex tmexxi klijenti multipli uża l-għażla --skala fuq il-linja tal-kmand docker-compose.
Qabel ma jibda jaħdem, l-iskript ta' Postman jistenna li l-klijenti kollha jistabbilixxu konnessjonijiet.
Diġà ltqajna mal-problema li nistennew konnessjoni. Iżda kien hemm servers, u hawn huwa l-klijent. Huwa meħtieġ approċċ differenti.
deċiżjoni: il-klijent fil-kontenitur juża l-mekkaniżmu
HEALTHCHECK --interval=3s CMD if [ ! -e /healthcheck ]; then false; fi
Team docker jispezzjona Juri l-istatus normali, l-istat tas-saħħa u l-kodiċi tal-ħruġ għall-kontenitur.
Wara li Newman jitlesta, l-iskrittura jiċċekkja li l-kontenituri kollha mal-klijent ikunu tterminaw, bil-kodiċi 0.
Happinnes jeżisti
Wara li għelbu d-diffikultajiet deskritti hawn fuq, kellna sett ta 'testijiet ta' ġiri stabbli. Fit-testijiet, kull servizz jaħdem bħala unità waħda, interazzjoni mad-database u Amazon LocalStack.
Dawn it-testijiet jipproteġu tim ta’ aktar minn 30 żviluppatur minn żbalji f’applikazzjoni b’interazzjoni kumplessa ta’ 10+ mikroservizzi bi skjeramenti frekwenti.
Sors: www.habr.com