GitLab 쉘 러너. Docker Compose를 사용하여 테스트된 서비스의 경쟁 출시

GitLab 쉘 러너. Docker Compose를 사용하여 테스트된 서비스의 경쟁 출시

이 기사는 테스터와 개발자 모두에게 흥미로울 것이지만 주로 인프라 리소스가 부족하거나 컨테이너 오케스트레이션이 없는 조건에서 통합 테스트를 위해 GitLab CI/CD를 설정하는 문제에 직면한 자동화 전문가를 위한 것입니다. 플랫폼. 단일 GitLab 셸 실행기에서 docker compose를 사용하여 테스트 환경 배포를 설정하는 방법과 여러 환경을 배포할 때 시작된 서비스가 서로 간섭하지 않도록 하는 방법을 알려드리겠습니다.


내용

Предпосылки

  1. 실제로는 통합 테스트가 프로젝트에서 "처리"되는 경우가 자주 발생했습니다. 그리고 종종 첫 번째이자 가장 중요한 문제는 통합 테스트가 수행되는 CI 파이프라인입니다. 개발중 서비스는 개발/단계 환경에서 수행됩니다. 이로 인해 몇 가지 문제가 발생했습니다.

    • 통합 테스트 중 특정 서비스의 결함으로 인해 데이터 파손으로 인해 테스트 회로가 손상될 수 있습니다. 손상된 JSON 형식으로 요청을 보내면 서비스가 중단되어 스탠드가 완전히 작동하지 않는 경우가 있었습니다.
    • 테스트 데이터가 증가함에 따라 테스트 회로의 속도가 느려집니다. 데이터베이스 정리/롤백에 대한 예를 설명하는 것은 의미가 없다고 생각합니다. 실제로 저는 이 절차가 순조롭게 진행된 프로젝트를 본 적이 없습니다.
    • 일반 시스템 설정을 테스트할 때 테스트 회로의 기능이 중단될 위험이 있습니다. 예를 들어 사용자/그룹/비밀번호/응용 프로그램 정책입니다.
    • 자동화된 테스트의 테스트 데이터는 수동 테스터의 삶을 어렵게 만듭니다.

    어떤 사람들은 좋은 자동 테스트가 그 후에 데이터를 정리해야 한다고 말할 것입니다. 나는 다음과 같은 주장에 반대합니다:

    • 다이나믹 스탠드는 사용이 매우 편리합니다.
    • API를 통해 시스템에서 모든 개체를 제거할 수 있는 것은 아닙니다. 예를 들어 개체 삭제 호출은 비즈니스 논리와 모순되기 때문에 구현되지 않았습니다.
    • API를 통해 객체를 생성하면 엄청난 양의 메타데이터가 생성될 수 있으며 이는 삭제하기가 어렵습니다.
    • 테스트 간에 종속성이 있으면 테스트를 실행한 후 데이터를 정리하는 과정이 골치 아픈 일이 됩니다.
    • API에 대한 추가 호출(내 의견으로는 타당하지 않음)
    • 그리고 주요 주장은 테스트 데이터가 데이터베이스에서 직접 삭제되기 시작할 때입니다. 이것이 진짜 PK/FK 서커스로 변하고 있습니다! 개발자로부터 "방금 기호를 추가/제거/이름 변경했는데 왜 100500개의 통합 테스트가 포착되었나요?"라는 말을 들었습니다.

    제 생각에는 가장 최적의 솔루션은 동적 환경입니다.

  2. 많은 사람들이 테스트 환경을 실행하기 위해 docker-compose를 사용하지만, CI/CD에서 통합 테스트를 수행할 때 docker-compose를 사용하는 사람은 거의 없습니다. 여기서는 kubernetes, swarm 및 기타 컨테이너 오케스트레이션 플랫폼을 고려하지 않습니다. 모든 회사에 그런 제품이 있는 것은 아닙니다. docker-compose.yml이 보편적이면 좋을 것입니다.
  3. 자체 QA 실행기가 있더라도 docker-compose를 통해 시작된 서비스가 서로 간섭하지 않도록 어떻게 보장할 수 있습니까?
  4. 테스트된 서비스의 로그를 수집하는 방법은 무엇입니까?
  5. 러너를 청소하는 방법?

내 프로젝트에 나만의 GitLab 실행기가 있는데 개발 중에 이러한 질문이 발생했습니다. 자바 클라이언트테스트레일. 보다 정확하게는 통합 테스트를 실행할 때입니다. 아래에서는 이 프로젝트의 예시를 사용하여 이러한 문제를 해결해 보겠습니다.

콘텐츠로 돌아가기

GitLab 쉘 러너

