GitLab Shell Runner. Competitive na paglulunsad ng mga nasubok na serbisyo gamit ang Docker Compose

GitLab Shell Runner. Competitive na paglulunsad ng mga nasubok na serbisyo gamit ang Docker Compose

Magiging interesado ang artikulong ito sa parehong mga tester at developer, ngunit pangunahing inilaan para sa mga espesyalista sa automation na nahaharap sa problema sa pag-set up ng GitLab CI/CD para sa integration testing sa mga kondisyon ng hindi sapat na mapagkukunan ng imprastraktura at/o ang kawalan ng container platform ng orkestra. Sasabihin ko sa iyo kung paano i-set up ang deployment ng mga environment ng pagsubok gamit ang docker compose sa isang solong GitLab shell runner at para kapag nagde-deploy ng ilang environment, ang mga inilunsad na serbisyo ay hindi makagambala sa isa't isa.


nilalaman

ΠŸΡ€Π΅Π΄ΠΏΠΎΡΡ‹Π»ΠΊΠΈ

  1. Sa aking pagsasanay, madalas na nangyari na ang pagsubok sa pagsasama ay "ginagamot" sa mga proyekto. At madalas ang una at pinakamahalagang problema ay ang CI pipeline, kung saan ang integration testing Ginagawa pa lamang (mga) serbisyo ay isinasagawa sa isang dev/stage environment. Nagdulot ito ng kaunting problema:

    • Dahil sa mga depekto sa isang partikular na serbisyo sa panahon ng integration testing, ang test circuit ay maaaring masira ng sirang data. May mga kaso kapag ang pagpapadala ng kahilingan na may sirang JSON na format ay nag-crash sa serbisyo, na naging ganap na hindi nagagamit ang stand.
    • Paghina ng test circuit habang tumataas ang data ng pagsubok. Sa tingin ko ay walang saysay na ilarawan ang isang halimbawa sa paglilinis/pag-roll back ng database. Sa aking pagsasanay, hindi ako nakatagpo ng isang proyekto kung saan naging maayos ang pamamaraang ito.
    • Panganib na maabala ang functionality ng test circuit kapag sinusubukan ang mga pangkalahatang setting ng system. Halimbawa, patakaran ng user/grupo/password/application.
    • Ang data ng pagsubok mula sa mga awtomatikong pagsubok ay nagpapahirap sa buhay para sa mga manu-manong tester.

    Ang ilan ay magsasabi na ang magagandang autotest ay dapat linisin ang data pagkatapos ng kanilang sarili. Mayroon akong mga argumento laban sa:

    • Ang mga dynamic na stand ay napaka-maginhawang gamitin.
    • Hindi lahat ng bagay ay maaaring alisin sa system sa pamamagitan ng API. Halimbawa, ang isang tawag upang tanggalin ang isang bagay ay hindi ipinatupad dahil sumasalungat ito sa lohika ng negosyo.
    • Kapag lumilikha ng isang bagay sa pamamagitan ng API, isang malaking halaga ng metadata ang maaaring malikha, na may problemang tanggalin.
    • Kung ang mga pagsubok ay may mga dependency sa kanilang mga sarili, kung gayon ang proseso ng paglilinis ng data pagkatapos magpatakbo ng mga pagsubok ay nagiging sakit ng ulo.
    • Karagdagang (at, sa palagay ko, hindi makatwiran) na mga tawag sa API.
    • At ang pangunahing argumento: kapag ang data ng pagsubok ay nagsimulang i-clear nang direkta mula sa database. Ito ay nagiging isang tunay na PK/FK circus! Naririnig namin mula sa mga developer: "Kakadagdag ko lang/tinanggal/pinalitan ang pangalan ng isang sign, bakit 100500 integration test ang nahuli?"

    Sa palagay ko, ang pinakamainam na solusyon ay isang pabago-bagong kapaligiran.

  2. Maraming tao ang gumagamit ng docker-compose upang magpatakbo ng isang pagsubok na kapaligiran, ngunit kakaunti ang gumagamit ng docker-compose kapag nagsasagawa ng integration testing sa CI/CD. At dito hindi ko isinasaalang-alang ang mga kubernetes, swarm at iba pang mga platform ng orkestrasyon ng lalagyan. Hindi lahat ng kumpanya ay mayroon nito. Mas maganda kung ang docker-compose.yml ay unibersal.
  3. Kahit na mayroon tayong sariling QA runner, paano natin matitiyak na ang mga serbisyong inilunsad sa pamamagitan ng docker-compose ay hindi makakasagabal sa isa't isa?
  4. Paano mangolekta ng mga log ng mga nasubok na serbisyo?
  5. Paano linisin ang runner?

