ProHoster > blog > Amministrazzjoni > GitLab Shell Runner. Tnedija kompetittiva ta' servizzi ttestjati bl-użu ta' Docker Compose
GitLab Shell Runner. Tnedija kompetittiva ta' servizzi ttestjati bl-użu ta' Docker Compose
Dan l-artikolu se jkun ta’ interess kemm għal dawk li jittestjaw kif ukoll għall-iżviluppaturi, iżda huwa maħsub prinċipalment għal speċjalisti tal-awtomazzjoni li jiffaċċjaw il-problema tat-twaqqif ta’ GitLab CI/CD għall-ittestjar tal-integrazzjoni fil-kundizzjonijiet ta’ riżorsi infrastrutturali insuffiċjenti u/jew in-nuqqas ta’ kontenitur. pjattaforma tal-orkestrazzjoni. Jien ngħidlek kif twaqqaf l-iskjerament ta 'ambjenti tat-test bl-użu ta' docker compose fuq shell runner wieħed GitLab u sabiex meta jiġu skjerati diversi ambjenti, is-servizzi mnedija ma jinterferixxux ma 'xulxin.
Fil-prattika tiegħi, spiss ġara li l-ittestjar tal-integrazzjoni kien "trattat" fuq proġetti. U ħafna drabi l-ewwel u l-aktar problema sinifikanti hija l-pipeline tas-CI, li fiha l-ittestjar tal-integrazzjoni qed jiġu żviluppati servizz(i) jitwettaq f'ambjent dev/stage. Dan ikkawża pjuttost ftit problemi:
Minħabba difetti f'servizz partikolari matul il-proċess ta 'ttestjar ta' integrazzjoni, iċ-ċirkwit tat-test jista 'jkun bil-ħsara minn data miksura. Kien hemm każijiet meta ntbagħtet talba b'format JSON miksur ħabtet is-servizz, li wassal biex l-istand ma jitħaddem kompletament.
Tnaqqis taċ-ċirkwit tat-test hekk kif id-dejta tat-test tiżdied. Naħseb li ma jagħmilx sens li tiddeskrivi eżempju bit-tindif/rolling lura tad-database. Fil-prattika tiegħi, ma ltqajtx ma' proġett fejn din il-proċedura marret bla xkiel.
Hemm riskju li tfixkel il-funzjonalità taċ-ċirkwit tat-test meta jiġu ttestjati l-issettjar tas-sistema ġenerali. Per eżempju, utent/grupp/password/politika tal-applikazzjoni.
Id-dejta tat-test minn testijiet awtomatizzati tagħmel il-ħajja diffiċli għal dawk li jittestjaw manwali.
Xi wħud jgħidu li l-awtotests tajbin għandhom inaddfu d-dejta warajhom infushom. Għandi argumenti kontra:
Stands dinamiċi huma konvenjenti ħafna biex jintużaw.
Mhux kull oġġett jista' jitneħħa mis-sistema permezz tal-API. Pereżempju, sejħa biex jitħassar oġġett ma ġietx implimentata minħabba li tikkontradixxi l-loġika tan-negozju.
Meta jinħoloq oġġett permezz tal-API, jista 'jinħoloq ammont kbir ta' metadejta, li hija problematika biex titħassar.
Jekk it-testijiet ikollhom dipendenzi bejniethom, allura l-proċess tat-tindif tad-dejta wara t-twettiq tat-testijiet jinbidel f'uġigħ ta 'ras.
Sejħiet addizzjonali (u, fl-opinjoni tiegħi, mhux ġustifikati) lill-API.
U l-argument ewlieni: meta d-data tat-test tibda titneħħa direttament mid-database. Dan qed jinbidel f'ċirku PK/FK reali! Nisimgħu mingħand l-iżviluppaturi: "Għadni kif żidt/neħħejt/semmiet sinjal, għaliex inqabdu 100500 test ta' integrazzjoni?"
Fl-opinjoni tiegħi, l-aħjar soluzzjoni hija ambjent dinamiku.
Ħafna nies jużaw docker-compose biex imexxu ambjent tat-test, iżda ftit nies jużaw docker-compose meta jagħmlu ttestjar ta 'integrazzjoni f'CI/CD. U hawn mhux qed nikkunsidra kubernetes, swarm u pjattaformi oħra tal-orkestrazzjoni tal-kontejners. Mhux kull kumpanija għandha minnhom. Ikun sabiħ jekk docker-compose.yml kien universali.
Anke jekk għandna l-QA runner tagħna stess, kif nistgħu niżguraw li s-servizzi mnedija permezz ta’ docker-compose ma jinterferixxux ma’ xulxin?
Kif tiġbor zkuk tas-servizzi ttestjati?
Kif tnaddaf ir-runner?
Għandi l-GitLab runner tiegħi stess għall-proġetti tiegħi u ltqajt ma' dawn il-mistoqsijiet waqt l-iżvilupp Klijent Java għall- TestRail. B'mod aktar preċiż, meta tmexxi testijiet ta 'integrazzjoni. Hawn taħt se nsolvu dawn il-kwistjonijiet bl-użu ta 'eżempji minn dan il-proġett.
Għal runner, nirrakkomanda magna virtwali Linux b'4 vCPU, 4 GB RAM, 50 GB HDD.
Hemm ħafna informazzjoni dwar it-twaqqif ta' gitlab-runner fuq l-Internet, għalhekk fil-qosor:
Idħol fil-magna permezz ta' SSH
Jekk għandek inqas minn 8 GB RAM, allura nirrakkomanda tagħmel tpartit 10 GBsabiex il-qattiel OOM ma jiġix u joqtol il-kompiti tagħna minħabba nuqqas ta 'RAM. Dan jista 'jiġri meta aktar minn 5 kompiti jiġu mnedija simultanjament. Il-kompiti se javvanzaw aktar bil-mod, iżda b'mod stabbli.
Eżempju bil-qattiel OOM
Jekk tara fil-kompitu zkuk bash: line 82: 26474 Killed, imbagħad biss tesegwixxi fuq il-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
U jekk l-istampa tidher xi ħaġa bħal din, allura jew żid tpartit jew żid RAM.
Dan jippermettilek tmexxi kompiti paralleli fuq runner wieħed. Aqra iktar hawn.
Jekk għandek magna aktar qawwija, pereżempju 8 vCPU, 16 GB RAM, allura dawn in-numri jistgħu jsiru mill-inqas 2 darbiet akbar. Iżda kollox jiddependi fuq x'se jiġi mniedi eżattament fuq dan ir-runner u f'liema kwantità.
Il-kompitu ewlieni huwa docker-compose.yml universali, li l-iżviluppaturi/testers jistgħu jużaw kemm lokalment kif ukoll fil-pipeline CI.
L-ewwelnett, nagħmlu ismijiet ta 'servizz uniċi għal CI. Waħda mill-varjabbli uniċi f'GitLab CI hija l-varjabbli CI_JOB_ID. Jekk tispeċifika container_name b'tifsira "service-${CI_JOB_ID:-local}", imbagħad fil-każ:
jekk CI_JOB_ID mhux definit fil-varjabbli ambjentali,
allura l-isem tas-servizz se jkun service-local
jekk CI_JOB_ID definiti f'varjabbli ambjentali (pereżempju 123),
allura l-isem tas-servizz se jkun service-123
It-tieni nett, noħolqu netwerk komuni għal servizzi mnedija. Dan jagħtina iżolament fil-livell tan-netwerk meta nħaddmu ambjenti tat-test multipli.
Eżempju ta 'docker-compose.yml tiegħi bil-kummenti
version: "3"
# Для корректной работы web (php) и fmt нужно,
# чтобы контейнеры имели общий исполняемый контент.
# В нашем случае, это директория /var/www/testrail
volumes:
static-content:
# Изолируем окружение на сетевом уровне
networks:
default:
external:
name: testrail-network-${CI_JOB_ID:-local}
services:
db:
image: mysql:5.7.22
# Каждый container_name содержит ${CI_JOB_ID:-local}
container_name: "testrail-mysql-${CI_JOB_ID:-local}"
environment:
MYSQL_HOST: db
MYSQL_DATABASE: mydb
MYSQL_ROOT_PASSWORD: 1234
SKIP_GRANT_TABLES: 1
SKIP_NETWORKING: 1
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- default
migration:
image: registry.gitlab.com/touchbit/image/testrail/migration:latest
container_name: "testrail-migration-${CI_JOB_ID:-local}"
links:
- db
depends_on:
- db
networks:
- default
fpm:
image: registry.gitlab.com/touchbit/image/testrail/fpm:latest
container_name: "testrail-fpm-${CI_JOB_ID:-local}"
volumes:
- static-content:/var/www/testrail
links:
- db
networks:
- default
web:
image: registry.gitlab.com/touchbit/image/testrail/web:latest
container_name: "testrail-web-${CI_JOB_ID:-local}"
# Если переменные TR_HTTP_PORT или TR_HTTPS_PORTS не определены,
# то сервис поднимается на 80 и 443 порту соответственно.
ports:
- ${TR_HTTP_PORT:-80}:80
- ${TR_HTTPS_PORT:-443}:443
volumes:
- static-content:/var/www/testrail
links:
- db
- fpm
networks:
- default
Integration:
stage: test
tags:
- my-shell-runner
before_script:
# Аутентифицируемся в registry
- docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
# Генерируем псевдоуникальные TR_HTTP_PORT и TR_HTTPS_PORT
- export TR_HTTP_PORT=$(shuf -i10000-60000 -n1)
- export TR_HTTPS_PORT=$(shuf -i10000-60000 -n1)
# создаем директорию с идентификатором задачи
- mkdir ${CI_JOB_ID}
# копируем в созданную директорию наш docker-compose.yml
# чтобы контекст был разный для каждой задачи
- cp .indirect/docker-compose.yml ${CI_JOB_ID}/docker-compose.yml
script:
# поднимаем наше окружение
- make docker-up
# запускаем тесты исполняемым jar (у меня так)
- java -jar itest.jar --http-port ${TR_HTTP_PORT} --https-port ${TR_HTTPS_PORT}
# или в контейнере
- docker run --network=testrail-network-${CI_JOB_ID:-local} --rm itest
after_script:
# собираем логи
- make docker-logs
# останавливаем окружение
- make docker-kill
artifacts:
# сохраняем логи
when: always
paths:
- logs
expire_in: 30 days
Bħala riżultat tat-tħaddim ta 'tali kompitu, id-direttorju ta' zkuk fl-artifacts se jkun fih zkuk tas-servizz u tat-test. Li huwa konvenjenti ħafna f'każ ta 'żbalji. Kull test b'mod parallel jikteb il-ġurnal tiegħu stess, iżda se nitkellem dwar dan separatament.
$ 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
Il-kompiti kollha tlestew b'suċċess
L-artifacts tal-kompitu fihom zkuk tas-servizz u tat-test
Jidher li kollox huwa sabiħ, iżda hemm sfumatura. Il-pipeline jista 'jiġi kkanċellat bil-forza waqt li jkunu qed isiru t-testijiet ta' integrazzjoni, f'liema każ it-tħaddim tal-kontenituri ma jitwaqqafx. Minn żmien għal żmien għandek bżonn tnaddaf ir-runner. Sfortunatament, il-kompitu għat-titjib f'GitLab CE għadu fi stat miftuħa
Iżda żidna t-tnedija ta 'kompitu skond skeda, u ħadd ma jipprojbixxi li nħaddmuha manwalment.
Mur fil-proġett tagħna -> CI/CD -> Skedi u mexxi l-kompitu Clean runner
Total:
Għandna runner wieħed tal-qoxra.
M'hemm l-ebda kunflitt bejn il-kompiti u l-ambjent.
Aħna nmexxu kompiti b'testijiet ta 'integrazzjoni b'mod parallel.
Tista' tmexxi testijiet ta' integrazzjoni jew lokalment jew f'kontenitur.
Is-servizz u zkuk tat-test jinġabru u jitwaħħlu mal-kompitu tal-pipeline.
Huwa possibbli li tnaddaf ir-runner minn stampi qodma ta 'Docker.
Il-ħin tas-setup huwa ~ sagħtejn.
Dak kollu, fil-fatt. Inkun kuntent li nirċievi feedback.