ProHoster > Blag > Riarachán > Rádala Shell GitLab. Seoladh iomaíoch ar sheirbhísí tástála ag baint úsáide as Docker Compose
Rádala Shell GitLab. Seoladh iomaíoch ar sheirbhísí tástála ag baint úsáide as Docker Compose
Beidh an t-alt seo ina ábhar spéise do thástálaithe agus d'fhorbróirí araon, ach tá sé dírithe go príomha do speisialtóirí uathoibrithe a bhfuil fadhb acu le GitLab CI/CD a bhunú le haghaidh tástála comhtháthaithe i gcoinníollacha acmhainní bonneagair neamhleor agus/nó mura bhfuil coimeádán ann. ardán ceolfhoirne. Inseoidh mé duit conas imscaradh timpeallachtaí tástála a shocrú ag baint úsáide as cumadóireacht docker ar aon rádala sliogáin GitLab amháin agus ionas nach gcuirfidh na seirbhísí seolta isteach ar a chéile nuair a bhíonn roinnt timpeallachtaí á n-imscaradh.
I mo chleachtas, is minic a tharla sé gur “caitear” le tástáil chomhtháthaithe ar thionscadail. Agus is minic gurb é an chéad fhadhb agus an fhadhb is suntasaí ná píblíne CI, ina ndéantar tástáil chomhtháthaithe á fhorbairt cuirtear seirbhís(í) i gcrích i dtimpeallacht forbartha/céime. Ba chúis leis seo go leor fadhbanna:
Mar gheall ar lochtanna i seirbhís ar leith le linn tástála comhtháthaithe, féadfaidh sonraí briste damáiste a dhéanamh don chiorcad tástála. Bhí cásanna ann nuair a seoladh iarratas le formáid JSON briste, tuairteála an tseirbhís, rud a d'fhág nach raibh an seastán inoibrithe go hiomlán.
Moilliú ar an gciorcad tástála de réir mar a mhéadaíonn na sonraí tástála. Is dóigh liom nach ndéanann sé aon chiall cur síos a dhéanamh ar shampla agus an bunachar sonraí a ghlanadh/a rolladh siar. I mo chleachtas, níor tháinig mé ar thionscadal ina ndeachaigh an nós imeachta seo go réidh.
Riosca cur isteach ar fheidhmiúlacht an chiorcaid tástála nuair a bhíonn socruithe ginearálta an chórais á thástáil. Mar shampla, polasaí úsáideora/grúpa/focal faire/iarratais.
Déanann sonraí tástála ó thástálacha uathoibrithe an saol deacair do thástálaithe láimhe.
Déarfaidh roinnt gur cheart d’autotests maith na sonraí a ghlanadh tar éis iad féin. Tá argóintí agam i gcoinne:
Tá seastáin dinimiciúla an-áisiúil le húsáid.
Ní féidir gach réad a bhaint den chóras tríd an API. Mar shampla, níor cuireadh glao chun réad a scriosadh i bhfeidhm toisc go dtagann sé salach ar loighic an ghnó.
Nuair a chruthaítear réad tríd an API, is féidir méid ollmhór meiteashonraí a chruthú, rud a mbíonn fadhbanna le scriosadh.
Má tá spleáchais ag tástálacha ina measc féin, ansin déantar tinneas cinn ar an bpróiseas chun sonraí a ghlanadh tar éis tástálacha a reáchtáil.
Glaonna breise (agus, i mo thuairim, nach bhfuil údar maith leo) chuig an API.
Agus an phríomh-argóint: nuair a thosaíonn sonraí tástála a ghlanadh go díreach ón mbunachar sonraí. Is fíor-sorcas PK/FK é seo! Cloisimid ó fhorbróirí: “Tá mé díreach tar éis comhartha a chur leis/a bhaint/a athainmniú, cén fáth ar gabhadh 100500 tástáil chomhtháthaithe?”
Is é mo thuairim gurb é an réiteach is fearr ná timpeallacht dhinimiciúil.
Úsáideann go leor daoine cumadóireacht dhuganna chun timpeallacht tástála a reáchtáil, ach is beag duine a úsáideann cumadóireacht dhuganna agus iad ag déanamh tástála comhtháthaithe in CI/CD. Agus anseo nílim ag cur san áireamh kubernetes, Swarm agus ardáin orchestration coimeádán eile. Níl siad ag gach cuideachta. Bheadh sé go deas dá mbeadh docker-compose.yml uilíoch.
Fiú má tá ár rádala QA féin againn, conas is féidir linn a chinntiú nach gcuirfidh seirbhísí a sheoltar trí chumadóireacht docker isteach ar a chéile?
Conas logaí de sheirbhísí tástálaithe a bhailiú?
Conas an rádala a ghlanadh?
Tá mo rádala GitLab féin agam do mo thionscadail agus tháinig mé ar na ceisteanna seo le linn na forbartha Java cliant le haghaidh TástáilRail. Níos cruinne, nuair a bhíonn tástálacha comhtháthú á rith. Anseo thíos déanfaimid na saincheisteanna seo a réiteach trí úsáid a bhaint as samplaí ón tionscadal seo.
Le haghaidh rádala, molaim meaisín fíorúil Linux le 4 vCPU, 4 GB RAM, 50 GB HDD.
Tá go leor faisnéise ar fáil faoi shocrú gitlab-runner ar an Idirlíon, mar sin go hachomair:
Logáil isteach sa mheaisín trí SSH
Má tá níos lú ná 8 GB RAM agat, molaim duit déan babhtáil 10 GBionas nach dtiocfaidh an killer OOM chun ár gcuid tascanna a mharú mar gheall ar easpa RAM. Féadfaidh sé seo tarlú nuair a sheoltar níos mó ná 5 thasc ag an am céanna. Déanfaidh na tascanna dul chun cinn níos moille, ach go seasta.
Sampla le killer OOM
Má fheiceann tú sna logaí tasc bash: line 82: 26474 Killed, ansin ach a fhorghníomhú ar an rádala 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
Agus má bhreathnaíonn an pictiúr rud éigin mar seo, ansin cuir babhtáil nó cuir RAM leis.
Tabharfaidh sé seo deis duit tascanna comhthreomhara a reáchtáil ar rádala amháin. Leigh Nios mo anseo.
Má tá meaisín níos cumhachtaí agat, mar shampla 8 vCPU, 16 GB RAM, is féidir na huimhreacha seo a dhéanamh ar a laghad 2 uair níos mó. Ach braitheann sé go léir ar cad go díreach a sheolfar ar an rádala seo agus cén chainníocht.
Is é an príomhthasc ná docker-compose.yml uilíoch, ar féidir le forbróirí/tástálaithe a úsáid go háitiúil agus sa phíblíne CI.
Ar an gcéad dul síos, déanaimid ainmneacha seirbhíse uathúla do CI. Is é ceann de na hathróga uathúla i GitLab CI an athróg CI_JOB_ID. Má shonraíonn tú container_name le brí "service-${CI_JOB_ID:-local}", ansin i gcás:
más rud é go CI_JOB_ID nach bhfuil sainithe in athróga comhshaoil,
ansin beidh an t-ainm seirbhíse service-local
más rud é go CI_JOB_ID sainmhínithe in athróga timpeallachta (mar shampla 123),
ansin beidh an t-ainm seirbhíse service-123
Ar an dara dul síos, cruthaímid líonra coiteann do sheirbhísí seolta. Tugann sé seo leithlisiú leibhéal líonra dúinn agus muid ag rith il-thimpeallachtaí tástála.
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
Mar thoradh ar thasc den sórt sin a rith, beidh logaí seirbhíse agus tástála san eolaire logaí sna déantáin. Atá an-áisiúil i gcás earráidí. Scríobhann gach tástáil ag an am céanna a logáil féin, ach beidh mé ag caint faoi seo ar leithligh.
$ 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
Críochnaíodh na tascanna go léir go rathúil
Tá logaí seirbhíse agus tástála i ndéantúsáin tasc
Is cosúil go bhfuil gach rud álainn, ach tá nuance ann. Is féidir píblíne a chur ar ceal i bhfeidhm agus tástálacha comhtháthaithe ar siúl, agus sa chás sin ní stopfar coimeádáin a rith. Ó am go chéile ní mór duit an rádala a ghlanadh. Ar an drochuair, tá an tasc chun feabhas a chur ar GitLab CE fós i stádas Oscail
Ach tá seoladh taisc curtha leis againn de réir sceidil, agus ní chuireann aon duine cosc orainn é a rith de láimh.
Téigh go dtí ár dtionscadal -> CI / CD -> Sceidil agus rith an tasc Clean runner
Iomlán:
Tá rádala blaosc amháin againn.
Níl aon choinbhleachtaí idir tascanna agus an timpeallacht.
Reáchtálaimid tascanna le tástálacha comhtháthaithe ag an am céanna.
Is féidir leat tástálacha comhtháthaithe a rith go háitiúil nó i gcoimeádán.
Bailítear logaí seirbhíse agus tástála agus ceanglaítear iad leis an tasc píblíne.
Is féidir an rádala a ghlanadh ó shean-íomhánna Docker.
Is é ~2 uair an t-am socraithe.
Sin uile, i ndáiríre. Beidh áthas orm aiseolas a fháil.