ProHoster > Blog > Administrazioa > GitLab Shell Runner. Docker Compose-rekin proba-zerbitzuak lehiakor exekutatzen dira
GitLab Shell Runner. Docker Compose-rekin proba-zerbitzuak lehiakor exekutatzen dira
Artikulu hau probatzaileentzat zein garatzaileentzat interesgarria izango da, baina gehiago zuzenduta dago GitLab CI/CD integrazio-probak egiteko azpiegitura baliabide nahikorik ezaren aurrean eta/edo edukiontzi-orkestraziorik ezaren aurrean GitLab CI/CD konfiguratzeko arazoa duten automatikoentzat. plataforma. Docker compose erabiliz proba-inguruneen hedapena nola konfiguratu esango dizut GitLab shell runner bakarrean eta, horrela, hainbat ingurune zabaltzean, abiarazitako zerbitzuek elkarren artean oztopatu ez dezaten.
Nire praktikan, askotan proiektuetan integrazio-probak "tratatzea" gertatzen zen. Eta askotan lehen eta esanguratsuena CI kanalizazioa da, zeinetan integrazio probak egiten dituena garatu zerbitzua(k) garapen/etapa ingurunean dago. Horrek arazo dezente sortu zituen:
Integrazio-probetan zerbitzu batean edo bestean akatsen ondorioz, proba-zirkuitua hautsitako datuek hondatu dezakete. JSON formatua hautsitako eskaera bat bidaltzeak zerbitzua zintzilikatzeko kasuak izan ziren, eta horrek stand-a guztiz ez funtzionatzen zuen.
Proba-zirkuituaren moteltzea proba-datuen hazkundearekin. Uste dut ez duela zentzurik datu-basea garbitu / atzera botatzeko adibide bat deskribatzeak. Nire praktikan, ez dut ezagutu prozedura hau ondo joango zen proiekturik.
Sistemaren ezarpen orokorrak probatzean proba-zirkuituaren errendimendua eteteko arriskua. Adibidez, erabiltzailea/taldea/pasahitza/aplikazio-politika.
Autotesten probetako datuek bizitza zailtzen diete eskuzko probatzaileei.
Norbaitek esango du autotest onek datuak garbitu behar dituztela beren ondoren. Aurkako argudioak ditut:
Harmaila dinamikoak erabiltzeko oso erosoak dira.
Objektu guztiak ezin dira sistematik kendu APIaren bidez. Adibidez, objektu bat ezabatzeko deia ez da inplementatzen, negozioaren logikarekin kontraesanean dagoelako.
APIaren bidez objektu bat sortzean, kentzeko arazoak diren metadatu kopuru handi bat sor daiteke.
Probak elkarren menpekoak badira, probak egin ostean datuak garbitzeko prozesua buruhauste bihurtzen da.
APIrako dei osagarriak (eta, nire ustez, justifikatuak ez direnak).
Eta argudio nagusia: probako datuak datu-basetik zuzenean garbitzen hasten direnean. Hau benetako PK/FK zirku bat bihurtzen ari da! Garatzaileei entzuten diegu: "Gehitu/ezabatu/izendatu berri dut seinalea, zergatik erori ziren 100500 integrazio-proba?"
Nire ustez, irtenbiderik egokiena ingurune dinamikoa da.
Jende askok docker-compose erabiltzen du proba-ingurune bat exekutatzeko, baina jende gutxik erabiltzen du docker-compose CI/CD-n integrazio-probak egiterakoan. Eta hemen ez ditut kontuan hartzen kubernetak, swarm eta bestelako edukiontzien orkestrazio plataformak. Enpresa guztiek ez dituzte horiek. Polita litzateke docker-compose.yml unibertsala balitz.
Gure QA korrikalaria badugu ere, nola ziurtatu docker-compose bidez abiarazitako zerbitzuak elkarren artean oztopatzen ez dutela?
Nola bildu probatutako zerbitzuen erregistroak?
Nola garbitu korrikalaria?
Nire GitLab korrikalaria daukat nire proiektuetarako eta arazo hauekin topo egin nuen garatzen ari nintzen bitartean Java bezeroa egiteko probako erraila. Zehazkiago, integrazio-probak exekutatzen direnean. Hemen arazo hauek konpontzen jarraituko dugu proiektu honetako adibideekin.
Korrikalari batentzat, Linux makina birtual bat gomendatzen dut 4 vCPU, 4 GB RAM, 50 GB HDD dituena.
Interneten gitlab-runner konfiguratzeko informazio asko dago, beraz, laburbilduz:
SSH bidez makinara joaten gara
8 GB RAM baino gutxiago badituzu, gomendatzen dizut egin trukea 10 GBberaz, OOM hiltzailea ez dadin etorri eta zereginak hil ditzagun RAM faltagatik. Hau gerta daiteke 5 zeregin baino gehiago aldi berean exekutatzen ari direnean. Zereginak motelagoak izango dira, baina egonkorrak.
Adibidea OOM killer-ekin
Zereginen erregistroetan ikusten baduzu bash: line 82: 26474 Killed, gero exekutatu korrikalarian sudo dmesg | grep 26474
[26474] 1002 26474 1061935 123806 339 0 0 java
Out of memory: Kill process 26474 (java) score 127 or sacrifice child
Killed process 26474 (java) total-vm:4247740kB, anon-rss:495224kB, file-rss:0kB, shmem-rss:0kB
Eta irudiak horrelako zerbait badu, gehitu swap edo sartu RAM.
Honek zeregin paraleloak korrikalari berean egiteko aukera emango dizu. Irakurri gehiago Hemen.
Makina indartsuagoa baduzu, adibidez, 8 vCPU, 16 GB RAM, orduan zenbaki hauek gutxienez 2 aldiz handiagoak izan daitezke. Baina dena da korrikalari honetan zer abiaraziko den eta zer kantitatetan.
Zeregin nagusia docker-compose.yml unibertsala da, garatzaileek/probatzaileek lokalean zein CI kanalizazioan erabil dezaketena.
Lehenik eta behin, CI-rako zerbitzu-izen bereziak egiten ditugu. GitLab CI-ko aldagai berezietako bat aldagaia da CI_JOB_ID. Zehazten baduzu container_name esanahiarekin "service-${CI_JOB_ID:-local}", orduan kasuan:
bada CI_JOB_ID ingurune-aldagaietan definitu gabe,
orduan zerbitzuaren izena izango da service-local
bada CI_JOB_ID ingurune-aldagaietan definituta (adibidez, 123),
orduan zerbitzuaren izena izango da service-123
Bigarrenik, zerbitzuak martxan jartzeko sare komun bat egiten dugu. Horrek sare-mailako isolamendua ematen digu hainbat proba-ingurune exekutatzen ditugunean.
Zeregin hori exekutatzearen ondorioz, artefaktuen erregistroen direktorioak zerbitzuen eta proben erregistroak izango ditu. Oso erabilgarria da akatsen kasuan. Proba bakoitzak paraleloki bere erregistroa idazten du, baina honetaz aparte hitz egingo dut.
$ docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/gitlab-runner/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
$ export TR_HTTP_PORT=$(shuf -i10000-60000 -n1)
$ export TR_HTTPS_PORT=$(shuf -i10000-60000 -n1)
$ mkdir ${CI_JOB_ID}
$ cp .indirect/docker-compose.yml ${CI_JOB_ID}/docker-compose.yml
$ make docker-up
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml kill
docker network rm testrail-network-${CI_JOB_ID:-local} || true
Error: No such network: testrail-network-204645172
docker network create testrail-network-${CI_JOB_ID:-local}
0a59552b4464b8ab484de6ae5054f3d5752902910bacb0a7b5eca698766d0331
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml pull
Pulling web ... done
Pulling fpm ... done
Pulling migration ... done
Pulling db ... done
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
Creating volume "204645172_static-content" with default driver
Creating testrail-mysql-204645172 ...
Creating testrail-mysql-204645172 ... done
Creating testrail-migration-204645172 ... done
Creating testrail-fpm-204645172 ... done
Creating testrail-web-204645172 ... done
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6b76f9135ed registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofβ¦" 13 seconds ago Up 1 second 0.0.0.0:51148->80/tcp, 0.0.0.0:25426->443/tcp testrail-web-204645172
01d303262d8e registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiβ¦" 16 seconds ago Up 13 seconds 9000/tcp testrail-fpm-204645172
2cdab1edbf6a registry.gitlab.com/touchbit/image/testrail/migration:latest "docker-entrypoint.sβ¦" 16 seconds ago Up 13 seconds 3306/tcp, 33060/tcp testrail-migration-204645172
826aaf7c0a29 mysql:5.7.22 "docker-entrypoint.sβ¦" 18 seconds ago Up 16 seconds 3306/tcp testrail-mysql-204645172
6dbb3fae0322 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofβ¦" 36 seconds ago Up 22 seconds 0.0.0.0:44202->80/tcp, 0.0.0.0:20151->443/tcp testrail-web-204645084
3540f8d448ce registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiβ¦" 38 seconds ago Up 35 seconds 9000/tcp testrail-fpm-204645084
70fea72aa10d mysql:5.7.22 "docker-entrypoint.sβ¦" 40 seconds ago Up 37 seconds 3306/tcp testrail-mysql-204645084
d8aa24b2892d registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofβ¦" About a minute ago Up 53 seconds 0.0.0.0:31103->80/tcp, 0.0.0.0:43872->443/tcp testrail-web-204644881
6d4ccd910fad registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiβ¦" About a minute ago Up About a minute 9000/tcp testrail-fpm-204644881
685d8023a3ec mysql:5.7.22 "docker-entrypoint.sβ¦" About a minute ago Up About a minute 3306/tcp testrail-mysql-204644881
1cdfc692003a registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofβ¦" About a minute ago Up About a minute 0.0.0.0:44752->80/tcp, 0.0.0.0:23540->443/tcp testrail-web-204644793
6f26dfb2683e registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiβ¦" About a minute ago Up About a minute 9000/tcp testrail-fpm-204644793
029e16b26201 mysql:5.7.22 "docker-entrypoint.sβ¦" About a minute ago Up About a minute 3306/tcp testrail-mysql-204644793
c10443222ac6 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofβ¦" 5 hours ago Up 5 hours 0.0.0.0:57123->80/tcp, 0.0.0.0:31657->443/tcp testrail-web-204567103
04339229397e registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiβ¦" 5 hours ago Up 5 hours 9000/tcp testrail-fpm-204567103
6ae0accab28d mysql:5.7.22 "docker-entrypoint.sβ¦" 5 hours ago Up 5 hours 3306/tcp testrail-mysql-204567103
b66b60d79e43 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofβ¦" 5 hours ago Up 5 hours 0.0.0.0:56321->80/tcp, 0.0.0.0:58749->443/tcp testrail-web-204553690
033b1f46afa9 registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiβ¦" 5 hours ago Up 5 hours 9000/tcp testrail-fpm-204553690
a8879c5ef941 mysql:5.7.22 "docker-entrypoint.sβ¦" 5 hours ago Up 5 hours 3306/tcp testrail-mysql-204553690
069954ba6010 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofβ¦" 5 hours ago Up 5 hours 0.0.0.0:32869->80/tcp, 0.0.0.0:16066->443/tcp testrail-web-204553539
ed6b17d911a5 registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiβ¦" 5 hours ago Up 5 hours 9000/tcp testrail-fpm-204553539
1a1eed057ea0 mysql:5.7.22 "docker-entrypoint.sβ¦" 5 hours ago Up 5 hours 3306/tcp testrail-mysql-204553539
Zeregin guztiak behar bezala burutu dira
Zereginen artefaktuek zerbitzuen eta proben erregistroak dituzte
Dena ederra omen da, baina badago Γ±abardura bat. Hodibide bat indarrez bertan behera utzi daiteke integrazio-probak martxan dauden bitartean, eta kasu horretan, edukiontziak ez dira geldituko. Noizean behin korrikalaria garbitu behar duzu. Zoritxarrez, GitLab CE-n berrikusteko zeregina egoeran dago oraindik Ireki
Baina programatutako zereginen abiarazte bat gehitu dugu, eta inork ez digu eskuz abiaraztea debekatzen.
Joan gure proiektua -> CI/CD -> Ordutegiak eta exekutatu zeregina Clean runner
Guztira:
Maskor korrikalari bat dugu.
Ez dago zereginen eta ingurunearen arteko gatazkarik.
Integrazio testekin zereginen abiarazte paralelo bat dugu.
Integrazio probak exekutatu ditzakezu bai lokalean bai edukiontzi batean.
Zerbitzuen eta probaren erregistroak bildu eta kanalizazio-zereginari eransten zaizkio.
Posible da korrikalaria docker irudi zaharretatik garbitzea.
Konfigurazio-denbora ~ 2 ordu da.
Hori da, hain zuzen ere, dena. Pozik erantzungo dut.