GitLab Shell Runner. Konkurruese e ekzekutimit të shërbimeve të testuara me ndihmën e Docker Compose

GitLab Shell Runner. Konkurruese e ekzekutimit të shërbimeve të testuara me ndihmën e Docker Compose

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

  1. 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.

  2. 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.
  3. 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?
  4. Si të mbledhim log-et e shërbimeve që po testohen?
  5. Si të pastrojmë runner-in?

Kam një GitLab runner për projektet e mia dhe me këto pyetje kam përballur gjatë zhvillimit. Java klienti për TestRail. Më saktë gjatë ekzekutimit të testeve integruese. Këtu do t'i zgjidhim këto çështje me shembuj nga ky projekt.

Te përmbajtja

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 të bëni swap 10 GB, 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ë runner sudo 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:0kB

    Dhe nëse pamja duket kështu, atëherë ose shtoni swap, ose shtoni RAM.

  • Instalojmë gitlab-runner, docker, docker-compose, bëje.
  • Shtoni përdoruesin gitlab-runner në grupin docker
    sudo groupadd docker
    sudo usermod -aG docker gitlab-runner
  • Regjistroheni gitlab-runner.
  • Hapni për editim /etc/gitlab-runner/config.toml dhe shtoni

    concurrent=20
    [[runners]]
      request_concurrency = 10

    Kjo do të lejojë ekzekutimin e detyrave paralelisht në një ekzekutues. Lexoni më shumë në detaje këtu.
    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.

Te përmbajtja

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_ID nuk ë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:
      - default

Shembulli 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ërfundoi

Por nuk është aq e thjeshtë me ekzekutimin në CI.

Te përmbajtja

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

GitLab Shell Runner. Konkurruese e ekzekutimit të shërbimeve të testuara me ndihmën e Docker Compose

Te përmbajtja

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ë.

GitLab Shell Runner. Konkurruese e ekzekutimit të shërbimeve të testuara me ndihmën e Docker Compose

Te përmbajtja

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-clean

Më pas kalojmë në projektin tonë GitLab -> CI/CD -> Oraret -> Orari i Ri dhe shtojmë një orar të ri

GitLab Shell Runner. Konkurruese e ekzekutimit të shërbimeve të testuara me ndihmën e Docker Compose

Te përmbajtja

Rezultati

Nisim 4 detyra në GitLab CI
GitLab Shell Runner. Konkurruese e ekzekutimit të shërbimeve të testuara me ndihmën e Docker Compose

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-204553539

Regjistri 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-204553539

Të gjitha detyrat përfunduan me sukses

Artefaktet e detyrave përmbajnë logët e shërbimeve dhe testeve
GitLab Shell Runner. Konkurruese e ekzekutimit të shërbimeve të testuara me ndihmën e Docker Compose

GitLab Shell Runner. Konkurruese e ekzekutimit të shërbimeve të testuara me ndihmën e Docker Compose

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 Hapur

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

GitLab Shell Runner. Konkurruese e ekzekutimit të shërbimeve të testuara me ndihmën e Docker Compose

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.

Te përmbajtja

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster