ProHoster > Blog > Rianachd > GitLab Shell Runner. Cur air bhog farpaiseach de sheirbheisean deuchainn a’ cleachdadh Docker Compose
GitLab Shell Runner. Cur air bhog farpaiseach de sheirbheisean deuchainn a’ cleachdadh Docker Compose
Bidh an artaigil seo inntinneach don dà chuid luchd-dearbhaidh agus luchd-leasachaidh, ach tha e gu sònraichte airson eòlaichean fèin-ghluasaid aig a bheil duilgheadas le bhith a’ stèidheachadh GitLab CI / CD airson deuchainn amalachaidh ann an suidheachaidhean far nach eil goireasan bun-structair gu leòr agus / no às aonais orchestration container. àrd-ùrlar. Innsidh mi dhut mar a shuidhicheas tu cleachdadh àrainneachdan deuchainn le bhith a ’cleachdadh docker compose air aon ruitheadair slige GitLab agus gus nuair a bhios tu a’ cleachdadh grunn àrainneachdan, nach bi na seirbheisean a chaidh a chuir air bhog a ’cur bacadh air a chèile.
Anns a’ chleachdadh agam, thachair e gu tric gun deach “làimhseachadh” deuchainn amalachaidh air pròiseactan. Agus gu tric is e a’ chiad dhuilgheadas agus an duilgheadas as cudromaiche an loidhne-phìoban CI, anns a bheil deuchainn aonachaidh ga leasachadh seirbheis(ean) air a dhèanamh ann an àrainneachd dev/ìre. Dh'adhbhraich seo grunn dhuilgheadasan:
Mar thoradh air uireasbhaidhean ann an seirbheis sònraichte rè deuchainn amalachaidh, faodaidh an cuairteachadh deuchainn a bhith air a mhilleadh le dàta briste. Bha cùisean ann nuair a chuir iarrtas le cruth JSON briste sìos air an t-seirbheis, a dh’ fhàg an stand gu tur neo-obrachail.
Slaodadh a’ chuairt deuchainn mar a bhios an dàta deuchainn a’ dol am meud. Tha mi a’ smaoineachadh nach eil e ciallach eisimpleir a mhìneachadh le bhith a’ glanadh/roiligeadh air ais an stòr-dàta. Anns a 'chleachdadh agam, cha do thachair mi ri pròiseact far an deach am modh-obrach seo gu rèidh.
Cunnart gun cuir thu dragh air gnìomhachd a’ chuairt deuchainn nuair a thathar a’ dèanamh deuchainn air suidheachaidhean siostam coitcheann. Mar eisimpleir, cleachdaiche / buidheann / facal-faire / poileasaidh tagraidh.
Tha dàta deuchainn bho dheuchainnean fèin-ghluasadach a’ dèanamh beatha duilich dha luchd-dearbhaidh làimhe.
Canaidh cuid gum bu chòir dha fèin-dheuchainnean math an dàta a ghlanadh às an dèidh fhèin. Tha argamaidean agam an aghaidh:
Tha ionadan dinamic gu math goireasach airson an cleachdadh.
Chan urrainnear a h-uile nì a thoirt air falbh bhon t-siostam tron API. Mar eisimpleir, cha deach gairm airson rud a sguabadh às a chuir an gnìomh leis gu bheil e a’ dol an-aghaidh loidsig gnìomhachais.
Nuair a chruthaicheas tu nì tron API, faodar tòrr meata-dàta a chruthachadh, rud a tha duilich a dhubhadh às.
Ma tha eisimeileachd aig deuchainnean eatorra fhèin, bidh am pròiseas glanadh dàta às deidh deuchainnean a ruith a’ tionndadh gu bhith na cheann goirt.
Gairmean a bharrachd (agus, nam bheachd-sa, nach eil reusanta) chun API.
Agus am prìomh argamaid: nuair a thòisicheas dàta deuchainn air a ghlanadh gu dìreach bhon stòr-dàta. Tha seo a’ tionndadh gu bhith na fhìor shiorcas PK/FK! Bidh sinn a’ cluinntinn bho luchd-leasachaidh: “Tha mi dìreach air soidhne a chuir ris / a thoirt air falbh / ath-ainmeachadh, carson a chaidh 100500 deuchainn amalachaidh a ghlacadh?”
Nam bheachd-sa, is e àrainneachd fiùghantach am fuasgladh as fheàrr.
Bidh mòran dhaoine a’ cleachdadh docker-compose gus àrainneachd deuchainn a ruith, ach is e glè bheag de dhaoine a bhios a’ cleachdadh docker-compose nuair a bhios iad a’ dèanamh deuchainn amalachaidh ann an CI/CD. Agus an seo chan eil mi a’ toirt aire do kubernetes, swarm agus àrd-ùrlaran orchestration container. Chan eil iad aig a h-uile companaidh. Bhiodh e math nam biodh docker-compose.yml uile-choitcheann.
Fiù ma tha an ruitheadair QA againn fhèin, ciamar as urrainn dhuinn dèanamh cinnteach nach bi seirbheisean a thèid a chuir air bhog tro docker-compose a’ cur bacadh air a chèile?
Ciamar a chruinnicheas tu logaichean de sheirbheisean deuchainneach?
Ciamar a ghlanadh an runnadair?
Tha an ruitheadair GitLab agam fhìn airson na pròiseactan agam agus choinnich mi ris na ceistean sin rè leasachadh Java cliant airson DeuchainnRail. Nas mionaidiche, nuair a bhios tu a’ ruith deuchainnean amalachaidh. Gu h-ìosal bidh sinn a 'fuasgladh nan cùisean sin a' cleachdadh eisimpleirean bhon phròiseact seo.
Airson ruitheadair, tha mi a’ moladh inneal brìgheil Linux le 4 vCPU, 4 GB RAM, 50 GB HDD.
Tha tòrr fiosrachaidh ann mu bhith a’ stèidheachadh gitlab-runner air an eadar-lìn, mar sin goirid:
Log a-steach don inneal tro SSH
Ma tha nas lugha na 8 GB de RAM agad, tha mi a’ moladh Dèan suaip 10 GBgus nach tig am marbhadh OOM agus marbhadh ar gnìomhan air sgàth dìth RAM. Faodaidh seo tachairt nuair a thèid barrachd air 5 gnìomhan a chuir air bhog aig an aon àm. Bidh na gnìomhan a 'dol air adhart nas slaodaiche, ach gu cunbhalach.
Eisimpleir le OOM killer
Ma chì thu anns na logaichean gnìomh bash: line 82: 26474 Killed, an uairsin dìreach cuir an gnìomh air an ruitheadair 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 ma tha an dealbh a’ coimhead rudeigin mar seo, an uairsin cuir suaip ris no cuir RAM ris.
Leigidh seo leat gnìomhan co-shìnte a ruith air aon ruitheadair. Leugh tuilleadh an seo.
Ma tha inneal nas cumhachdaiche agad, mar eisimpleir 8 vCPU, 16 GB RAM, faodar na h-àireamhan sin a dhèanamh co-dhiù 2 uair nas motha. Ach tha e uile an urra ri dè dìreach a thèid a chuir air bhog air an ruitheadair seo agus dè an ìre.
Is e am prìomh obair docker-compose.yml uile-choitcheann, as urrainn do luchd-leasachaidh / luchd-dearbhaidh a chleachdadh an dà chuid gu h-ionadail agus ann an loidhne-phìoban CI.
An toiseach, bidh sinn a’ dèanamh ainmean seirbheis gun samhail airson CI. Is e aon de na caochladairean sònraichte ann an GitLab CI an caochladair CI_JOB_ID. Ma shònraicheas tu container_name le brìgh "service-${CI_JOB_ID:-local}", an uairsin anns a 'chùis:
если CI_JOB_ID nach eil air a mhìneachadh ann an caochladairean àrainneachd,
an uairsin bidh ainm na seirbheis service-local
если CI_JOB_ID air a mhìneachadh ann an caochladairean àrainneachd (mar eisimpleir 123),
an uairsin bidh ainm na seirbheis service-123
San dàrna h-àite, bidh sinn a’ cruthachadh lìonra coitcheann airson seirbheisean a chaidh a chuir air bhog. Bheir seo dhuinn aonaranachd ìre lìonra nuair a bhios sinn a’ ruith ioma àrainneachdan deuchainn.
Gu fìrinneach, is e seo a’ chiad cheum gu soirbheachas =)
Eisimpleir den docker-compose.yml agam le beachdan
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
Bidh mi a’ cleachdadh Makefile oir tha e gu math goireasach an dà chuid airson riaghladh àrainneachd ionadail agus ann an CI. Barrachd bheachdan air-loidhne
# У меня в проектах все вспомогательные вещи лежат в директории `.indirect`,
# в том числе и `docker-compose.yml`
# Использовать bash с опцией pipefail
# pipefail - фейлит выполнение пайпа, если команда выполнилась с ошибкой
SHELL=/bin/bash -o pipefail
# Останавливаем контейнеры и удаляем сеть
docker-kill:
docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml kill
docker network rm network-$${CI_JOB_ID:-testrail} || true
# Предварительно выполняем docker-kill
docker-up: docker-kill
# Создаем сеть для окружения
docker network create network-$${CI_JOB_ID:-testrail}
# Забираем последние образы из docker-registry
docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml pull
# Запускаем окружение
# force-recreate - принудительное пересоздание контейнеров
# renew-anon-volumes - не использовать volumes предыдущих контейнеров
docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
# Ну и, на всякий случай, вывести что там у нас в принципе запущено на машинке
docker ps
# Коллектим логи сервисов
docker-logs:
mkdir ./logs || true
docker logs testrail-web-$${CI_JOB_ID:-local} >& logs/testrail-web.log
docker logs testrail-fpm-$${CI_JOB_ID:-local} >& logs/testrail-fpm.log
docker logs testrail-migration-$${CI_JOB_ID:-local} >& logs/testrail-migration.log
docker logs testrail-mysql-$${CI_JOB_ID:-local} >& logs/testrail-mysql.log
# Очистка раннера
docker-clean:
@echo Останавливаем все testrail-контейнеры
docker kill $$(docker ps --filter=name=testrail -q) || true
@echo Очистка докер контейнеров
docker rm -f $$(docker ps -a -f --filter=name=testrail status=exited -q) || true
@echo Очистка dangling образов
docker rmi -f $$(docker images -f "dangling=true" -q) || true
@echo Очистка testrail образов
docker rmi -f $$(docker images --filter=reference='registry.gitlab.com/touchbit/image/testrail/*' -q) || true
@echo Очистка всех неиспользуемых volume
docker volume rm -f $$(docker volume ls -q) || true
@echo Очистка всех testrail сетей
docker network rm $(docker network ls --filter=name=testrail -q) || true
docker ps
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 air a leithid de ghnìomh a ruith, bidh logaichean seirbheis is deuchainn anns an eòlaire logaichean anns na stuthan. A tha gu math goireasach ma tha mearachdan ann. Bidh gach deuchainn aig an aon àm a 'sgrìobhadh a log fhèin, ach bruidhnidh mi mu dheidhinn seo air leth.
$ 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
A h-uile gnìomh air a chrìochnachadh gu soirbheachail
Ann an artifacts gnìomh tha logaichean seirbheis is deuchainn
Tha coltas gu bheil a h-uile dad brèagha, ach tha nuance ann. Faodar loidhne-phìoban a chuir dheth gu làidir fhad ‘s a tha deuchainnean amalachaidh a’ ruith, agus anns an t-suidheachadh sin cha tèid stad a chuir air soithichean a ruith. Bho àm gu àm feumaidh tu an ruitheadair a ghlanadh. Gu mì-fhortanach, tha an obair airson leasachadh ann an GitLab CE fhathast ann an inbhe Open
Ach tha sinn air gnìomh a chuir air bhog a rèir clàr-ama, agus chan eil duine a’ toirmeasg dhuinn a ruith le làimh.
Rach don phròiseact againn -> CI / CD -> Clàran agus ruith an gnìomh Clean runner
Iomlan:
Tha aon ruitheadair shligean againn.
Chan eil còmhstri sam bith eadar gnìomhan agus an àrainneachd.
Bidh sinn a’ ruith ghnìomhan le deuchainnean amalachaidh aig an aon àm.
Faodaidh tu deuchainnean amalachaidh a ruith gu h-ionadail no ann an soitheach.
Bidh clàran seirbheis is deuchainn air an cruinneachadh agus air an ceangal ri gnìomh na loidhne-phìoban.
Tha e comasach an ruitheadair a ghlanadh bho seann ìomhaighean Docker.
Is e an ùine rèiteachaidh ~ 2 uair.
Tha sin uile, gu dearbh. Bidh mi toilichte fios air ais fhaighinn.