ProHoster > Blog > Pangangasiwa > GitLab Shell Runner. Competitive na paglulunsad ng mga nasubok na serbisyo gamit ang Docker Compose
GitLab Shell Runner. Competitive na paglulunsad ng mga nasubok na serbisyo gamit ang Docker Compose
Magiging interesado ang artikulong ito sa parehong mga tester at developer, ngunit pangunahing inilaan para sa mga espesyalista sa automation na nahaharap sa problema sa pag-set up ng GitLab CI/CD para sa integration testing sa mga kondisyon ng hindi sapat na mapagkukunan ng imprastraktura at/o ang kawalan ng container platform ng orkestra. Sasabihin ko sa iyo kung paano i-set up ang deployment ng mga environment ng pagsubok gamit ang docker compose sa isang solong GitLab shell runner at para kapag nagde-deploy ng ilang environment, ang mga inilunsad na serbisyo ay hindi makagambala sa isa't isa.
Sa aking pagsasanay, madalas na nangyari na ang pagsubok sa pagsasama ay "ginagamot" sa mga proyekto. At madalas ang una at pinakamahalagang problema ay ang CI pipeline, kung saan ang integration testing Ginagawa pa lamang (mga) serbisyo ay isinasagawa sa isang dev/stage environment. Nagdulot ito ng kaunting problema:
Dahil sa mga depekto sa isang partikular na serbisyo sa panahon ng integration testing, ang test circuit ay maaaring masira ng sirang data. May mga kaso kapag ang pagpapadala ng kahilingan na may sirang JSON na format ay nag-crash sa serbisyo, na naging ganap na hindi nagagamit ang stand.
Paghina ng test circuit habang tumataas ang data ng pagsubok. Sa tingin ko ay walang saysay na ilarawan ang isang halimbawa sa paglilinis/pag-roll back ng database. Sa aking pagsasanay, hindi ako nakatagpo ng isang proyekto kung saan naging maayos ang pamamaraang ito.
Panganib na maabala ang functionality ng test circuit kapag sinusubukan ang mga pangkalahatang setting ng system. Halimbawa, patakaran ng user/grupo/password/application.
Ang data ng pagsubok mula sa mga awtomatikong pagsubok ay nagpapahirap sa buhay para sa mga manu-manong tester.
Ang ilan ay magsasabi na ang magagandang autotest ay dapat linisin ang data pagkatapos ng kanilang sarili. Mayroon akong mga argumento laban sa:
Ang mga dynamic na stand ay napaka-maginhawang gamitin.
Hindi lahat ng bagay ay maaaring alisin sa system sa pamamagitan ng API. Halimbawa, ang isang tawag upang tanggalin ang isang bagay ay hindi ipinatupad dahil sumasalungat ito sa lohika ng negosyo.
Kapag lumilikha ng isang bagay sa pamamagitan ng API, isang malaking halaga ng metadata ang maaaring malikha, na may problemang tanggalin.
Kung ang mga pagsubok ay may mga dependency sa kanilang mga sarili, kung gayon ang proseso ng paglilinis ng data pagkatapos magpatakbo ng mga pagsubok ay nagiging sakit ng ulo.
Karagdagang (at, sa palagay ko, hindi makatwiran) na mga tawag sa API.
At ang pangunahing argumento: kapag ang data ng pagsubok ay nagsimulang i-clear nang direkta mula sa database. Ito ay nagiging isang tunay na PK/FK circus! Naririnig namin mula sa mga developer: "Kakadagdag ko lang/tinanggal/pinalitan ang pangalan ng isang sign, bakit 100500 integration test ang nahuli?"
Sa palagay ko, ang pinakamainam na solusyon ay isang pabago-bagong kapaligiran.
Maraming tao ang gumagamit ng docker-compose upang magpatakbo ng isang pagsubok na kapaligiran, ngunit kakaunti ang gumagamit ng docker-compose kapag nagsasagawa ng integration testing sa CI/CD. At dito hindi ko isinasaalang-alang ang mga kubernetes, swarm at iba pang mga platform ng orkestrasyon ng lalagyan. Hindi lahat ng kumpanya ay mayroon nito. Mas maganda kung ang docker-compose.yml ay unibersal.
Kahit na mayroon tayong sariling QA runner, paano natin matitiyak na ang mga serbisyong inilunsad sa pamamagitan ng docker-compose ay hindi makakasagabal sa isa't isa?
Paano mangolekta ng mga log ng mga nasubok na serbisyo?
Paano linisin ang runner?
Mayroon akong sariling GitLab runner para sa aking mga proyekto at nakatagpo ako ng mga tanong na ito sa panahon ng pag-unlad Java client para sa TestRail. Mas tiyak, kapag nagpapatakbo ng mga pagsubok sa pagsasama. Sa ibaba ay malulutas namin ang mga isyung ito gamit ang mga halimbawa mula sa proyektong ito.
Para sa isang runner, inirerekomenda ko ang isang Linux virtual machine na may 4 vCPU, 4 GB RAM, 50 GB HDD.
Mayroong maraming impormasyon sa pag-set up ng gitlab-runner sa Internet, kaya sa madaling sabi:
Mag-login sa makina sa pamamagitan ng SSH
Kung mayroon kang mas mababa sa 8 GB ng RAM, inirerekumenda ko gumawa ng swap 10 GBpara hindi dumating ang OOM killer at patayin ang ating mga gawain dahil sa kakulangan ng RAM. Maaaring mangyari ito kapag higit sa 5 gawain ang sabay-sabay na inilunsad. Ang mga gawain ay uunlad nang mas mabagal, ngunit tuluy-tuloy.
Halimbawa sa OOM killer
Kung nakikita mo sa mga tala ng gawain bash: line 82: 26474 Killed, tapos i-execute lang sa runner 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
At kung ganito ang hitsura ng larawan, pagkatapos ay magdagdag ng swap o magdagdag ng RAM.
Papayagan ka nitong magpatakbo ng mga parallel na gawain sa isang runner. Magbasa pa dito.
Kung mayroon kang mas malakas na makina, halimbawa 8 vCPU, 16 GB RAM, ang mga numerong ito ay maaaring gawin nang hindi bababa sa 2 beses na mas malaki. Ngunit ang lahat ay nakasalalay sa kung ano ang eksaktong ilulunsad sa runner na ito at sa kung anong dami.
Ang pangunahing gawain ay isang unibersal na docker-compose.yml, na magagamit ng mga developer/tester sa lokal at sa CI pipeline.
Una sa lahat, gumagawa kami ng mga natatanging pangalan ng serbisyo para sa CI. Ang isa sa mga natatanging variable sa GitLab CI ay ang variable CI_JOB_ID. Kung tinukoy mo container_name may kahulugan "service-${CI_JOB_ID:-local}", pagkatapos ay sa kaso:
kung CI_JOB_ID hindi tinukoy sa mga variable ng kapaligiran,
pagkatapos ay ang pangalan ng serbisyo ay magiging service-local
kung CI_JOB_ID tinukoy sa mga variable ng kapaligiran (halimbawa 123),
pagkatapos ay ang pangalan ng serbisyo ay magiging service-123
Pangalawa, lumikha kami ng isang karaniwang network para sa mga inilunsad na serbisyo. Nagbibigay ito sa amin ng paghihiwalay sa antas ng network kapag nagpapatakbo ng maraming kapaligiran ng pagsubok.
Bilang resulta ng pagpapatakbo ng naturang gawain, ang direktoryo ng mga log sa mga artifact ay maglalaman ng mga log ng serbisyo at pagsubok. Na kung saan ay napaka-maginhawa sa kaso ng mga error. Ang bawat pagsubok na magkatulad ay nagsusulat ng sarili nitong log, ngunit pag-uusapan ko ito nang hiwalay.
$ 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
Matagumpay na natapos ang lahat ng gawain
Ang mga artifact ng gawain ay naglalaman ng mga log ng serbisyo at pagsubok
Ang lahat ay tila maganda, ngunit mayroong isang nuance. Maaaring puwersahang kanselahin ang pipeline habang tumatakbo ang mga integration test, kung saan ang mga tumatakbong container ay hindi ititigil. Paminsan-minsan kailangan mong linisin ang runner. Sa kasamaang palad, ang gawain para sa pagpapabuti sa GitLab CE ay nasa status pa rin Pagbubukas
Ngunit idinagdag namin ang paglulunsad ng isang gawain ayon sa isang iskedyul, at walang sinuman ang nagbabawal sa amin na patakbuhin ito nang manu-mano.
Pumunta sa aming proyekto -> CI/CD -> Mga Iskedyul at patakbuhin ang gawain Clean runner
Kabuuan:
Mayroon kaming isang shell runner.
Walang mga salungatan sa pagitan ng mga gawain at kapaligiran.
Nagpapatakbo kami ng mga gawain na may mga pagsubok sa pagsasama nang magkatulad.
Maaari kang magpatakbo ng mga pagsubok sa pagsasama nang lokal o sa isang lalagyan.
Ang mga log ng serbisyo at pagsubok ay kinokolekta at ikinakabit sa gawain ng pipeline.
Posibleng linisin ang runner mula sa mga lumang larawan ng Docker.
Ang oras ng pag-setup ay ~2 oras.
Iyon lang, actually. Ikatutuwa kong makatanggap ng feedback.