실행자의 경우 vCPU 4개, RAM 4GB, HDD 50GB를 갖춘 Linux 가상 머신을 권장합니다.
인터넷에 gitlab-runner 설정에 대한 많은 정보가 있으므로 간략하게 설명하면 다음과 같습니다.

  • SSH를 통해 머신에 로그인
  • RAM이 8GB 미만인 경우 권장합니다. 10GB 스왑을 만듭니다RAM 부족으로 인해 OOM 킬러가 와서 작업을 종료하지 않도록 합니다. 이는 5개 이상의 작업이 동시에 시작될 때 발생할 수 있습니다. 작업은 더 느리지만 꾸준하게 진행됩니다.

    OOM 킬러의 예

    작업 로그에 표시되는 경우 bash: line 82: 26474 Killed, 그런 다음 러너에서 실행하십시오. 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

    그림이 다음과 같으면 스왑을 추가하거나 RAM을 추가하십시오.

  • 세트 gitlab 러너, 도커, 도커 작성, 만들다.
  • 사용자 추가 gitlab-runner 그룹에 docker
    sudo groupadd docker
    sudo usermod -aG docker gitlab-runner
  • 등록하다 gitlab 러너.
  • 편집을 위해 열기 /etc/gitlab-runner/config.toml 그리고 추가하세요

    concurrent=20
    [[runners]]
      request_concurrency = 10

    이를 통해 하나의 러너에서 병렬 작업을 실행할 수 있습니다. 더 읽어보세요 여기에.
    예를 들어 vCPU 8개, RAM 16GB와 같이 더 강력한 머신을 사용하는 경우 이 수치를 최소 2배 이상 늘릴 수 있습니다. 그러나 그것은 모두 이 러너에서 정확히 무엇이 출시될 것인지, 그리고 수량은 얼마나 되는지에 달려 있습니다.

그만이다.

콘텐츠로 돌아가기

docker-compose.yml 준비 중

주요 작업은 개발자/테스터가 로컬 및 CI 파이프라인에서 모두 사용할 수 있는 범용 docker-compose.yml입니다.

먼저 CI에 대한 고유한 서비스 이름을 만듭니다. GitLab CI의 고유 변수 중 하나는 변수입니다. CI_JOB_ID. 당신이 지정하는 경우 container_name 의미를 가지고 "service-${CI_JOB_ID:-local}", 다음 경우에는:

  • CI_JOB_ID 환경 변수에 정의되지 않았습니다.
    그러면 서비스 이름은 다음과 같습니다. service-local
  • CI_JOB_ID 환경 변수(예: 123)에 정의되어 있습니다.
    그러면 서비스 이름은 다음과 같습니다. service-123

둘째, 출시된 서비스를 위한 공통 네트워크를 구축합니다. 이는 여러 테스트 환경을 실행할 때 네트워크 수준 격리를 제공합니다.

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

사실 이게 성공의 첫걸음이에요 =)

주석이 포함된 docker-compose.yml의 예

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

그러나 CI에서 실행하는 것이 그렇게 간단한 것은 아닙니다.

콘텐츠로 돌아가기

Makefile 준비

Makefile은 로컬 환경 관리와 CI 모두에서 매우 편리하기 때문에 사용합니다. 온라인 댓글 더보기

# У меня в проектах все вспомогательные вещи лежат в директории `.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

확인 중

도커업을 해라

$ 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
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 쉘 러너. Docker Compose를 사용하여 테스트된 서비스의 경쟁 출시

콘텐츠로 돌아가기

.gitlab-ci.yml 준비 중

통합 테스트 실행

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

이러한 작업을 실행하면 아티팩트의 로그 디렉터리에 서비스 및 테스트 로그가 포함됩니다. 오류가 발생하는 경우 매우 편리합니다. 각 테스트는 병렬로 자체 로그를 작성하지만 이에 대해서는 별도로 설명하겠습니다.

GitLab 쉘 러너. Docker Compose를 사용하여 테스트된 서비스의 경쟁 출시

콘텐츠로 돌아가기

러너 청소

작업은 일정에 따라서만 시작됩니다.

stages:
- clean
- build
- test

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

다음으로 GitLab 프로젝트 -> CI/CD -> 일정 -> 새 일정으로 이동하여 새 일정을 추가하세요.

GitLab 쉘 러너. Docker Compose를 사용하여 테스트된 서비스의 경쟁 출시

콘텐츠로 돌아가기

결과

GitLab CI에서 4개 작업 실행
GitLab 쉘 러너. Docker Compose를 사용하여 테스트된 서비스의 경쟁 출시

통합 테스트가 포함된 마지막 작업의 로그에는 다양한 작업의 컨테이너가 표시됩니다.

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

더 자세한 로그

$ 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 쉘 러너. Docker Compose를 사용하여 테스트된 서비스의 경쟁 출시

GitLab 쉘 러너. Docker Compose를 사용하여 테스트된 서비스의 경쟁 출시

모든 것이 아름다운 것 같지만 뉘앙스가 있습니다. 통합 테스트가 실행되는 동안 파이프라인을 강제 취소할 수 있으며, 이 경우 실행 중인 컨테이너는 중지되지 않습니다. 때때로 러너를 청소해야 합니다. 아쉽게도 GitLab CE 개선 과제는 아직 진행 중입니다. 엽니다

그러나 우리는 일정에 따라 작업 시작을 추가했으며 아무도 수동으로 실행하는 것을 금지하지 않습니다.
프로젝트 -> CI/CD -> 일정으로 이동하여 작업을 실행하세요. Clean runner

GitLab 쉘 러너. Docker Compose를 사용하여 테스트된 서비스의 경쟁 출시

총계 :

  • 쉘 러너가 하나 있습니다.
  • 작업과 환경 사이에는 충돌이 없습니다.
  • 통합 테스트를 통해 작업을 병렬로 실행합니다.
  • 로컬로 또는 컨테이너에서 통합 테스트를 실행할 수 있습니다.
  • 서비스 및 테스트 로그가 수집되어 파이프라인 작업에 첨부됩니다.
  • 이전 Docker 이미지에서 실행기를 정리할 수 있습니다.

설정 시간은 ~2시간입니다.
실제로 그게 전부입니다. 나는 피드백을 받게되어 기쁩니다.

콘텐츠로 돌아가기

출처 : habr.com

코멘트를 추가