Tès otomatik mikwosèvis nan Docker pou entegrasyon kontinyèl

Nan pwojè ki gen rapò ak devlopman nan achitekti mikwosèvis, CI/CD deplase soti nan kategori a nan yon opòtinite bèl nan kategori a nan yon nesesite ijan. Tès otomatik se yon pati entegral nan entegrasyon kontinyèl, yon apwòch konpetan ki ka bay ekip la anpil aswè bèl ak fanmi ak zanmi. Sinon, pwojè a riske pa janm fini.

Li posib pou kouvri tout kòd mikwosèvis la ak tès inite yo ak mock objè, men sa sèlman pasyèlman rezoud pwoblèm nan epi kite anpil kesyon ak difikilte, espesyalman lè tès travay ak done. Kòm toujou, sa yo ki pi ijan yo teste konsistans done nan yon baz done relasyon, tès travay ak sèvis nwaj yo, ak fè sipozisyon kòrèk lè w ap ekri objè mock.

Tout bagay sa a ak yon ti kras plis ka rezoud lè w teste tout mikwosèvis la nan yon veso Docker. Yon avantaj san dout pou asire validite tès yo se ke menm imaj Docker ki antre nan pwodiksyon yo teste.

Otomatik apwòch sa a prezante yon kantite pwoblèm, solisyon an pral dekri anba a:

  • konfli nan travay paralèl nan menm lame a docker;
  • konfli idantifyan nan baz done a pandan iterasyon tès yo;
  • ap tann pou mikwosèvis yo dwe pare;
  • fusion ak pwodiksyon mòso bwa nan sistèm ekstèn;
  • teste demann HTTP sortan yo;
  • tès sit entènèt (lè l sèvi avèk SignalR);
  • tès OAuth otantifikasyon ak otorizasyon.

Atik sa a baze sou diskou mwen nan SECR 2019. Se konsa, pou moun ki twò parese pou li, Men yon anrejistreman diskou a.

Tès otomatik mikwosèvis nan Docker pou entegrasyon kontinyèl

Nan atik sa a mwen pral di w kouman pou itilize yon script pou kouri sèvis anba tès la, yon baz done ak sèvis Amazon AWS nan Docker, Lè sa a, tès sou Postman epi, apre yo fin ranpli, sispann epi efase resipyan yo kreye. Tès yo egzekite chak fwa kòd la chanje. Nan fason sa a, nou asire w ke chak vèsyon travay kòrèkteman ak baz done AWS ak sèvis yo.

Se menm script la kouri tou de pa devlopè yo tèt yo sou Desktop Windows yo ak pa sèvè Gitlab CI anba Linux.

Pou jistifye, entwodwi nouvo tès yo pa ta dwe mande enstalasyon an nan zouti adisyonèl swa sou òdinatè pwomotè a oswa sou sèvè a kote tès yo ap kouri sou yon komite. Docker rezoud pwoblèm sa a.

Tès la dwe kouri sou yon sèvè lokal pou rezon sa yo:

  • Rezo a pa janm konplètman serye. Nan mil demann, youn ka echwe;
    Nan ka sa a, tès otomatik la pa pral travay, travay la ap sispann, epi w ap oblije gade pou rezon ki fè yo nan mòso bwa yo;
  • Kèk sèvis twazyèm pati pa pèmèt demann twò souvan.

Anplis de sa, li endezirab pou itilize kanpe la paske:

  • Yon kanpe ka kase non sèlman pa move kòd kouri sou li, men tou pa done ke kòd ki kòrèk la pa ka trete;
  • Pa gen pwoblèm ki jan difisil nou eseye retounen tout chanjman ki fèt pa tès la pandan tès la li menm, yon bagay ka ale mal (otreman, poukisa tès la?).

Konsènan pwojè a ak òganizasyon pwosesis

Konpayi nou an devlope yon aplikasyon entènèt mikwosèvis ki kouri nan Docker nan nwaj Amazon AWS la. Tès inite yo te deja itilize sou pwojè a, men erè souvan te fèt ke tès inite yo pa t 'detekte. Li te nesesè yo teste yon mikwosèvis tout ansanm ak baz done a ak sèvis Amazon.

Pwojè a sèvi ak yon pwosesis entegrasyon kontinyèl estanda, ki gen ladan tès mikwosèvis la ak chak komite. Apre yo fin asiyen yon travay, pwomotè a fè chanjman nan mikwosèvis la, teste li manyèlman epi kouri tout tès otomatik ki disponib. Si sa nesesè, pwomotè a chanje tès yo. Si yo pa jwenn okenn pwoblèm, yo fè yon angajman nan branch nan pwoblèm sa a. Apre chak komèt, tès yo otomatikman kouri sou sèvè a. Fizyone nan yon branch komen ak lanse tès otomatik sou li rive apre yon revizyon siksè. Si tès yo sou branch pataje a pase, sèvis la otomatikman mete ajou nan anviwònman tès la sou Amazon Elastic Container Service (ban). Kanpe a nesesè pou tout devlopè ak tèsteur, epi li pa rekòmande pou kraze li. Testatè nan anviwònman sa a tcheke yon ranje oswa yon nouvo karakteristik lè yo fè tès manyèl yo.

Achitekti pwojè

Tès otomatik mikwosèvis nan Docker pou entegrasyon kontinyèl

Aplikasyon an konsiste de plis pase dis sèvis. Kèk ladan yo ekri nan .NET Core ak kèk nan NodeJs. Chak sèvis kouri nan yon veso Docker nan Amazon Elastic Container Service la. Chak gen pwòp baz done Postgres pa yo, ak kèk tou gen Redis. Pa gen baz done komen. Si plizyè sèvis bezwen menm done yo, lè sa a done sa yo, lè li chanje, yo transmèt nan chak nan sèvis sa yo atravè SNS (Sèvis Notifikasyon Senp) ak SQS (Amazon Simple Queue Service), epi sèvis yo sove yo nan pwòp baz done separe yo.

SQS ak SNS

SQS pèmèt ou mete mesaj nan yon keu epi li mesaj ki soti nan keu la lè l sèvi avèk pwotokòl HTTPS la.

Si plizyè sèvis li yon sèl keu, Lè sa a, chak mesaj rive sèlman nan youn nan yo. Sa a itil lè w ap kouri plizyè ka nan menm sèvis la pou distribye chay la ant yo.

Si ou vle ke chak mesaj yo dwe delivre nan plizyè sèvis, chak moun k ap resevwa yo dwe gen pwòp keu li yo, epi SNS yo bezwen kopi mesaj nan plizyè keu.

Nan SNS ou kreye yon sijè epi abònman nan li, pou egzanp, yon keu SQS. Ou ka voye mesaj sou sijè. Nan ka sa a, yo voye mesaj la nan chak keu ki abònman nan sijè sa a. SNS pa gen yon metòd pou li mesaj yo. Si pandan debogaj oswa tès ou bezwen chèche konnen ki sa yo voye bay SNS, ou ka kreye yon keu SQS, abònman li nan sijè a vle epi li keu la.

Tès otomatik mikwosèvis nan Docker pou entegrasyon kontinyèl

API Gateway

Pifò sèvis yo pa dirèkteman aksesib sou entènèt la. Aksè se atravè API Gateway, ki tcheke dwa aksè. Sa a se sèvis nou an tou, e gen tès pou li tou.

Notifikasyon an tan reyèl

Aplikasyon an itilize siyal Rpou montre itilizatè a notifikasyon an tan reyèl. Sa a se aplike nan sèvis la notifikasyon. Li aksesib dirèkteman nan Entènèt la epi li travay ak OAuth, paske li te tounen enposib pou konstwi sipò pou sipò Web nan Gateway, konpare ak entegre OAuth ak sèvis notifikasyon an.

Apwòch tès ki byen koni

Tès inite yo ranplase bagay tankou baz done a ak objè mok. Si yon mikwosèvis, pou egzanp, eseye kreye yon dosye nan yon tablo ak yon kle etranje, epi dosye a referans kle sa a pa egziste, Lè sa a, demann lan pa ka egzekite. Tès inite yo pa ka detekte sa.

В atik ki soti nan Microsoft Yo pwopoze yo sèvi ak yon baz done nan memwa epi aplike objè mock.

Baz done nan memwa se youn nan DBMS yo sipòte pa Entity Framework la. Li te kreye espesyalman pou tès. Done nan yon baz done sa yo estoke sèlman jiskaske pwosesis la lè l sèvi avèk li fini. Li pa mande pou kreye tab epi li pa tcheke entegrite done yo.

Mock objè modèl klas yo ap ranplase sèlman nan limit ke pwomotè tès la konprann ki jan li fonksyone.

Ki jan yo fè Postgres otomatikman kòmanse ak fè migrasyon lè w ap kouri yon tès pa espesifye nan atik Microsoft la. Solisyon mwen an fè sa epi, anplis, pa ajoute okenn kòd espesyalman pou tès nan mikwosèvis nan tèt li.

