ProHoster > Блог > Administrasi > GitLab Shell Runner. Bukak kompetitif layanan sing diuji nggunakake Docker Compose
GitLab Shell Runner. Bukak kompetitif layanan sing diuji nggunakake Docker Compose
Artikel iki bakal dadi kapentingan kanggo penguji lan pangembang, nanging utamane kanggo spesialis otomatisasi sing ngadhepi masalah nyetel GitLab CI/CD kanggo tes integrasi ing kahanan sumber daya infrastruktur sing ora cukup lan / utawa ora ana wadhah. platform orkestrasi. Aku bakal pitutur marang kowe carane nyiyapake panyebaran lingkungan test nggunakake docker nulis ing siji GitLab shell runner lan supaya nalika deploying sawetara lingkungan, layanan dibukak ora ngganggu siji liyane.
Ing praktikku, asring kedadeyan yen tes integrasi "dirawat" ing proyek. Lan asring masalah pisanan lan paling penting yaiku pipa CI, ing ngendi tes integrasi dikembangake layanan (e) ditindakake ing lingkungan dev/tataran. Iki nyebabake sawetara masalah:
Amarga cacat ing layanan tartamtu sajrone tes integrasi, sirkuit tes bisa rusak amarga data sing rusak. Ana kasus nalika ngirim panjalukan kanthi format JSON sing rusak nabrak layanan kasebut, sing ndadekake stand kasebut ora bisa digunakake.
Slowdown saka sirkuit test minangka data test mundhak. Aku iku ndadekake ora pangertèn kanggo njlèntrèhaké conto karo reresik / muter maneh database. Ing praktikku, aku durung nemoni proyek sing prosedur iki lancar.
Risiko ngganggu fungsi sirkuit test nalika nyoba setelan sistem umum. Contone, pangguna / grup / sandhi / kabijakan aplikasi.
Data tes saka tes otomatis nggawe urip angel kanggo penguji manual.
Sawetara bakal ujar manawa tes otomatis sing apik kudu ngresiki data sawise awake dhewe. Aku duwe argumentasi marang:
Stand dinamis trep banget kanggo digunakake.
Ora saben obyek bisa dibusak saka sistem liwat API. Contone, telpon kanggo mbusak obyek ora dileksanakake amarga mbantah logika bisnis.
Nalika nggawe obyek liwat API, jumlah metadata sing akeh bisa digawe, sing bakal dadi masalah kanggo mbusak.
Yen tes duwe ketergantungan ing antarane awake dhewe, mula proses ngresiki data sawise nganakake tes dadi pusing.
Tambahan (lan, ing mratelakake panemume, ora sabdho) telpon kanggo API.
Lan argumen utama: nalika data tes wiwit dibusak langsung saka database. Iki malih dadi sirkus PK/FK nyata! Kita krungu saka pangembang: "Aku mung nambah / mbusak / ngganti jeneng tandha, kenapa 100500 tes integrasi kejiret?"
Miturut pendapatku, solusi sing paling optimal yaiku lingkungan dinamis.
Akeh wong nggunakake docker-compose kanggo mbukak lingkungan test, nanging sawetara wong nggunakake docker-compose nalika nindakake testing integrasi ing CI/CD. Lan ing kene aku ora njupuk akun kubernetes, swarm lan platform orkestrasi wadhah liyane. Ora saben perusahaan duwe. Luwih becik yen docker-compose.yml universal.
Sanajan kita duwe pelari QA dhewe, kepiye kita bisa mesthekake yen layanan sing diluncurake liwat docker-compose ora ngganggu saben liyane?
Kepiye cara ngumpulake log layanan sing diuji?
Carane ngresiki runner?
Aku duwe pelari GitLab dhewe kanggo proyekku lan aku nemoni pitakonan kasebut sajrone pembangunan klien Jawa kanggo TestRail. Luwih tepat, nalika nindakake tes integrasi. Ing ngisor iki kita bakal ngrampungake masalah kasebut kanthi nggunakake conto saka proyek iki.
Kanggo runner, Aku nyaranake mesin virtual Linux karo 4 vCPU, 4 GB RAM, 50 GB HDD.
Ana akeh informasi babagan nyiyapake gitlab-runner ing Internet, kanthi ringkes:
Mlebet mesin liwat SSH
Yen sampeyan duwe kurang saka 8 GB RAM, aku nyaranake nggawe swap 10 GBsupaya pembunuh OOM ora teka lan mateni tugas kita amarga kekurangan RAM. Iki bisa kedadeyan yen luwih saka 5 tugas diluncurake bebarengan. Tugas bakal maju luwih alon, nanging ajeg.
Conto karo pembunuh OOM
Yen sampeyan ndeleng ing log tugas bash: line 82: 26474 Killed, banjur mung nglakokaké ing runner 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
Lan yen gambar katon kaya iki, banjur nambah swap utawa nambah RAM.
Iki bakal ngidini sampeyan mbukak tugas paralel ing siji pelari. Waca liyane kene.
Yen sampeyan duwe mesin luwih kuat, contone 8 vCPU, 16 GB RAM, banjur nomer iki bisa digawe paling 2 kaping luwih gedhe. Nanging kabeh gumantung apa sing bakal diluncurake ing pelari iki lan jumlahe.
Tugas utama yaiku docker-compose.yml universal, sing bisa digunakake para pangembang / penguji kanthi lokal lan ing pipa CI.
Kaping pisanan, kita nggawe jeneng layanan unik kanggo CI. Salah sawijining variabel unik ing GitLab CI yaiku variabel CI_JOB_ID. Yen sampeyan nemtokake container_name kanthi teges "service-${CI_JOB_ID:-local}", banjur ing kasus:
yen CI_JOB_ID ora ditetepake ing variabel lingkungan,
banjur jeneng layanan bakal service-local
yen CI_JOB_ID ditetepake ing variabel lingkungan (contone 123),
banjur jeneng layanan bakal service-123
Kapindho, kita nggawe jaringan umum kanggo layanan sing diluncurake. Iki menehi kita isolasi tingkat jaringan nalika mbukak macem-macem lingkungan tes.
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
Minangka asil nglakokake tugas kasebut, direktori log ing artefak bakal ngemot log layanan lan tes. Sing trep banget yen ana kesalahan. Saben tes ing podo karo nulis log dhewe, nanging aku bakal ngomong babagan iki kanthi kapisah.
$ 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
Kabeh tugas rampung kasil
Artefak tugas ngemot log layanan lan tes
Kabeh katon ayu, nanging ana nuansa. Pipeline bisa dibatalake kanthi paksa nalika tes integrasi lagi mlaku, lan kontainer sing mlaku ora bakal mandheg. Saka wektu kanggo wektu sampeyan kudu ngresiki runner. Sayange, tugas kanggo perbaikan ing GitLab CE isih ana ing status Open
Nanging kita wis nambahake peluncuran tugas miturut jadwal, lan ora ana sing nglarang kita mbukak kanthi manual.
Pindhah menyang proyek kita -> CI / CD -> Jadwal lan jalanake tugas kasebut Clean runner
Total:
Kita duwe siji pelari cangkang.
Ora ana konflik antarane tugas lan lingkungan.
Kita mbukak tugas kanthi tes integrasi kanthi paralel.
Sampeyan bisa nindakake tes integrasi kanthi lokal utawa ing wadhah.
Log layanan lan tes diklumpukake lan dipasang ing tugas pipa.
Sampeyan bisa ngresiki runner saka gambar Docker lawas.
Wektu persiyapan yaiku ~ 2 jam.
Sing kabeh, bener. Aku bakal seneng nampa umpan balik.