Mayroon akong sariling GitLab runner para sa aking mga proyekto at nakatagpo ako ng mga tanong na ito sa panahon ng pag-unlad Java client para sa TestRail. Mas tiyak, kapag nagpapatakbo ng mga pagsubok sa pagsasama. Sa ibaba ay malulutas namin ang mga isyung ito gamit ang mga halimbawa mula sa proyektong ito.

Sa nilalaman

GitLab Shell Runner

Para sa isang runner, inirerekomenda ko ang isang Linux virtual machine na may 4 vCPU, 4 GB RAM, 50 GB HDD.
Mayroong maraming impormasyon sa pag-set up ng gitlab-runner sa Internet, kaya sa madaling sabi:

  • Mag-login sa makina sa pamamagitan ng SSH
  • Kung mayroon kang mas mababa sa 8 GB ng RAM, inirerekumenda ko gumawa ng swap 10 GBpara hindi dumating ang OOM killer at patayin ang ating mga gawain dahil sa kakulangan ng RAM. Maaaring mangyari ito kapag higit sa 5 gawain ang sabay-sabay na inilunsad. Ang mga gawain ay uunlad nang mas mabagal, ngunit tuluy-tuloy.

    Halimbawa sa OOM killer

    Kung nakikita mo sa mga tala ng gawain bash: line 82: 26474 Killed, tapos i-execute lang sa 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

    At kung ganito ang hitsura ng larawan, pagkatapos ay magdagdag ng swap o magdagdag ng RAM.

  • Itakda gitlab-runner, docker, docker-compose, gumawa.
  • Pagdaragdag ng user gitlab-runner sa pangkat docker
    sudo groupadd docker
    sudo usermod -aG docker gitlab-runner
  • Magrehistro gitlab-runner.
  • Bukas para sa pag-edit /etc/gitlab-runner/config.toml at idagdag

    concurrent=20
    [[runners]]
      request_concurrency = 10

    Papayagan ka nitong magpatakbo ng mga parallel na gawain sa isang runner. Magbasa pa dito.
    Kung mayroon kang mas malakas na makina, halimbawa 8 vCPU, 16 GB RAM, ang mga numerong ito ay maaaring gawin nang hindi bababa sa 2 beses na mas malaki. Ngunit ang lahat ay nakasalalay sa kung ano ang eksaktong ilulunsad sa runner na ito at sa kung anong dami.

Iyan ay sapat.

Sa nilalaman

Inihahanda ang docker-compose.yml

Ang pangunahing gawain ay isang unibersal na docker-compose.yml, na magagamit ng mga developer/tester sa lokal at sa CI pipeline.

Una sa lahat, gumagawa kami ng mga natatanging pangalan ng serbisyo para sa CI. Ang isa sa mga natatanging variable sa GitLab CI ay ang variable CI_JOB_ID. Kung tinukoy mo container_name may kahulugan "service-${CI_JOB_ID:-local}", pagkatapos ay sa kaso:

  • kung CI_JOB_ID hindi tinukoy sa mga variable ng kapaligiran,
    pagkatapos ay ang pangalan ng serbisyo ay magiging service-local
  • kung CI_JOB_ID tinukoy sa mga variable ng kapaligiran (halimbawa 123),
    pagkatapos ay ang pangalan ng serbisyo ay magiging service-123

Pangalawa, lumikha kami ng isang karaniwang network para sa mga inilunsad na serbisyo. Nagbibigay ito sa amin ng paghihiwalay sa antas ng network kapag nagpapatakbo ng maraming kapaligiran ng pagsubok.

networks:
  default:
    external:
      name: service-network-${CI_JOB_ID:-local}

Sa totoo lang, ito ang unang hakbang sa tagumpay =)

Halimbawa ng aking docker-compose.yml na may mga komento

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

Halimbawa ng lokal na run

docker-compose -f docker-compose.yml up -d
Starting   testrail-mysql-local     ... done
Starting   testrail-migration-local ... done
Starting   testrail-fpm-local       ... done
Recreating testrail-web-local       ... done