Ann ale nan solisyon an

Pandan pwosesis devlopman, li te vin klè ke tès inite yo pa t ase pou jwenn tout pwoblèm nan yon fason apwopriye, kidonk li te deside apwòch pwoblèm sa a nan yon ang diferan.

Mete kanpe yon anviwònman tès

Premye travay la se deplwaye yon anviwònman tès. Etap ki nesesè pou kouri yon mikwosèvis:

  • Konfigure sèvis la anba tès pou anviwònman lokal la, presize detay yo pou konekte ak baz done a ak AWS nan varyab anviwònman yo;
  • Kòmanse Postgres epi fè migrasyon an nan kouri Liquibase.
    Nan DBMS relasyon, anvan ou ekri done nan baz done a, ou bezwen kreye yon chema done, nan lòt mo, tab. Lè mete ajou yon aplikasyon, tab yo dwe pote nan fòm ki itilize pa nouvo vèsyon an, epi, de preferans, san yo pa pèdi done. Yo rele sa migrasyon. Kreye tab nan yon baz done okòmansman vid se yon ka espesyal nan migrasyon. Migrasyon ka bati nan aplikasyon an tèt li. Tou de .NET ak NodeJS gen kad migrasyon. Nan ka nou an, pou rezon sekirite, mikwosèvis yo prive de dwa pou chanje chema done yo, epi migrasyon an fèt lè l sèvi avèk Liquibase.
  • Lanse Amazon LocalStack. Sa a se yon aplikasyon sèvis AWS pou kouri lakay ou. Gen yon imaj ki pare pou LocalStack sou Docker Hub.
  • Kouri script la pou kreye antite ki nesesè yo nan LocalStack. Scripts Shell yo itilize AWS CLI.

Itilize pou fè tès sou pwojè a post-man. Li te egziste anvan, men li te lanse manyèlman epi li teste yon aplikasyon ki deja deplwaye nan kanpe la. Zouti sa a pèmèt ou fè demann HTTP(S) abitrè epi tcheke si repons yo matche ak atant. Rekèt yo konbine nan yon koleksyon, epi koleksyon an antye ka kouri.

Tès otomatik mikwosèvis nan Docker pou entegrasyon kontinyèl

Ki jan tès otomatik la ap travay?

Pandan tès la, tout bagay ap travay nan Docker: sèvis anba tès la, Postgres, zouti migrasyon an, ak Postman, oswa pito vèsyon konsole li yo - Newman.

Docker rezoud yon kantite pwoblèm:

  • Endepandans nan konfigirasyon lame;
  • Enstale depandans: Docker telechaje imaj soti nan Docker Hub;
  • Retounen sistèm nan nan eta orijinal li: tou senpleman retire resipyan yo.

Docker-konpoze ini kontenè nan yon rezo vityèl, izole nan entènèt la, nan ki resipyan jwenn youn ak lòt pa non domèn.

Tès la kontwole pa yon script koki. Pou kouri tès la sou Windows nou itilize git-bash. Kidonk, yon sèl script ase pou tou de Windows ak Linux. Git ak Docker yo enstale pa tout devlopè sou pwojè a. Lè w ap enstale Git sou Windows, git-bash enstale, kidonk tout moun gen sa tou.

Script la fè etap sa yo:

  • Bati imaj docker
    docker-compose build
  • Lanse baz done a ak LocalStack
    docker-compose up -d <контейнер>
  • Migrasyon baz done ak preparasyon nan LocalStack
    docker-compose run <контейнер>
  • Lanse sèvis la anba tès la
    docker-compose up -d <сервис>
  • Kouri tès la (Newman)
  • Sispann tout resipyan yo
    docker-compose down
  • Afiche rezilta nan Slack
    Nou gen yon chat kote mesaj ki gen yon mak vèt oswa yon kwa wouj ak yon lyen nan boutèy la ale.

Imaj Docker sa yo patisipe nan etap sa yo:

  • Sèvis y ap teste a se menm imaj ak pwodiksyon an. Konfigirasyon an pou tès la se atravè varyab anviwònman an.
  • Pou Postgres, Redis ak LocalStack, yo itilize imaj ki pare nan Docker Hub. Genyen tou imaj ki pare pou Liquibase ak Newman. Nou bati nou sou eskèlèt yo, ajoute dosye nou yo la.
  • Pou prepare LocalStack, ou itilize yon imaj AWS CLI ki pare epi kreye yon imaj ki gen yon script ki baze sou li.

