Ky artikull do të jetë i dobishëm për testuesit dhe zhvilluesit, por është kryesisht i përgatitur për automatizuesit që janë përballur me problemin e konfigurimit të GitLab CI/CD për kryerjen e testimeve integruese në kushte të mungesës së burimeve infrastrukturore dhe/ose të mungesës së një platforme për orkestrimin e kontejnerëve. Do të tregoj si të konfiguroj implementimin e mjediseve të testuara me ndihmën e docker compose në një GitLab shell runner të vetëm dhe që, gjatë implementimit të disa mjediseve, shërbimet që do të ekzekutohen të mos pengojnë njëra-tjetrën.
Përmbajtja
Parakushtet
Në praktikën time, shpesh herë është dashur të "shëroj" testimin integrues në projekte. Dhe shpeshherë problemi i parë dhe më i rëndësishëm është pipeline-i CI, në të cilin testimi integrues i shërbimit(ve) të zhvilluar bëhet në mjedisin dev/stage. Kjo shkaktonte shumë probleme: Për shkak të defekteve në një shërbim ose tjetër gjatë testimit integrues, konturi testues mund të prishte të dhënat e panevojshme. Ka pasur raste kur dërgimi i një kërkese me format JSON të prishur ngadalësonte shërbimin, duke e çuar plotësisht në një gjendje jo funksionale.
- Ngadalësimi i punës së konturit testues me rritjen e të dhënave testuese. Mendoj se nuk ka nevojë të përshkruaj një shembull me pastrimin/rërgimin e BD-së. Në praktikën time nuk kam hasur në ndonjë projekt ku kjo procedurë të kalonte pa pengesa.
- Rreziku për të prishur funksionimin e konturit testues gjatë testimit të konfigurimeve të përbashkëta të sistemit. Për shembull, user/group/password/application policy.
- Të dhënat testuese nga testet automatike pengojnë punën e testuesve manualë.
- Dikush do të thotë se testet e mira automatikisht duhet të pastrojnë të dhënat pas vetes. Kam argumente kundër:
Stendat dinamike janë shumë të përshtatshme për t'u përdorur.
- Nuk çdo objekt mund të fshihet nga sistemi përmes API. Për shembull, thirrja për fshirjen e një objekti nuk është e realizuar, pasi i bie ndesh biznes logjikës.
- Në krijimin e një objekti përmes API, mund të krijohet një sasi e madhe të metadatat që janë problematike për t'u fshirë.
- Gjatë krijimit të një objekti përmes API, mund të krijohet një sasi e madhe metadatatsh që janë problematike për t'u fshirë.
- Nëse testet kanë varësi mes tyre, procesi i pastrimit të të dhënave pas ekzekutimit të testeve kthehet në një dhimbje koke.
- Thirrje shtesë (dhe, sipas mendimit tim, të paarsyetuara) ndaj API-së.
- Dhe argumenti kryesor: kur të dhënat testuese fillojnë të pastrohen direkt nga DB. Kjo shndërrohet në një cirk të vërtetë PK/FK! Nga zhvilluesit dëgjohet: "Vetëm shtova/fshiva/riformova një tabelë, pse 100500 teste integruese dështuan?"
Sipas mendimit tim, zgjidhja më optimale është një mjedis dinamik.
- Shumë njerëz përdorin docker-compose për të nisur mjedisin e testimit, por pak e përdorin docker-compose gjatë zhvillimit të testeve integruese në CI/CD. Dhe këtu nuk po marr parasysh kubernetes, swarm dhe platforma të tjera orkestrimi të konteinerëve. Nuk është në çdo kompani. Do të ishte mirë nëse docker-compose.yml do të ishte universale.
- Nëse madje kemi një QA runner, si mund ta bëjmë që shërbimet e lançuara përmes docker-compose të mos pengojnë njëra-tjetrën?
- Si të mbledhim log-et e shërbimeve që po testohen?
- Si të pastrojmë runner-in?
Kam një GitLab runner për projektet e mia dhe me këto pyetje kam përballur gjatë zhvillimit. për . Më saktë gjatë ekzekutimit të testeve integruese. Këtu do t'i zgjidhim këto çështje me shembuj nga ky projekt.
GitLab Shell Runner
Për runner-in rekomandoj një makinë virtuale Linux me 4 vCPU, 4 GB RAM, 50 GB HDD.
Në hapësirat e internetit ka shumë informacion për konfigurimin e gitlab-runner, prandaj shkurtimisht:
- Hyn në makinën përmes SSH.
Nëse keni më pak se 8 GB RAM, rekomandoj , për të mos pasur OOM killer që të vrasë detyrat për shkak të mungesës së RAM. Kjo mund të ndodhë kur ekzekutohen më shumë se 5 detyra në të njëjtën kohë. Detyrat do të përfundojnë më ngadalë, por me siguri.
Shembulli me OOM killer
Nëse në log-et e detyrës sheh
bash: line 82: 26474 Killed, thjesht kryej në runnersudo dmesg | grep 26474[26474] 1002 26474 1061935 123806 339 0 0 java Mungesë kujtesë: Vrit procesin 26474 (java) pikë 127 ose sakrifiko fëmijën I vrarë procesi 26474 (java) total-vm:4247740kB, anon-rss:495224kB, file-rss:0kB, shmem-rss:0kBDhe nëse pamja duket kështu, atëherë ose shtoni swap, ose shtoni RAM.
- Instalojmë , , , bëje.
- Shtoni përdoruesin
gitlab-runnernë grupindockersudo groupadd docker sudo usermod -aG docker gitlab-runner - gitlab-runner.
Hapni për editim
/etc/gitlab-runner/config.tomldhe shtoniconcurrent=20 [[runners]] request_concurrency = 10Kjo do të lejojë ekzekutimin e detyrave paralelisht në një ekzekutues. Lexoni më shumë në detaje .
Nëse keni një makinë më të fuqishme, për shembull 8 vCPU, 16 GB RAM, atëherë këto numra mund të dyfishohen të paktën. Por gjithçka varet nga ajo se çfarë do të ekzekutohet konkretisht në këtë ekzekutues dhe në çfarë sasi.
Ky është i mjaftueshëm.
Përgatitja e docker-compose.yml
Detyra kryesore është një docker-compose.yml universal, i cili mund të përdoret nga zhvilluesit/testuesit si në nivel lokal ashtu edhe në pipeline-n CI.
Së pari, ne krijojmë emra unikë shërbimesh për CI. Një nga variablat unikë në GitLab CI është variabli CI_JOB_ID. Nëse përcaktoni container_name me vlerën "service-${CI_JOB_ID:-local}", atëherë në rastin e:
- nëse
CI_JOB_IDnuk është përcaktuar në variablat e mjedisit,
emri i shërbimit do të jetëservice-local - nëse
CI_JOB_IDështë përcaktuar në variablat e mjedisit (për shembull 123),
emri i shërbimit do të jetëservice-123
Së dyti, ne krijojmë një rrjet të përbashkët për shërbimet që ekzekutohen. Kjo na jep izolim në nivelin e rrjetit kur ekzekutojmë disa mjedise testimi.
networks:
default:
external:
name: service-network-${CI_JOB_ID:-local}Kjo në thelb është hapi i parë drejt suksesit =)
Shembulli im i docker-compose.yml me komente
version: "3"
# Për funksionimin e saktë të web (php) dhe fmt, është e nevojshme
# që kontejnerët të kenë përmbajtje ekzekutuese të përbashkët.
# Në rastin tonë, kjo është direktoria /var/www/testrail
volumes:
static-content:
# Izolojmë mjedisin në nivelin e rrjetit
networks:
default:
external:
name: testrail-network-${CI_JOB_ID:-local}
services:
db:
image: mysql:5.7.22
# Çdo container_name përmban ${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}"
# Nëse variablat TR_HTTP_PORT ose TR_HTTPS_PORTS nuk janë të përcaktuar,
# shërbimi ngrihet në portet 80 dhe 443 përkatësisht.
ports:
- ${TR_HTTP_PORT:-80}:80
- ${TR_HTTPS_PORT:-443}:443
volumes:
- static-content:/var/www/testrail
links:
- db
- fpm
networks:
- defaultShembulli i ekzekutimit lokal
docker-compose -f docker-compose.yml up -d
Fillimi testrail-mysql-local ... përfundoi
Fillimi testrail-migration-local ... përfundoi
Fillimi testrail-fpm-local ... përfundoi
Rikrijimi testrail-web-local ... përfundoiPor nuk është aq e thjeshtë me ekzekutimin në CI.
Përgatitja e Makefile
Unë përdor Makefile sepse është shumë e dobishme për menaxhimin lokal të ambientit, si dhe në CI. Më pas komentet inline.
# У меня в проектах все вспомогательные вещи лежат в директории `.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
Po kontrollojmë
make docker-up
$ make docker-up
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml kill
Po vrasim testrail-web-local ... përfunduar
Po vrasim testrail-fpm-local ... përfunduar
Po vrasim testrail-mysql-local ... përfunduar
docker network rm network-${CI_JOB_ID:-testrail} || true
network-testrail
docker network create network-${CI_JOB_ID:-testrail}
d2ec063324081c8bbc1b08fd92242c2ea59d70cf4025fab8efcbc5c6360f083f
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml pull
Po shkarkoj db ... përfunduar
Po shkarkoj migrimin ... përfunduar
Po shkarkoj fpm ... përfunduar
Po shkarkoj web ... përfunduar
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
Po krijoj përsëri testrail-mysql-local ... përfunduar
Po krijoj përsëri testrail-fpm-local ... përfunduar
Po krijoj përsëri testrail-migrimin-local ... përfunduar
Po krijoj përsëri testrail-web-local ... përfunduar
docker ps
ID KONTEJNERI PORTAT EMRA
a845d3cb0e5a 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp testrail-web-local
19d8ef001398 9000/tcp testrail-fpm-local
e28840a2369c 3306/tcp, 33060/tcp testrail-migrimin-local
0e7900c23f37 3306/tcp testrail-mysql-local
make docker-logs
$ make docker-logs
mkdir ./logs || true
mkdir: nuk mund të krijoj direktorinë ‘./logs’: Direktorija ekziston
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-migrimin-${CI_JOB_ID:-local} > logs/testrail-migration.log
docker logs testrail-mysql-${CI_JOB_ID:-local} > logs/testrail-mysql.log
Përgatitja e .gitlab-ci.yml
Ekzekutimi i testeve integruese
Integrimi:
faza: test
tags:
- my-shell-runner
para-script:
# Autentikimi në registry
- docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
# Gjenerimi i TR_HTTP_PORT dhe TR_HTTPS_PORT pseudo-unik
- export TR_HTTP_PORT=$(shuf -i10000-60000 -n1)
- export TR_HTTPS_PORT=$(shuf -i10000-60000 -n1)
# krijo një direktori me identifikuesin e detyrës
- mkdir ${CI_JOB_ID}
# kopjoni docker-compose.yml në директорию
# në mënyrë që konteksti të jetë ndryshe për çdo detyrë
- cp .indirect/docker-compose.yml ${CI_JOB_ID}/docker-compose.yml
script:
# ngritja e ambientit tonë
- make docker-up
# ekzekutimi i testeve nga jar i ekzekutueshëm (kështu e bëj unë)
- java -jar itest.jar --http-port ${TR_HTTP_PORT} --https-port ${TR_HTTPS_PORT}
# ose brenda konteinerit
- docker run --network=testrail-network-${CI_JOB_ID:-local} --rm itest
pas-script:
# grumbullo logët
- make docker-logs
# ndaluam ambientin
- make docker-kill
artefakte:
# ruajmë logët
kur: gjithmonë
rrugët:
- logs
skadojnë në: 30 ditëSi rezultat i ekzekutimit të një detyre të tillë, direktoria logs në artefakte do të përmbajë logët e shërbimeve dhe testeve. Kjo është shumë e dobishme në rastin e gabimeve. Çdo test në paralel shkruan log-un e vet, por për këtë do të flas më vonë.

