Рубрики
Uncategorized

Интеграционное тестирование в нескольких репо с CodeFresh

Допустим, вы похожи на меня, и у вас есть проект, который состоит из PHP (🤮) … или угловой A … Tagged с CodeFresh, Docker, тестированием, DevOps.

Скажем так Бэкэнд услуги.

Ваша цель состоит в том, чтобы убедиться, что изменения в бэкэнде не сломают передний тренд … что «исправление» строки в коде 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»