Sèvi ak komèsan yo, ou pa bezwen bati yon imaj Docker jis pou ajoute dosye nan veso a. Sepandan, volim yo pa apwopriye pou anviwònman nou an paske travay Gitlab CI tèt yo kouri nan resipyan. Ou ka kontwole Docker soti nan yon veso konsa, men komèsan sèlman monte dosye ki soti nan sistèm lame a, epi yo pa soti nan yon lòt veso.

Pwoblèm ou ka rankontre

Ap tann pou preparasyon

Lè yon veso ki gen yon sèvis ap kouri, sa pa vle di ke li pare pou aksepte koneksyon. Ou dwe tann pou koneksyon an kontinye.

Pwoblèm sa a pafwa rezoud lè l sèvi avèk yon script tann-pou-li.sh, ki tann yon opòtinite pou etabli yon koneksyon TCP. Sepandan, LocalStack ka voye yon erè 502 Bad Gateway. Anplis de sa, li konsiste de anpil sèvis, epi si youn nan yo pare, sa a pa di anyen sou lòt yo.

desizyon: Scripts pwovizyon LocalStack ki tann yon repons 200 nan tou de SQS ak SNS.

Konfli travay paralèl

Tès miltip ka kouri an menm tan sou menm lame Docker, kidonk non veso ak rezo yo dwe inik. Anplis, tès ki soti nan diferan branch nan menm sèvis la ka kouri tou ansanm, kidonk li pa ase yo ekri non yo nan chak dosye konpoze.

desizyon: Script la mete varyab COMPOSE_PROJECT_NAME nan yon valè inik.

Karakteristik Windows

Gen yon kantite bagay mwen vle fè remake lè w ap itilize Docker sou Windows, paske eksperyans sa yo enpòtan pou konprann poukisa erè rive.

  1. Scripts Shell nan yon veso dwe gen tèminezon liy Linux.
    Senbòl CR koki a se yon erè sentaks. Li difisil pou di nan mesaj erè a ke sa a se ka a. Lè modifye scripts sa yo sou Windows, ou bezwen yon editè tèks apwopriye. Anplis de sa, sistèm kontwòl vèsyon an dwe configuré byen.

Men ki jan git konfigirasyon:

git config core.autocrlf input

  1. Git-bash imite dosye estanda Linux epi, lè w ap rele yon dosye ègzekutabl (ki gen ladan docker.exe), ranplase chemen Linux absoli ak chemen Windows. Sepandan, sa pa fè sans pou chemen ki pa sou machin lokal la (oswa chemen ki nan yon veso). Konpòtman sa a pa ka enfim.

desizyon: ajoute yon koupe anplis nan kòmansman chemen an: //bin olye pou yo /bin. Linux konprann chemen sa yo; pou li, plizyè koupe se menm bagay ak yon sèl. Men, git-bash pa rekonèt chemen sa yo epi li pa eseye konvèti yo.

Log pwodiksyon an

Lè w ap fè tès yo, mwen ta renmen wè mòso bwa ki soti nan tou de Newman ak sèvis yo te teste. Depi evènman yo nan mòso bwa sa yo konekte, konbine yo nan yon sèl konsole se pi plis pratik pase de dosye separe. Newman lanse via docker-compose kouri, e konsa pwodiksyon li fini nan konsole a. Tout sa ki rete se asire w ke pwodiksyon an nan sèvis la tou ale la.

Solisyon orijinal la te fè docker-konpoze moute pa gen drapo -d, men lè l sèvi avèk kapasite koki yo, voye pwosesis sa a nan background nan:

docker-compose up <service> &

Sa a te travay jiskaske li te nesesè yo voye mòso bwa soti nan Docker nan yon sèvis twazyèm pati. docker-konpoze moute sispann pwodiksyon mòso bwa nan konsole a. Sepandan, ekip la te travay Docker tache.

desizyon:

docker attach --no-stdin ${COMPOSE_PROJECT_NAME}_<сервис>_1 &

Konfli idantifyan pandan iterasyon tès yo

Tès yo kouri nan plizyè iterasyon. Baz done a pa netwaye. Dosye nan baz done a gen idantite inik. Si nou ekri ID espesifik nan demann, nou pral jwenn yon konfli nan dezyèm iterasyon an.

Pou evite li, swa ID yo dwe inik, oswa tout objè ki te kreye pa tès la dwe efase. Gen kèk objè ki pa ka efase akòz kondisyon.

desizyon: jenere GUID lè l sèvi avèk script Postman.

var uuid = require('uuid');
var myid = uuid.v4();
pm.environment.set('myUUID', myid);

