ProHoster > blog > Utawala > Mkimbiaji wa Shell ya GitLab. Uzinduzi wa ushindani wa huduma zilizojaribiwa kwa kutumia Docker Compose
Mkimbiaji wa Shell ya GitLab. Uzinduzi wa ushindani wa huduma zilizojaribiwa kwa kutumia Docker Compose
Nakala hii itakuwa ya kupendeza kwa wajaribu na watengenezaji, lakini imekusudiwa haswa wataalam wa kiotomatiki ambao wanakabiliwa na shida ya kusanidi GitLab CI/CD kwa majaribio ya ujumuishaji katika hali ya ukosefu wa rasilimali za miundombinu na / au kutokuwepo kwa kontena. jukwaa la orchestration. Nitakuambia jinsi ya kusanidi upelekaji wa mazingira ya majaribio kwa kutumia docker kutunga kwenye kiendesha ganda moja cha GitLab na ili wakati wa kupeleka mazingira kadhaa, huduma zilizozinduliwa zisiingiliane.
Katika mazoezi yangu, mara nyingi ilitokea kwamba upimaji wa ushirikiano "ulitibiwa" kwenye miradi. Na mara nyingi shida ya kwanza na muhimu zaidi ni bomba la CI, ambalo upimaji wa ujumuishaji kuendelezwa huduma inafanywa katika mazingira ya dev/hatua. Hii ilisababisha shida kadhaa:
Kwa sababu ya kasoro katika huduma fulani wakati wa majaribio ya ujumuishaji, mzunguko wa jaribio unaweza kuharibiwa na data iliyovunjika. Kulikuwa na matukio wakati kutuma ombi kwa umbizo lililovunjika la JSON kuliharibu huduma, jambo ambalo lilifanya stendi hiyo isifanye kazi kabisa.
Kupungua kwa mzunguko wa jaribio data ya jaribio inapoongezeka. Nadhani haina mantiki kuelezea mfano na kusafisha / kurudisha hifadhidata. Katika mazoezi yangu, sijakutana na mradi ambapo utaratibu huu ulikwenda vizuri.
Hatari ya kutatiza utendakazi wa mzunguko wa majaribio wakati wa kupima mipangilio ya mfumo wa jumla. Kwa mfano, sera ya mtumiaji/kikundi/nenosiri/maombi.
Data ya majaribio kutoka kwa majaribio ya kiotomatiki hufanya maisha kuwa magumu kwa wanaojaribu wenyewe.
Wengine watasema kwamba ukaguzi mzuri wa kiotomatiki unapaswa kusafisha data baada yao wenyewe. Nina hoja dhidi ya:
Stendi zinazobadilika ni rahisi sana kutumia.
Sio kila kitu kinaweza kuondolewa kutoka kwa mfumo kupitia API. Kwa mfano, simu ya kufuta kitu haikutekelezwa kwa sababu inakinzana na mantiki ya biashara.
Wakati wa kuunda kitu kupitia API, kiasi kikubwa cha metadata kinaweza kuundwa, ambacho ni shida kufuta.
Ikiwa vipimo vina utegemezi kati yao wenyewe, basi mchakato wa kusafisha data baada ya kukimbia vipimo hugeuka kuwa maumivu ya kichwa.
Ziada (na, kwa maoni yangu, sio haki) simu kwa API.
Na hoja kuu: wakati data ya mtihani inapoanza kufutwa moja kwa moja kutoka kwa hifadhidata. Hii inageuka kuwa sarakasi halisi ya PK/FK! Tunasikia kutoka kwa wasanidi programu: "Nimeongeza/kuondoa/kubadilisha ishara, kwa nini majaribio 100500 ya ujumuishaji yalipatikana?"
Kwa maoni yangu, suluhisho bora zaidi ni mazingira yenye nguvu.
Watu wengi hutumia docker-compose kuendesha mazingira ya majaribio, lakini watu wachache hutumia docker-compose wanapofanya majaribio ya ujumuishaji katika CI/CD. Na hapa sizingatii kubernetes, pumba na majukwaa mengine ya okestration ya vyombo. Sio kila kampuni inayo. Ingekuwa nzuri ikiwa docker-compose.yml itakuwa ya ulimwengu wote.
Hata kama tuna kiendeshaji chetu cha QA, tunawezaje kuhakikisha kuwa huduma zinazozinduliwa kupitia docker-compose haziingiliani?
Jinsi ya kukusanya kumbukumbu za huduma zilizojaribiwa?
Jinsi ya kusafisha mkimbiaji?
Nina mkimbiaji wangu wa GitLab kwa miradi yangu na nilikutana na maswali haya wakati wa ukuzaji Mteja wa Java kwa TestRail. Kwa usahihi, wakati wa kufanya majaribio ya ujumuishaji. Hapo chini tutasuluhisha maswala haya kwa kutumia mifano kutoka kwa mradi huu.
Kwa mkimbiaji, ninapendekeza mashine ya Linux virtual na 4 vCPU, 4 GB RAM, 50 GB HDD.
Kuna habari nyingi juu ya kusanidi gitlab-runner kwenye Mtandao, kwa ufupi:
Ingia kwa mashine kupitia SSH
Ikiwa una chini ya 8 GB ya RAM, basi ninapendekeza badilisha 10 GBili muuaji wa OOM asije kuua kazi zetu kwa sababu ya ukosefu wa RAM. Hii inaweza kutokea wakati zaidi ya kazi 5 zinazinduliwa kwa wakati mmoja. Kazi zitaendelea polepole zaidi, lakini polepole.
Mfano na muuaji wa OOM
Ikiwa utaona kwenye kumbukumbu za kazi bash: line 82: 26474 Killed, kisha utekeleze tu kwenye mkimbiaji 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
Na ikiwa picha inaonekana kama hii, basi ama ongeza ubadilishaji au ongeza RAM.
Hii itakuruhusu kuendesha kazi sambamba kwenye mkimbiaji mmoja. Soma zaidi hapa.
Ikiwa una mashine yenye nguvu zaidi, kwa mfano 8 vCPU, 16 GB RAM, basi nambari hizi zinaweza kufanywa angalau mara 2 kubwa. Lakini yote inategemea ni nini hasa kitazinduliwa kwa mkimbiaji huyu na kwa kiasi gani.
Kazi kuu ni universal docker-compose.yml, ambayo wasanidi programu/wajaribu wanaweza kutumia ndani na katika bomba la CI.
Kwanza kabisa, tunatengeneza majina ya kipekee ya huduma kwa CI. Mojawapo ya anuwai ya kipekee katika GitLab CI ni kutofautisha CI_JOB_ID. Ukibainisha container_name yenye maana "service-${CI_JOB_ID:-local}", basi katika kesi:
ikiwa CI_JOB_ID haijafafanuliwa katika anuwai za mazingira,
basi jina la huduma litakuwa service-local
ikiwa CI_JOB_ID hufafanuliwa katika anuwai za mazingira (kwa mfano 123),
basi jina la huduma litakuwa service-123
Pili, tunaunda mtandao wa kawaida kwa huduma zilizozinduliwa. Hii inatupa kutengwa kwa kiwango cha mtandao tunapoendesha mazingira mengi ya majaribio.
Kama matokeo ya kuendesha kazi kama hiyo, saraka ya kumbukumbu kwenye mabaki itakuwa na kumbukumbu za huduma na majaribio. Ambayo ni rahisi sana katika kesi ya makosa. Kila mtihani kwa sambamba huandika logi yake mwenyewe, lakini nitazungumza juu ya hili tofauti.
$ 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
Majukumu yote yamekamilika kwa mafanikio
Vizalia vya programu vya kazi vina huduma na kumbukumbu za majaribio
Kila kitu kinaonekana kuwa nzuri, lakini kuna nuance. Bomba linaweza kughairiwa kwa nguvu wakati majaribio ya ujumuishaji yanaendelea, katika hali ambayo vyombo vinavyoendesha havitasimamishwa. Mara kwa mara unahitaji kusafisha mkimbiaji. Kwa bahati mbaya, kazi ya uboreshaji katika GitLab CE bado iko katika hali Open
Lakini tumeongeza uzinduzi wa kazi kulingana na ratiba, na hakuna mtu anayetukataza kuiendesha kwa mikono.
Nenda kwa mradi wetu -> CI/CD -> Ratiba na uendeshe kazi hiyo Clean runner
Jumla:
Tunayo mkimbiaji mmoja wa ganda.
Hakuna migogoro kati ya kazi na mazingira.
Tunaendesha kazi na majaribio ya ujumuishaji kwa sambamba.
Unaweza kufanya majaribio ya ujumuishaji ndani au kwenye kontena.
Kumbukumbu za huduma na mtihani hukusanywa na kushikamana na kazi ya bomba.
Inawezekana kusafisha mkimbiaji kutoka kwa picha za zamani za Docker.
Wakati wa kuweka ni ~ masaa 2.
Hiyo ndiyo yote, kwa kweli. Nitafurahi kupokea maoni.