프로호스터 > 블로그 > 관리 > GitLab 쉘 러너. Docker Compose를 사용하여 테스트된 서비스의 경쟁 출시
GitLab 쉘 러너. Docker Compose를 사용하여 테스트된 서비스의 경쟁 출시
이 기사는 테스터와 개발자 모두에게 흥미로울 것이지만 주로 인프라 리소스가 부족하거나 컨테이너 오케스트레이션이 없는 조건에서 통합 테스트를 위해 GitLab CI/CD를 설정하는 문제에 직면한 자동화 전문가를 위한 것입니다. 플랫폼. 단일 GitLab 셸 실행기에서 docker compose를 사용하여 테스트 환경 배포를 설정하는 방법과 여러 환경을 배포할 때 시작된 서비스가 서로 간섭하지 않도록 하는 방법을 알려드리겠습니다.
실제로는 통합 테스트가 프로젝트에서 "처리"되는 경우가 자주 발생했습니다. 그리고 종종 첫 번째이자 가장 중요한 문제는 통합 테스트가 수행되는 CI 파이프라인입니다. 개발중 서비스는 개발/단계 환경에서 수행됩니다. 이로 인해 몇 가지 문제가 발생했습니다.
통합 테스트 중 특정 서비스의 결함으로 인해 데이터 파손으로 인해 테스트 회로가 손상될 수 있습니다. 손상된 JSON 형식으로 요청을 보내면 서비스가 중단되어 스탠드가 완전히 작동하지 않는 경우가 있었습니다.
테스트 데이터가 증가함에 따라 테스트 회로의 속도가 느려집니다. 데이터베이스 정리/롤백에 대한 예를 설명하는 것은 의미가 없다고 생각합니다. 실제로 저는 이 절차가 순조롭게 진행된 프로젝트를 본 적이 없습니다.
일반 시스템 설정을 테스트할 때 테스트 회로의 기능이 중단될 위험이 있습니다. 예를 들어 사용자/그룹/비밀번호/응용 프로그램 정책입니다.
자동화된 테스트의 테스트 데이터는 수동 테스터의 삶을 어렵게 만듭니다.
어떤 사람들은 좋은 자동 테스트가 그 후에 데이터를 정리해야 한다고 말할 것입니다. 나는 다음과 같은 주장에 반대합니다:
다이나믹 스탠드는 사용이 매우 편리합니다.
API를 통해 시스템에서 모든 개체를 제거할 수 있는 것은 아닙니다. 예를 들어 개체 삭제 호출은 비즈니스 논리와 모순되기 때문에 구현되지 않았습니다.
API를 통해 객체를 생성하면 엄청난 양의 메타데이터가 생성될 수 있으며 이는 삭제하기가 어렵습니다.
테스트 간에 종속성이 있으면 테스트를 실행한 후 데이터를 정리하는 과정이 골치 아픈 일이 됩니다.
API에 대한 추가 호출(내 의견으로는 타당하지 않음)
그리고 주요 주장은 테스트 데이터가 데이터베이스에서 직접 삭제되기 시작할 때입니다. 이것이 진짜 PK/FK 서커스로 변하고 있습니다! 개발자로부터 "방금 기호를 추가/제거/이름 변경했는데 왜 100500개의 통합 테스트가 포착되었나요?"라는 말을 들었습니다.
제 생각에는 가장 최적의 솔루션은 동적 환경입니다.
많은 사람들이 테스트 환경을 실행하기 위해 docker-compose를 사용하지만, CI/CD에서 통합 테스트를 수행할 때 docker-compose를 사용하는 사람은 거의 없습니다. 여기서는 kubernetes, swarm 및 기타 컨테이너 오케스트레이션 플랫폼을 고려하지 않습니다. 모든 회사에 그런 제품이 있는 것은 아닙니다. docker-compose.yml이 보편적이면 좋을 것입니다.
자체 QA 실행기가 있더라도 docker-compose를 통해 시작된 서비스가 서로 간섭하지 않도록 어떻게 보장할 수 있습니까?
테스트된 서비스의 로그를 수집하는 방법은 무엇입니까?
러너를 청소하는 방법?
내 프로젝트에 나만의 GitLab 실행기가 있는데 개발 중에 이러한 질문이 발생했습니다. 자바 클라이언트 에 테스트레일. 보다 정확하게는 통합 테스트를 실행할 때입니다. 아래에서는 이 프로젝트의 예시를 사용하여 이러한 문제를 해결해 보겠습니다.
이를 통해 하나의 러너에서 병렬 작업을 실행할 수 있습니다. 더 읽어보세요 여기에.
예를 들어 vCPU 8개, RAM 16GB와 같이 더 강력한 머신을 사용하는 경우 이 수치를 최소 2배 이상 늘릴 수 있습니다. 그러나 그것은 모두 이 러너에서 정확히 무엇이 출시될 것인지, 그리고 수량은 얼마나 되는지에 달려 있습니다.
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
$ 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
모든 작업이 성공적으로 완료되었습니다
작업 아티팩트에는 서비스 및 테스트 로그가 포함됩니다.
모든 것이 아름다운 것 같지만 뉘앙스가 있습니다. 통합 테스트가 실행되는 동안 파이프라인을 강제 취소할 수 있으며, 이 경우 실행 중인 컨테이너는 중지되지 않습니다. 때때로 러너를 청소해야 합니다. 아쉽게도 GitLab CE 개선 과제는 아직 진행 중입니다. 엽니다
그러나 우리는 일정에 따라 작업 시작을 추가했으며 아무도 수동으로 실행하는 것을 금지하지 않습니다.
프로젝트 -> CI/CD -> 일정으로 이동하여 작업을 실행하세요. Clean runner