Pastrimi i runner-it
Detyra do të ekzekutohet vetëm sipas një grafiku.
fazat:
- pastrimi
- ndërtimi
- test
Pastruesi i ndihmës:
faza: pastrim
vetëm:
- orare
tags:
- my-shell-runner
script:
- make docker-cleanMë pas kalojmë në projektin tonë GitLab -> CI/CD -> Oraret -> Orari i Ri dhe shtojmë një orar të ri
Rezultati
Nisim 4 detyra në GitLab CI
Në regjistrat e detyrës së fundit me testet e integrimit shohim kontejnerët nga detyra të ndryshme
ID KONTEJNERA EMRAT
c6b76f9135ed testrail-web-204645172
01d303262d8e testrail-fpm-204645172
2cdab1edbf6a testrail-migration-204645172
826aaf7c0a29 testrail-mysql-204645172
6dbb3fae0322 testrail-web-204645084
3540f8d448ce testrail-fpm-204645084
70fea72aa10d testrail-mysql-204645084
d8aa24b2892d testrail-web-204644881
6d4ccd910fad testrail-fpm-204644881
685d8023a3ec testrail-mysql-204644881
1cdfc692003a testrail-web-204644793
6f26dfb2683e testrail-fpm-204644793
029e16b26201 testrail-mysql-204644793
c10443222ac6 testrail-web-204567103
04339229397e testrail-fpm-204567103
6ae0accab28d testrail-mysql-204567103
b66b60d79e43 testrail-web-204553690
033b1f46afa9 testrail-fpm-204553690
a8879c5ef941 testrail-mysql-204553690
069954ba6010 testrail-web-204553539
ed6b17d911a5 testrail-fpm-204553539
1a1eed057ea0 testrail-mysql-204553539Regjistri më i detajuar
$ docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
KËRCENIM! Përdorimi i --password përmes CLI-së është i pasigurt. Përdorni --password-stdin.
KËRCENIM! Fjalëkalimi juaj do të ruhet pa enkriptim në /home/gitlab-runner/.docker/config.json.
Konfiguroni një ndihmës për kredenciale për të hequr këtë paralajmërim. Shihni
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Kyçja e Succesit
$ 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
Gabim: Rrjeti i tillë nuk ekziston: testrail-network-204645172
docker network create testrail-network-${CI_JOB_ID:-local}
0a59552b4464b8ab484de6ae5054f3d5752902910bacb0a7b5eca698766d0331
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml pull
Po tërheq web ... përfunduar
Po tërheq fpm ... përfunduar
Po tërheq migrim ... përfunduar
Po tërheq db ... përfunduar
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
Krijimi i volumit "204645172_static-content" me drejtuesin standard
Krijimi testrail-mysql-204645172 ...
Krijimi testrail-mysql-204645172 ... përfundoi
Krijimi testrail-migration-204645172 ... përfundoi
Krijimi testrail-fpm-204645172 ... përfundoi
Krijimi testrail-web-204645172 ... përfundoi
docker ps
ID KONTEJNERI IMAZHI KOMANDA KRIJUAR STATUS PORTAT EMRAT
c6b76f9135ed registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon of…" 13 sekonda më parë Up 1 sekond 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 sekonda më parë Up 13 sekonda 9000/tcp testrail-fpm-204645172
2cdab1edbf6a registry.gitlab.com/touchbit/image/testrail/migration:latest "docker-entrypoint.s…" 16 sekonda më parë Up 13 sekonda 3306/tcp, 33060/tcp testrail-migration-204645172
826aaf7c0a29 mysql:5.7.22 "docker-entrypoint.s…" 18 sekonda më parë Up 16 sekonda 3306/tcp testrail-mysql-204645172
6dbb3fae0322 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon of…" 36 sekonda më parë Up 22 sekonda 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 sekonda më parë Up 35 sekonda 9000/tcp testrail-fpm-204645084
70fea72aa10d mysql:5.7.22 "docker-entrypoint.s…" 40 sekonda më parë Up 37 sekonda 3306/tcp testrail-mysql-204645084
d8aa24b2892d registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon of…" Rreth një minut më parë Up 53 sekonda 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…" Rreth një minut më parë Up Rreth një minut 9000/tcp testrail-fpm-204644881
685d8023a3ec mysql:5.7.22 "docker-entrypoint.s…" Rreth një minut më parë Up Rreth një minut 3306/tcp testrail-mysql-204644881
1cdfc692003a registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon of…" Rreth një minut më parë Up Rreth një minut 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…" Rreth një minut më parë Up Rreth një minut 9000/tcp testrail-fpm-204644793
029e16b26201 mysql:5.7.22 "docker-entrypoint.s…" Rreth një minut më parë Up Rreth një minut 3306/tcp testrail-mysql-204644793
c10443222ac6 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon of…" 5 orë më parë Up 5 orë 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 orë më parë Up 5 orë 9000/tcp testrail-fpm-204567103
6ae0accab28d mysql:5.7.22 "docker-entrypoint.s…" 5 orë më parë Up 5 orë 3306/tcp testrail-mysql-204567103
b66b60d79e43 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon of…" 5 orë më parë Up 5 orë 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 orë më parë Up 5 orë 9000/tcp testrail-fpm-204553690
a8879c5ef941 mysql:5.7.22 "docker-entrypoint.s…" 5 orë më parë Up 5 orë 3306/tcp testrail-mysql-204553690
069954ba6010 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon of…" 5 orë më parë Up 5 orë 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 orë më parë Up 5 orë 9000/tcp testrail-fpm-204553539
1a1eed057ea0 mysql:5.7.22 "docker-entrypoint.s…" 5 orë më parë Up 5 orë 3306/tcp testrail-mysql-204553539Të gjitha detyrat përfunduan me sukses
Artefaktet e detyrave përmbajnë logët e shërbimeve dhe testeve
Duket se gjithçka është në rregull, por ka një nuancë. Pipeline mund të anulohet me forcë gjatë ekzekutimit të testeve integruese, dhe në këtë rast, kontejnerët e nisur nuk do të ndalen. Herë pas here, ne duhet të pastroni runner-in. Fatkeqësisht, detyra për përmirësim në GitLab CE ende është në status
Por ne kemi shtuar ekzekutimin e detyrës sipas orarit, dhe askush nuk na ndalon ta ekzekutojmë manualisht.
Kalo në projektin tonë -> CI/CD -> Oraret dhe ekzekuto detyrën Pastroni runner-in
Pra, në përfundim:
- Ne kemi një shell runner.
- Nuk ka konflikte mes detyrave dhe ambientit.
- Ne kemi një ekzekutim paralel të detyrave me testet integruese.
- Testet integruese mund të ekzekutohen si lokalisht ashtu edhe në kontejner.
- Logët e shërbimeve dhe testeve mblidhen dhe lidhen me detyrën e pipeline.
- Ka mundësi pastrimi të runner-it nga imazhet e vjetra docker.
Koha e konfigurimit — ~2 orë.
Kjo ishte gjithçka. Do të isha i lumtur për feedback-un.
Burimi: habr.com
