Скажем так Бэкэнд услуги.
Ваша цель состоит в том, чтобы убедиться, что изменения в бэкэнде не сломают передний тренд … что «исправление» строки в коде PHP не нарушает встроенные приложения (угловой, реагировать или что -то еще) И вы не хотите иметь шесть разных трубопроводов Запуск тех же интеграционных тестов!
Если вы похожи на меня … вам также не нравится поддерживать несколько трубопроводов для тестирования интеграции. И если ты все еще Как и я … вы уже используете CodeFresh и Cypress. Итак, давайте сделаем трубопроводы CodeFresh немного более подлежащими обслуживанию.
На высоком уровне … у нас должны быть следующие контейнеры:
- приложение с комплексным реагированием (построено и обслуживается Nginx)
- приложение PHP
- Бэкэнд -прокси -сервис
- Бэкэнд внутренняя услуга
- (Наверное, база данных … Auth … может быть гораздо больше вещей …)
- Cypress Integration Tests
Приложение PHP тянет пакет React в … Приложение React связывается с прокси -службой … что связано с внутренней службой.
И допустим, что если вы внесете изменения в одну кодовую базу, вы хотите провести тест Cypress, который проходит полное сквозное тестирование на всех из них.
Технология используется
CodeFresh и Cypress 🔥 … зайдите на их сайты … Их документы хорошо написаны, и я не могу справиться с ними. Я некоторое время пользуюсь кипарисом (Эта статья на самом деле не об этом) И я использую CodeFresh в течение ~ 3 недели.
CodeFresh это инструмент CI/CD, который очень прост в использовании с Docker/Docker-Compose (среди прочего).
Кипарис это сквозное инструмент тестирования, который является сверхбыстрым и очень легким для использования.
Архитектура трубопровода
Цель состоит в том, чтобы каждый репо создавал свое собственное изображение, проделал свой собственный модульный тестирование, а затем «Первичный» трубопровод (репо с изменением кода) должен затем начать отдельный конвейер интеграционного тестирования, который втягивает другие изображения.
Если бы мы были ленивы … Легко сделать, чтобы провести тестирование интеграционного тестирования. это в том же конвейере по модульному тестированию. В конечном счете, у вас будет один меньший трубопровод и 100 -х линий YAML, дублированные по всей вашей кодовой базе. Это было бы безумно медленным.
Хитрость здесь состоит в том, чтобы убедиться, что вы не восстанавливаете каждое изображение каждый раз, когда вы запускаете свои интеграционные тесты … и ответ на это — использовать Команда CodeFresh Run Чтобы пройти в переменные среды, которые включают тег, которые должны использовать интеграционные тесты.
Трубопровод для тестируемого проекта
Вот упрощенный трубопровод для гипотетического приложения React, который имеет некоторые изменения кода.
… и ямл …
version: '1.0' steps: # clone step... main_clone: stage: build git: github title: Cloning main repository... type: git-clone repo: '${{CF_REPO_OWNER}}/${{CF_REPO_NAME}}' revision: '${{CF_REVISION}}' # Dockerfile bundles the react app react_image: title: Building React app stage: build type: build image_name: '${{CF_REPO_OWNER}}/${{CF_REPO_NAME}}' dockerfile: Dockerfile tag: '${{CF_BRANCH_TAG_NORMALIZED_LOWER}}-${{CF_SHORT_REVISION}}' # e2e_test uses the codefresh cli to launch a separate pipeline e2e_test: title: E2E Tests stage: test image: 'codefresh/cli:latest' # the -v pass in separate environment variables to the next pipeline command: >- codefresh run codefresh_project_name/integration_pipeline -v CYPRESS_TAG=latest -v REACT_TAG=${{CF_BRANCH_TAG_NORMALIZED_LOWER}}-${{CF_SHORT_REVISION}} -v PHP_TAG=latest -v PROXY_TAG=latest -v INTERNAL_TAG=latest # PROBABLY some unit tests / other tests specific to this specific # project in here... probably done in parallel... # once the test passes while in master, tag this image with latest publish_stable: type: push stage: publish title: Tag Stable Project candidate: '${{react_image}}' tags: - STABLE image_name: martzcodes/project when: branch: only: - master steps: - name: e2e_test 'on': - success stages: - build - test - publish
Ключ здесь являются параметры среды, передаваемые в конвейер интеграции. Тестируемое изображение помечено названием ветви и коротким хэш … Все остальное использует тег «Последний». Смотрите CodeFresh запустить документы Чтобы получить больше информации.
Интеграционная конвейер
Конвейер интеграции использует эти переменные среды, чтобы вытащить тег правильных изображений. Изображения, которые не были изменены, используют «последний» стабильный код, в то время как в тестировании изображения используется соглашение о тегах Branch-short_hash.
version: '1.0' stages: - test steps: e2e_composition: title: The Actual End-to-End tests stage: test type: composition description: Validate that one projects changes didn't break things fail_fast: true working_directory: ./ composition_candidates: e2e_tests: image: path/to/cypress/tests:${{CYPRESS_TAG}} # sleep 30 is to wait for services to start up... # ...could use something like wait-for-it instead entrypoint: bash -c "sleep 30 && cypress run" # these are helpful for debugging, but optional environment: - 'DEBUG=cypress:electron' - ELECTRON_ENABLE_LOGGING=true depends_on: - react-app - php-app - proxy-service - internal-service networks: martzcodes: null # NOTE: A COMPOSITION IS BASICALLY A DOCKER-COMPOSE FILE composition: version: '2' services: react-app: image: path/to/react/app/image:${{REACT_TAG}} container_name: react-app networks: martzcodes: php-app: image: path/to/php/app/image:${{PHP_TAG}} container_name: php-app networks: martzcodes: proxy-service: image: path/to/proxy/service/image:${{PROXY_TAG}} container_name: proxy-service networks: martzcodes: internal-service: image: path/to/internal/service/image:${{INTERNAL_TAG}} container_name: internal-service networks: martzcodes: networks: martzcodes:
Это всего лишь один шаг, но если у вас были другие виды тестов, которые вам нужно сделать во всем приложении (тестирование производительности, что угодно) … вы также можете сделать их здесь.
Одна аккуратная вещь, чтобы отметить: эта запись композиции в интеграции файла YAML … Это та же структура, что и файл с композитом Docker. Вы даже можете хранить его отдельно (с аналогичной настройкой, которую я могу просто сделать docker -compose -f codefresh -composition.yml up -d
и быть полезным … единственное, о чем следует знать, это Codefresh и Docker Используйте разные строковые интерполяции
Резюме
Концепция отдельного конвейера по тестированию интеграции очень легко расширить … если вы можете логически разделить свое приложение (например … несколько отдельных приложений React внутри приложения PHP) … у каждого может быть собственная цепочка интеграции .. Анкет Но если бы что -то в приложении PHP изменилось бы, вы хотели бы проверить их все.
Полностью случайный пример будет что -то вроде …
Этот пример по-прежнему будет много трубопроводов, но, по крайней мере, они будут логически разбиты и легче повторно использовать.
Но есть проблема …
Это ломается, если вы работаете над историей/выполняете несколько запросов на тягу, которые проходят через несколько репо, которые зависят друг от друга … У меня действительно нет хорошего способа обойти это.
Если у вас есть какие -либо предложения по таким случаям … дайте мне знать!
Оригинал: «https://dev.to/martzcodes/integration-testing-across-multiple-repos-with-codefresh-1dh3»