Šis raksts būs interesants gan testētājiem, gan izstrādātājiem, taču tas galvenokārt ir paredzēts automatizētājiem, kuri saskārušies ar problēmu konfigurēt GitLab CI/CD integrācijas testēšanai apstākļos, kad trūkst infrastruktūras resursu un/vai nav konteineru orķestrācijas platformas. Es pastāstīšu, kā konfigurēt testējamo vidējo izvietošanu, izmantojot docker compose vienā GitLab shell runner, lai vairākas vides izvietošanas laikā palaistie pakalpojumi netraucētu viens otram.
Satelīte
Priekšnosacījumi
Manā praksē bieži nācies "ārstēt" integrācijas testēšanu projektos. Un bieži vien pirmā un vissvarīgākā problēma ir CI pipeline, kurā integrācijas testēšana izstrādātā pakalpojuma(-u) notiek dev/stage vidē. Tas radīja daudz problēmu:
- Dēļ defektiem kādā no pakalpojumiem integrācijas testēšanas procesā testēšanas apvidus var tikt sabojāts ar bojātiem datiem. Bijusi situācijas, kad pieprasījuma nosūtīšana ar bojātu JSON formātu apstādina pakalpojumu, kas pilnībā izslēdz stendu.
- Testēšanas apvidus palēnināšanās, pieaugot testēšanas datu daudzumam. Domāju, nav jēgas aprakstīt piemēru par datu bāzes tīrīšanu/vēršanos atpakaļ. Savā praksē neesmu saskāries ar projektu, kur šī procedūra būtu noritējusi gludi.
- Riska nepieciešamība izjaukt testēšanas apvidus darbību kopīgās sistēmas iestatījumu testēšanas laikā. Piemēram, lietotājs/grupa/parole/lietojumprogrammas politika.
- Testēšanas dati no automātiskajiem testiem traucē roku testētājiem.
Kāds var teikt, ka labiem automātiskajiem testiem pēc sevis jānotīra dati. Man ir pretargumenti:
- Dinamiski stendi ir ļoti ērti lietošanā.
- Ne katru objektu var izdzēst no sistēmas, izmantojot API. Piemēram, objekta dzēšanas izsaukums nav īstenots, jo tas pretrunā biznesa loģikai.
- Izveidojot objektu, izmantojot API, var radīt milzīgu metadatu apjomu, kas ir problemātiski izdzēšami.
- Ja testiem ir savstarpēja atkarība, tad datu tīrīšana pēc testu izpildes pārvēršas par galvas sāpēm.
- Papildu (un, manuprāt, nepamatoti) izsaukumi uz API.
- Un galvenais arguments: kad testa dati sāk tīrīt tieši no DB. Tas pārvēršas par īstu PK/FK cirku! No izstrādātājiem dzird: "Es tikai pievienoju/izdzēsu/pārveidoju tabulu, kāpēc 100500 integrācijas testi izgāzās?"
Manuprāt, optimālākais risinājums ir dinamisks apvidus.
- Daudzi izmanto docker-compose testēšanas apvidus uzsākšanai, bet maz katrs izmanto docker-compose integrācijas testēšanai CI/CD. Un šeit es neņemšu vērā kubernetes, swarm un citas konteinera orķestrēšanas platformas. Ne katrā uzņēmumā tās pastāv. Būtu labi, ja docker-compose.yml būtu universāls.
- Ja mums pat ir savs QA runner, kā panākt, lai pakalpojumi, ko uzsāk docker-compose, netraucētu viens otram?
- Kā vākt testēto pakalpojumu žurnālus?
- Kā notīrīt runner?
Man ir savs GitLab runner saviem projektiem, un ar šiem jautājumiem es sastapos izstrādes procesā lai . Precīzāk, uzsākot integrācijas testus. Tālāk mēs risināsim šos jautājumus ar piemēriem no šī projekta.
GitLab Shell Runner
Runneram rekomendēju Linux virtuālo mašīnu ar 4 vCPU, 4 GB RAM, 50 GB HDD.
Interneta plašumos ir ļoti daudz informācijas par gitlab-runner konfigurēšanu, tāpēc īsi:
- Ieejam uz mašīnas pa SSH
Ja jums ir mazāk par 8 GB RAM, tad iesaku , lai nedarbotos OOM killer un nenogalinātu mūsu uzdevumus RAM trūkuma dēļ. Tas var notikt, kad vienlaikus tiek uzsākti vairāk nekā 5 uzdevumi. Uzdevumi tiks izpildīti lēnāk, bet stabilāk.
Piemērs ar OOM killer
Ja jūsu uzdevumu žurnālos redzēsiet
bash: line 82: 26474 Killed, tad vienkārši izpildiet runnerīsudo dmesg | grep 26474[26474] 1002 26474 1061935 123806 339 0 0 java No atmiņas: nogalināt procesu 26474 (java) score 127 vai upurēt bērnu Nogalināts process 26474 (java) total-vm:4247740kB, anon-rss:495224kB, file-rss:0kB, shmem-rss:0kBUn, ja aina izskatās aptuveni tā, tad vai nu pievienojiet swap, vai palieliniet RAM.
- Uzstādam , , , make.
- Pievienojam lietotāju
gitlab-runnergrupaidockersudo groupadd docker sudo usermod -aG docker gitlab-runner - gitlab-runner.
Atveram rediģēšanai
/etc/gitlab-runner/config.tomlun pievienojamconcurrent=20 [[runners]] request_concurrency = 10Tas ļaus uzsākt paralēlos uzdevumus vienā runnerī. Sīkāk lasiet .
Ja jums ir jaudīgāka mašīna, piemēram, 8 vCPU, 16 GB RAM, tad šīs figūras var palielināt vismaz divas reizes. Bet viss atkarīgs no tā, kas tieši tiks uzsākts šajā runnerī un kādā daudzumā.
Tas ir pietiekami.
docker-compose.yml sagatavošana
Galvenais uzdevums ir universāls docker-compose.yml, ko izstrādātāji/testētāji var izmantot gan lokāli, gan CI pipeline.
Pirmkārt, mēs izveidojam unikālus pakalpojumu nosaukumus CI. Viens no unikālajiem mainīgajiem GitLab CI ir mainīgais CI_JOB_ID. Ja norādīsim container_name ar vērtību "service-${CI_JOB_ID:-local}", tad gadījumā, ja:
- ja
CI_JOB_IDnav definēts vidējos mainīgajos,
pakalpojuma nosaukums būsservice-local - ja
CI_JOB_IDir definēts vidējos mainīgajos (piemēram, 123),
pakalpojuma nosaukums būsservice-123
Otrkārt, mēs izveidojam kopīgu tīklu palaistajiem pakalpojumiem. Tas nodrošina mums izolāciju tīkla līmenī, palaidot vairākas testēšanas vides.
networks:
default:
external:
name: service-network-${CI_JOB_ID:-local}Tas ir pirmais solis uz panākumiem =)
Mans docker-compose.yml piemērs ar komentāriem
version: "3"
# Lai pareizi darbotos web (php) un fmt,
# konteineriem jābūt kopīgām izpildāmām saturu.
# Mūsu gadījumā tas ir direktorija /var/www/testrail
volumes:
static-content:
# Izolējam vidi tīkla līmenī
networks:
default:
external:
name: testrail-network-${CI_JOB_ID:-local}
services:
db:
image: mysql:5.7.22
# Katram container_name satur ${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}"
# Ja mainīgie TR_HTTP_PORT vai TR_HTTPS_PORTS nav definēti,
# pakalpojums tiks uzsākts uz 80 un 443 porta attiecīgi.
ports:
- ${TR_HTTP_PORT:-80}:80
- ${TR_HTTPS_PORT:-443}:443
volumes:
- static-content:/var/www/testrail
links:
- db
- fpm
networks:
- defaultLokālā palaišana piemērs
docker-compose -f docker-compose.yml up -d
Sākot testrail-mysql-local ... izdarīts
Sākot testrail-migration-local ... izdarīts
Sākot testrail-fpm-local ... izdarīts
Atjaunojot testrail-web-local ... izdarītsBet ne viss ir tik vienkārši ar palaišanu CI.
Makefile sagatavošana
Es izmantoju Makefile, jo tas ir ļoti ērti gan lokālai vides pārvaldībai, gan CI. Tālāk ir iekšējie komentāri
# У меня в проектах все вспомогательные вещи лежат в директории `.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
Pārbaudām
make docker-up
$ make docker-up
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml kill
Killing testrail-web-local ... done
Killing testrail-fpm-local ... done
Killing testrail-mysql-local ... done
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
Pulling db ... done
Pulling migration ... done
Pulling fpm ... done
Pulling web ... done
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
Recreating testrail-mysql-local ... done
Recreating testrail-fpm-local ... done
Recreating testrail-migration-local ... done
Recreating testrail-web-local ... done
docker ps
CONTAINER ID PORTS NAMES
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-migration-local
0e7900c23f37 3306/tcp testrail-mysql-local
make docker-logs
$ make docker-logs
mkdir ./logs || true
mkdir: cannot create directory './logs': File exists
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
.gitlab-ci.yml sagatavošana
Integrācijas testu palaišana
Integrācija:
posms: tests
tags:
- my-shell-runner
before_script:
# Autentificējamies reģistrā
- docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
# Ģenerējam pseidounikālos TR_HTTP_PORT un TR_HTTPS_PORT
- export TR_HTTP_PORT=$(shuf -i10000-60000 -n1)
- export TR_HTTPS_PORT=$(shuf -i10000-60000 -n1)
# izveidojam direktoriju ar uzdevuma identifikatoru
- mkdir ${CI_JOB_ID}
# kopējam izveidotajā direktorijā mūsu docker-compose.yml
# lai konteksts katram uzdevumam būtu atšķirīgs
- cp .indirect/docker-compose.yml ${CI_JOB_ID}/docker-compose.yml
script:
# palaižam mūsu vidi
- make docker-up
# palaidam testus kā izpildāmu jar (man tā ir)
- java -jar itest.jar --http-port ${TR_HTTP_PORT} --https-port ${TR_HTTPS_PORT}
# vai konteinerā
- docker run --network=testrail-network-${CI_JOB_ID:-local} --rm itest
after_script:
# vācam žurnālus
- make docker-logs
# apturējam vidi
- make docker-kill
artifacts:
# saglabājam žurnālus
when: always
paths:
- logs
expire_in: 30 daysUzdevuma palaišanas rezultātā artefakts direktorijā logs saturēs pakalpojumu un testu žurnālus. Tas ir ļoti ērti, ja rodas kļūdas. Man katrs tests paralēli raksta savu žurnālu, bet par to es pastāstīšu atsevišķi.