Ngunit hindi lahat ay napakasimple sa paglulunsad sa CI.

Sa nilalaman

Paghahanda ng Makefile

Gumagamit ako ng Makefile dahil ito ay napaka-maginhawa para sa lokal na pamamahala sa kapaligiran at sa CI. Higit pang mga online na komento

# Π£ мСня Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… всС Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ Π»Π΅ΠΆΠ°Ρ‚ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ `.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

Suriin

gumawa ng 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

gumawa ng mga docker-log

$ 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 Shell Runner. Competitive na paglulunsad ng mga nasubok na serbisyo gamit ang Docker Compose

Sa nilalaman

Inihahanda ang .gitlab-ci.yml

Pagpapatakbo ng mga pagsubok sa pagsasama

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

Bilang resulta ng pagpapatakbo ng naturang gawain, ang direktoryo ng mga log sa mga artifact ay maglalaman ng mga log ng serbisyo at pagsubok. Na kung saan ay napaka-maginhawa sa kaso ng mga error. Ang bawat pagsubok na magkatulad ay nagsusulat ng sarili nitong log, ngunit pag-uusapan ko ito nang hiwalay.

GitLab Shell Runner. Competitive na paglulunsad ng mga nasubok na serbisyo gamit ang Docker Compose

Sa nilalaman

Nililinis ang runner

Ang gawain ay ilulunsad lamang ayon sa isang iskedyul.

stages:
- clean
- build
- test

Clean runner:
  stage: clean
  only:
    - schedules
  tags:
    - my-shell-runner
  script:
    - make docker-clean

Susunod, pumunta sa aming proyekto sa GitLab -> CI/CD -> Mga Iskedyul -> Bagong Iskedyul at magdagdag ng bagong iskedyul

GitLab Shell Runner. Competitive na paglulunsad ng mga nasubok na serbisyo gamit ang Docker Compose

Sa nilalaman

Resulta

Paglulunsad ng 4 na gawain sa GitLab CI
GitLab Shell Runner. Competitive na paglulunsad ng mga nasubok na serbisyo gamit ang Docker Compose

Sa mga log ng huling gawain na may mga pagsubok sa pagsasama nakikita namin ang mga lalagyan mula sa iba't ibang mga gawain

CONTAINER ID  NAMES
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

Mas detalyadong log

$ 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

Matagumpay na natapos ang lahat ng gawain

Ang mga artifact ng gawain ay naglalaman ng mga log ng serbisyo at pagsubok
GitLab Shell Runner. Competitive na paglulunsad ng mga nasubok na serbisyo gamit ang Docker Compose

GitLab Shell Runner. Competitive na paglulunsad ng mga nasubok na serbisyo gamit ang Docker Compose

Ang lahat ay tila maganda, ngunit mayroong isang nuance. Maaaring puwersahang kanselahin ang pipeline habang tumatakbo ang mga integration test, kung saan ang mga tumatakbong container ay hindi ititigil. Paminsan-minsan kailangan mong linisin ang runner. Sa kasamaang palad, ang gawain para sa pagpapabuti sa GitLab CE ay nasa status pa rin Pagbubukas

Ngunit idinagdag namin ang paglulunsad ng isang gawain ayon sa isang iskedyul, at walang sinuman ang nagbabawal sa amin na patakbuhin ito nang manu-mano.
Pumunta sa aming proyekto -> CI/CD -> Mga Iskedyul at patakbuhin ang gawain Clean runner

GitLab Shell Runner. Competitive na paglulunsad ng mga nasubok na serbisyo gamit ang Docker Compose

Kabuuan:

  • Mayroon kaming isang shell runner.
  • Walang mga salungatan sa pagitan ng mga gawain at kapaligiran.
  • Nagpapatakbo kami ng mga gawain na may mga pagsubok sa pagsasama nang magkatulad.
  • Maaari kang magpatakbo ng mga pagsubok sa pagsasama nang lokal o sa isang lalagyan.
  • Ang mga log ng serbisyo at pagsubok ay kinokolekta at ikinakabit sa gawain ng pipeline.
  • Posibleng linisin ang runner mula sa mga lumang larawan ng Docker.

Ang oras ng pag-setup ay ~2 oras.
Iyon lang, actually. Ikatutuwa kong makatanggap ng feedback.

Sa nilalaman

Pinagmulan: www.habr.com

Magdagdag ng komento