ProHoster > Blog > Stjórnsýsla > GitLab Shell Runner. Samkeppnishæf kynning á prófuðum þjónustu með Docker Compose
GitLab Shell Runner. Samkeppnishæf kynning á prófuðum þjónustu með Docker Compose
Þessi grein mun vekja áhuga bæði prófunaraðila og þróunaraðila, en er aðallega ætluð sjálfvirknisérfræðingum sem standa frammi fyrir því vandamáli að setja upp GitLab CI/CD fyrir samþættingarprófun við aðstæður þar sem ófullnægjandi innviðaauðlindir eru og/eða skortur á gámi hljómsveitarvettvangur. Ég mun segja þér hvernig á að setja upp dreifingu prófunarumhverfis með því að nota docker compose á einum GitLab skelhlaupara og þannig að þegar þú setur upp nokkur umhverfi trufla þjónustan sem er opnuð ekki hver aðra.
Í starfi mínu gerðist það oft að samþættingarpróf voru „meðhöndluð“ á verkefnum. Og oft er fyrsta og mikilvægasta vandamálið CI leiðslan, þar sem samþættingarprófun verið að þróa þjónusta(r) fer fram í þróunar-/stigi umhverfi. Þetta olli töluverðum vandræðum:
Vegna galla í tiltekinni þjónustu við samþættingarprófun getur prófunarrásin skemmst vegna brotinna gagna. Það voru tilvik þegar sending beiðni með biluðu JSON sniði hrundi þjónustunni, sem gerði standinn algjörlega óstarfhæfan.
Hægari á prófunarrásinni þegar prófunargögnum fjölgar. Ég held að það sé ekkert vit í að lýsa dæmi um að þrífa/rúlla gagnagrunninum til baka. Í starfi mínu hef ég ekki lent í verkefni þar sem þetta ferli gekk snurðulaust fyrir sig.
Hætta á að trufla virkni prófunarrásarinnar þegar almennar kerfisstillingar eru prófaðar. Til dæmis, notandi/hópur/lykilorð/forritsstefna.
Prófgögn úr sjálfvirkum prófum gera handvirkum prófurum lífið erfitt.
Sumir munu segja að góðar sjálfvirkar prófanir ættu að hreinsa gögnin til eftir sig. Ég hef rök gegn:
Dynamic standar eru mjög þægilegir í notkun.
Ekki er hægt að fjarlægja alla hluti úr kerfinu í gegnum API. Til dæmis var símtal um að eyða hlut ekki útfært vegna þess að það stangast á við viðskiptarökfræði.
Þegar hlutur er búinn til í gegnum API er hægt að búa til mikið magn af lýsigögnum sem erfitt er að eyða.
Ef próf eru háð innbyrðis, þá breytist ferlið við að hreinsa gögn eftir að hafa keyrt próf í höfuðverk.
Viðbótarsímtöl (og að mínu mati ekki réttlætanleg) í API.
Og aðalröksemdin: þegar byrjað er að hreinsa prófgögn beint úr gagnagrunninum. Þetta er að breytast í alvöru PK/FK sirkus! Við heyrum frá forriturum: „Ég bætti bara við/fjarlægði/skírði skilti, hvers vegna lentu 100500 samþættingarpróf?
Að mínu mati er ákjósanlegasta lausnin kraftmikið umhverfi.
Margir nota docker-compose til að keyra prófunarumhverfi, en fáir nota docker-compose þegar þeir framkvæma samþættingarpróf í CI/CD. Og hér er ég ekki að taka tillit til kubernetes, kviks og annarra gámasveita. Ekki eru öll fyrirtæki með þau. Það væri gaman ef docker-compose.yml væri alhliða.
Jafnvel þó að við höfum okkar eigin QA hlaupara, hvernig getum við tryggt að þjónusta sem er hleypt af stokkunum í gegnum docker-compose trufli ekki hver aðra?
Hvernig á að safna skrám yfir prófaðar þjónustur?
Hvernig á að þrífa hlauparann?
Ég er með minn eigin GitLab hlaupara fyrir verkefnin mín og ég rakst á þessar spurningar við þróun Java viðskiptavinur í TestRail. Nánar tiltekið, þegar þú keyrir samþættingarpróf. Hér að neðan munum við leysa þessi mál með því að nota dæmi úr þessu verkefni.
Fyrir hlaupara mæli ég með Linux sýndarvél með 4 vCPU, 4 GB vinnsluminni, 50 GB HDD.
Það er mikið af upplýsingum um uppsetningu gitlab-runner á netinu, svo stuttlega:
Skráðu þig inn á vélina í gegnum SSH
Ef þú ert með minna en 8 GB vinnsluminni, þá mæli ég með gera skipti 10 GBsvo að OOM morðinginn komi ekki og drepi verkefni okkar vegna skorts á vinnsluminni. Þetta getur gerst þegar fleiri en 5 verkefni eru sett af stað samtímis. Verkefnin munu þróast hægar, en jafnt og þétt.
Dæmi með OOM killer
Ef þú sérð í verkefnaskránum bash: line 82: 26474 Killed, þá er bara að framkvæma á hlauparanum 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
Og ef myndin lítur eitthvað svona út, þá annað hvort bæta við swap eða bæta við vinnsluminni.
Þetta gerir þér kleift að keyra samhliða verkefni á einum hlaupara. Lestu meira hér.
Ef þú ert með öflugri vél, til dæmis 8 vCPU, 16 GB vinnsluminni, þá er hægt að gera þessar tölur að minnsta kosti 2 sinnum stærri. En það veltur allt á því hvað nákvæmlega verður hleypt af stokkunum á þessum hlaupara og í hvaða magni.
Aðalverkefnið er alhliða docker-compose.yml, sem forritarar/prófarar geta notað bæði á staðnum og í CI leiðslunni.
Í fyrsta lagi gerum við einstök þjónustuheiti fyrir CI. Ein af einstöku breytunum í GitLab CI er breytan CI_JOB_ID. Ef þú tilgreinir container_name með merkingu "service-${CI_JOB_ID:-local}", þá í málinu:
ef CI_JOB_ID ekki skilgreint í umhverfisbreytum,
þá verður þjónustuheitið service-local
ef CI_JOB_ID skilgreind í umhverfisbreytum (til dæmis 123),
þá verður þjónustuheitið service-123
Í öðru lagi búum við til sameiginlegt net fyrir opnar þjónustur. Þetta gefur okkur einangrun á netstigi þegar við keyrum mörg prófunarumhverfi.
Reyndar er þetta fyrsta skrefið til að ná árangri =)
Dæmi um docker-compose.yml minn með athugasemdum
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
Sem afleiðing af því að keyra slíkt verkefni mun skráasafnið í gripunum innihalda þjónustu- og prófunarskrár. Sem er mjög þægilegt ef villur koma upp. Hvert próf samhliða skrifar sinn eigin log, en ég mun tala um þetta sérstaklega.
$ 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
Öllum verkefnum lokið með góðum árangri
Verkefnisgripir innihalda þjónustu- og prófunarskrár
Allt virðist vera fallegt, en það er blæbrigði. Hægt er að þvinga niður leiðslu á meðan samþættingarpróf eru í gangi, en þá verða keyrslugámar ekki stöðvaðir. Af og til þarftu að þrífa hlauparann. Því miður er verkefnið til umbóta í GitLab CE enn í stöðu Opna
En við höfum bætt við ræsingu verkefnis samkvæmt áætlun og enginn bannar okkur að keyra það handvirkt.
Farðu í verkefnið okkar -> CI/CD -> Áætlanir og keyrðu verkefnið Clean runner
Samtals:
Við erum með einn skeljahlaupara.
Það eru engin árekstrar milli verkefna og umhverfis.
Við keyrum verkefni með samþættingarprófum samhliða.
Þú getur keyrt samþættingarpróf annað hvort á staðnum eða í gámi.
Þjónustu- og prófunarskrám er safnað og þeim fest við leiðsluverkefnið.
Það er hægt að þrífa hlauparann úr gömlum Docker myndum.
Uppsetningartími er ~2 klst.
Það er allt, reyndar. Ég mun vera ánægð að fá viðbrögð.