Lè sa a, sèvi ak senbòl la nan rechèch la {{myUUID}}, ki pral ranplase ak valè varyab la.

Kolaborasyon atravè LocalStack

Si sèvis y ap teste a li oswa ekri nan yon keu SQS, Lè sa a, pou verifye sa a, tès la li menm dwe travay tou ak keu sa a.

desizyon: demann soti nan Postman bay LocalStack.

API sèvis AWS yo dokimante, sa ki pèmèt demann yo fèt san yon SDK.

Si yon sèvis ekri nan yon keu, Lè sa a, nou li li epi tcheke sa ki nan mesaj la.

Si sèvis la voye mesaj bay SNS, nan etap preparasyon an, LocalStack kreye tou yon keu epi abònman nan sijè SNS sa a. Lè sa a, tout vini desann nan sa ki te dekri pi wo a.

Si sèvis la bezwen li yon mesaj ki soti nan keu a, Lè sa a, nan etap tès anvan an nou ekri mesaj sa a nan keu la.

Tès demann HTTP ki soti nan mikwosèvis anba tès la

Gen kèk sèvis ki travay sou HTTP ak yon lòt bagay pase AWS, ak kèk karakteristik AWS yo pa aplike nan LocalStack.

desizyon: nan ka sa yo li ka ede MockServer, ki gen yon imaj ki pare nan Hub Docker. Demann yo espere ak repons pou yo se yon demann HTTP. API a dokimante, kidonk nou fè demann nan men Postman.

Tès OAuth Otantifikasyon ak Otorizasyon

Nou itilize OAuth ak JSON Web Tokens (JWT). Tès la mande pou yon founisè OAuth ke nou ka kouri lokalman.

Tout entèraksyon ant sèvis la ak founisè OAuth la se de demann: premye, yo mande konfigirasyon an. /.well-known/openid-configuration, ak Lè sa a, kle piblik la (JWKS) mande nan adrès ki soti nan konfigirasyon an. Tout bagay sa a se kontni estatik.

desizyon: Founisè tès OAuth nou an se yon sèvè kontni estatik ak de dosye sou li. Siy la pwodwi yon fwa epi li angaje nan Git.

Karakteristik nan tès SignalR

Postman pa travay ak websockets. Yo te kreye yon zouti espesyal pou teste SignalR.

Yon kliyan SignalR ka pi plis pase jis yon navigatè. Gen yon bibliyotèk kliyan pou li anba .NET Core. Kliyan an, ekri nan .NET Core, etabli yon koneksyon, otantifye, epi tann pou yon sekans espesifik nan mesaj. Si yo resevwa yon mesaj inatandi oswa koneksyon an pèdi, kliyan an sòti ak yon kòd 1. Si yo resevwa dènye mesaj espere a, kliyan an sòti ak yon kòd 0.

Newman travay ansanm ak kliyan an. Plizyè kliyan yo te lanse pou tcheke mesaj yo te delivwe pou tout moun ki bezwen yo.

Tès otomatik mikwosèvis nan Docker pou entegrasyon kontinyèl

Pou kouri plizyè kliyan itilize opsyon an --echèl sou liy lòd docker-compose.

Anvan kouri, script Postman la tann pou tout kliyan yo etabli koneksyon.
Nou te deja rankontre pwoblèm nan ap tann pou yon koneksyon. Men, te gen serveurs, ak isit la se kliyan an. Yon apwòch diferan nesesè.

desizyon: kliyan an nan veso a sèvi ak mekanis la HealthCheckpou enfòme script la sou lame a sou estati li yo. Kliyan an kreye yon dosye nan yon chemen espesifik, di /healthcheck, le pli vit ke koneksyon an etabli. Script HealthCheck nan fichye docker la sanble sa a:

HEALTHCHECK --interval=3s CMD if [ ! -e /healthcheck ]; then false; fi

Ekip docker enspekte Montre estati nòmal, eta sante ak kòd sòti pou veso a.

Apre Newman fini, script la tcheke tout resipyan ki gen kliyan an fini, ak kòd 0.

Happinnes egziste

Apre nou te simonte difikilte ki dekri pi wo a, nou te gen yon seri tès kouri ki estab. Nan tès yo, chak sèvis travay kòm yon sèl inite, kominike avèk baz done a ak Amazon LocalStack.

Tès sa yo pwoteje yon ekip plis pase 30 devlopè kont erè nan yon aplikasyon ak entèraksyon konplèks plis pase 10 mikwosèvis ak deplwaman souvan.

Sous: www.habr.com

Add nouvo kòmantè