Runner tīrīšana
Uzdevums tiks palaists tikai pēc grafika.
posmi:
- attīrīšana
- būvniecība
- tests
Tīrīšanas izpildītājs:
posms: attīrīšana
tikai:
- grafiki
tags:
- my-shell-runner
script:
- make docker-cleanTālāk ejam uz mūsu GitLab projektu -> CI/CD -> Grafiki -> Jauns grafiks un pievienojam jaunu grafiku
Rezultāts
Palaist 4 uzdevumus GitLab CI
Integrācijas testu pēdējās uzdevumu žurnālos redzam konteinerus no dažādiem uzdevumiem
KONTEINERA ID NOSAUKUMI
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-204553539Detalizētāks žurnāls
$ docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
BRĪDINĀJUMS! Lietojot --password caur CLI, ir nesakārtoti. Lietojiet --password-stdin.
BRĪDINĀJUMS! Jūsu parole tiks saglabāta nešifrētā veidā \/home\/gitlab-runner\/.docker\/config.json.
Konfigurējiet akreditācijas palīdzību, lai novērstu šo brīdinājumu. Skatiet
https:\/\/docs.docker.com\/engine\/reference\/commandline\/login\/#credentials-store
Pierakstīšanās veiksmīga
$ 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
Kļūda: Šāds tīkls neeksistē: testrail-network-204645172
docker network create testrail-network-${CI_JOB_ID:-local}
0a59552b4464b8ab484de6ae5054f3d5752902910bacb0a7b5eca698766d0331
docker-compose -f ${CI_JOB_ID:-.indirect}\/docker-compose.yml pull
Vilciena tīmeklis ... pabeigts
Vilciena fpm ... pabeigts
Vilciena migrācija ... pabeigts
Vilciena db ... pabeigts
docker-compose -f ${CI_JOB_ID:-.indirect}\/docker-compose.yml up --force-recreate --renew-anon-volumes -d
Veidojot apjomu "204645172_static-content" ar noklusējuma draiveri
Veidojot testrail-mysql-204645172 ...
Veidojot testrail-mysql-204645172 ... pabeigts
Veidojot testrail-migrācija-204645172 ... pabeigts
Veidojot testrail-fpm-204645172 ... pabeigts
Veidojot testrail-web-204645172 ... pabeigts
docker ps
KONTEINERA ID ATTĒLS KOMANDA VEIDOT STATUSS PORTI NOSAUKUMS
c6b76f9135ed registry.gitlab.com\/touchbit\/image\/testrail\/web:latest "nginx -g 'daemon of…" 13 sekundes atpakaļ Darbojas 1 sekundi 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 sekundes atpakaļ Darbojas 13 sekundes 9000\/tcp testrail-fpm-204645172
2cdab1edbf6a registry.gitlab.com\/touchbit\/image\/testrail\/migration:latest "docker-entrypoint.s…" 16 sekundes atpakaļ Darbojas 13 sekundes 3306\/tcp, 33060\/tcp testrail-migration-204645172
826aaf7c0a29 mysql:5.7.22 "docker-entrypoint.s…" 18 sekundes atpakaļ Darbojas 16 sekundes 3306\/tcp testrail-mysql-204645172
6dbb3fae0322 registry.gitlab.com\/touchbit\/image\/testrail\/web:latest "nginx -g 'daemon of…" 36 sekundes atpakaļ Darbojas 22 sekundes 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 sekundes atpakaļ Darbojas 35 sekundes 9000\/tcp testrail-fpm-204645084
70fea72aa10d mysql:5.7.22 "docker-entrypoint.s…" 40 sekundes atpakaļ Darbojas 37 sekundes 3306\/tcp testrail-mysql-204645084
d8aa24b2892d registry.gitlab.com\/touchbit\/image\/testrail\/web:latest "nginx -g 'daemon of…" Aptuveni pirms minūtes Darbojas 53 sekundes 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…" Aptuveni pirms minūtes Darbojas Aptuveni minūti 9000\/tcp testrail-fpm-204644881
685d8023a3ec mysql:5.7.22 "docker-entrypoint.s…" Aptuveni pirms minūtes Darbojas Aptuveni minūti 3306\/tcp testrail-mysql-204644881
1cdfc692003a registry.gitlab.com\/touchbit\/image\/testrail\/web:latest "nginx -g 'daemon of…" Aptuveni pirms minūtes Darbojas Aptuveni minūti 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…" Aptuveni pirms minūtes Darbojas Aptuveni minūti 9000\/tcp testrail-fpm-204644793
029e16b26201 mysql:5.7.22 "docker-entrypoint.s…" Aptuveni pirms minūtes Darbojas Aptuveni minūti 3306\/tcp testrail-mysql-204644793
c10443222ac6 registry.gitlab.com\/touchbit\/image\/testrail\/web:latest "nginx -g 'daemon of…" Pirms 5 stundām Darbojas 5 stundas 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…" Pirms 5 stundām Darbojas 5 stundas 9000\/tcp testrail-fpm-204567103
6ae0accab28d mysql:5.7.22 "docker-entrypoint.s…" Pirms 5 stundām Darbojas 5 stundas 3306\/tcp testrail-mysql-204567103
b66b60d79e43 registry.gitlab.com\/touchbit\/image\/testrail\/web:latest "nginx -g 'daemon of…" Pirms 5 stundām Darbojas 5 stundas 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…" Pirms 5 stundām Darbojas 5 stundas 9000\/tcp testrail-fpm-204553690
a8879c5ef941 mysql:5.7.22 "docker-entrypoint.s…" Pirms 5 stundām Darbojas 5 stundas 3306\/tcp testrail-mysql-204553690
069954ba6010 registry.gitlab.com\/touchbit\/image\/testrail\/web:latest "nginx -g 'daemon of…" Pirms 5 stundām Darbojas 5 stundās 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…" Pirms 5 stundām Darbojas 5 stundās 9000\/tcp testrail-fpm-204553539
1a1eed057ea0 mysql:5.7.22 "docker-entrypoint.s…" Pirms 5 stundām Darbojas 5 stundās 3306\/tcp testrail-mysql-204553539Visas uzdevumus veiksmīgi pabeigti
Uzdevuma artefakti satur pakalpojumu un testu žurnālus
It kā viss ir kārtībā, bet ir viens nians. Pipeline var piespiedu kārtā atcelt laikā, kad tiek veikti integrācijas testi, un šajā gadījumā palaistie konteineri netiks apstādināti. Laikā pa laikam jānotīra runner. Diemžēl uzdevums par uzlabojumiem GitLab CE joprojām ir statusā
Bet mums ir pievienota uzdevuma izpilde pēc grafika, un neviens mums nepieprasa to palaist manuāli.
Pārejiet uz mūsu projektu -> CI/CD -> Grafiki un palaidiet uzdevumu Notīrīt runner
Kopā:
- Mums ir viens shell runner.
- Nav konfliktu starp uzdevumiem un vidi.
- Mums ir paralēla uzdevumu izpilde ar integrācijas testiem.
- Integrācijas testus var palaist gan lokāli, gan konteinerā.
- Pakalpojumu un testu žurnāli tiek vākti un pievienoti pipeline uzdevumam.
- Ir iespēja notīrīt runner no vecajiem docker attēliem.
Iestatīšanas laiks — ~2 stundas.
Nu, lūk, arī viss. Priecāšos saņemt atsauksmes.
Avots: habr.com
