Рубрики
Uncategorized

Тестирование дыма в CI / CD трубопроводов

Вот общая ситуация, которая возмущает множество команд развития. Вы запускаете приложение через … Теги с CICD, тестированием, Circleci.

Вот общая ситуация, которая возмущает множество команд развития. Вы запускаете приложение через ваш CI/CD-трубопровод и все тесты пропускают, что отлично. Но когда вы развертываете его в живую целевую среду, приложение просто не работает должным образом. Вы не всегда можете предсказать, что произойдет, когда ваше приложение нажато в прямом эфире. Решение? Дымовые испытания предназначены для выявления этих типов сбоев, рано, выполняя тестовые случаи, которые охватывают критические компоненты и функциональные возможности приложения. Они также гарантируют, что приложение будет функционировать, как ожидалось, в развернутом сценарии. При реализации дымовые испытания часто выполняются на каждом сборке приложений, чтобы проверить, что базовые, но критические функциональные возможности проходят перед перепрыгнутым в более широкие и поглощение времени тестирования. Дымовые испытания помогают создавать быстрые петли обратной связи, которые жизненно важны для жизненного цикла разработки программного обеспечения.

В этом посту я продемонстрирую, как добавить тестирование дыма на стадию развертывания трубопровода CI/CD. Тестирование дыма тестирует простые аспекты развертывания пост приложения.

Технологии, используемые для тестирования дыма

Этот пост будет ссылаться на следующие технологии:

Предварительные условия

Этот пост зависит от конфигураций и кода, которые включены в моем предыдущем посте Автоматизируйте выбросы от ваших трубопроводов с использованием инфраструктуры в виде кода Отказ Полный исходный код можно найти в Это репо Отказ

Получить больше всего из дымовых испытаний

Дымовые испытания отлично подходят для воздействия неожиданных ошибок сборки, ошибок подключения и для проверки ожидаемого ответа сервера после того, как новый выпуск развернут в целевой среде. Например, быстрый простой дымовой тест может подтвердить, что приложение доступно и отвечает с ожидаемыми кодами ответов, таких как ОК 200 , 300 , 301 , 404 , и т.д. Примеры в этом посте проверят, что развернутое приложение отвечает на ОК 200 Код сервера и также проведет, что содержимое страницы по умолчанию отображает ожидаемый текст.

Запуск CI/CD трубопроводов без дымовых испытаний

Давайте посмотрим на примерной конфигурацию трубопровода, который предназначен для запуска модульных тестов, сборки и нажимает изображение докера в Docker Hub. Трубопровод также использует Инфраструктура как код ( Pulumi ) Чтобы обеспечить новый кластер двигателя Google Kubernetes (GKE) и развернуть этот выпуск в кластер. Этот пример конфигурации трубопровода не реализует тесты дыма. Пожалуйста, имейте в виду, что если вы запустите этот конкретный пример трубопровода, будет создан новый кластер GKE и будет жить, пока вы не запустите вручную Пулуби уничтожить Команда прекратить все ее инфраструктуру.

Осторожно: Не заканчивая инфраструктуру приведет к неожиданным затратам.

version: 2.1
orbs:
  pulumi: pulumi/pulumi@2.0.0
jobs:
  build_test:
    docker:
      - image: cimg/python:3.8.1
        environment:
          PIPENV_VENV_IN_PROJECT: 'true'
    steps:
      - checkout
      - run:
          name: Install Python Dependencies
          command: |
            pipenv install --skip-lock
      - run:
          name: Run Tests
          command: |
            pipenv run pytest
  build_push_image:
    docker:
      - image: cimg/python:3.8.1
    steps:
      - checkout
      - setup_remote_docker:
          docker_layer_caching: false
      - run:
          name: Build and push Docker image
          command: |       
            pipenv install --skip-lock
            pipenv run pip install --upgrade 'setuptools<45.0.0'
            pipenv run pyinstaller -F hello_world.py
            echo 'export TAG=${CIRCLE_SHA1}' >> $BASH_ENV
            echo 'export IMAGE_NAME=orb-pulumi-gcp' >> $BASH_ENV
            source $BASH_ENV
            docker build -t $DOCKER_LOGIN/$IMAGE_NAME -t $DOCKER_LOGIN/$IMAGE_NAME:$TAG .
            echo $DOCKER_PWD | docker login -u $DOCKER_LOGIN --password-stdin
            docker push $DOCKER_LOGIN/$IMAGE_NAME
  deploy_to_gcp:
    docker:
      - image: cimg/python:3.8.1
        environment:
          CLOUDSDK_PYTHON: '/usr/bin/python2.7'
          GOOGLE_SDK_PATH: '~/google-cloud-sdk/'
    steps:
      - checkout
      - pulumi/login:
          version: "2.0.0"
          access-token: ${PULUMI_ACCESS_TOKEN}
      - run:
          name: Install dependencies
          command: |
            cd ~/
            pip install --user -r project/requirements.txt
            curl -o gcp-cli.tar.gz https://dl.google.com/dl/cloudsdk/channels/rapid/google-cloud-sdk.tar.gz
            tar -xzvf gcp-cli.tar.gz
            echo ${GOOGLE_CLOUD_KEYS} | base64 --decode --ignore-garbage > ${HOME}/project/pulumi/gcp/gke/cicd_demo_gcp_creds.json
            ./google-cloud-sdk/install.sh --quiet
            echo 'export PATH=$PATH:~/google-cloud-sdk/bin' >> $BASH_ENV
            source $BASH_ENV
            gcloud auth activate-service-account --key-file ${HOME}/project/pulumi/gcp/gke/cicd_demo_gcp_creds.json
      - pulumi/update:
          stack: k8s
          working_directory: ${HOME}/project/pulumi/gcp/gke/
workflows:
  build_test_deploy:
    jobs:
      - build_test
      - build_push_image
      - deploy_to_gcp:
          requires:
          - build_test
          - build_push_image

Этот трубопровод разворачивает новое отпуск приложения к новой кластере GKE, но мы не знаем, на самом деле на самом деле работает приложение и работает после завершения всей этой автоматизации. Как мы узнаем, было ли приложение развернуто и функционирует правильно в этой новой кластере GKE? Дымовые испытания — отличный способ быстро и легко подтвердить статус приложения после развертывания.

Как я могу написать тест дыма?

Первым шагом является разработка тестовых случаев, которые определяют шаги, необходимые для проверки функциональности приложения. Определите функциональность, которые вы хотите проверить, а затем создать сценарии, чтобы проверить его. В этом руководстве я намеренно описываю очень минимальный объем для тестирования. Для нашего образца проекта, моя самая большая проблема подтверждается, что приложение доступно после развертывания, и что страница по умолчанию, которая подается, предоставляется ожидаемый статический текст.

Я предпочитаю набросать и перечислять предметы, которые я хочу проверить, потому что это устраивает мой стиль развития. Контур показывает факторы, которые я рассмотрел при разработке дымовых испытаний для этого приложения. Вот пример того, как я разработал тестовые случаи для этого дыма.

  • Какой язык/тестовая структура?
    • Башмак
    • smoke.sh
  • Когда этот тест должен быть выполнен?
    • После создания кластера GKE
  • Что будет проверено?
    • Тест: это приложение доступно после его развертывания?
    • Ожидаемый результат: сервер отвечает с кодом 200
    • Тест: страница по умолчанию представляет текст «Добро пожаловать в ci/cd»
    • Ожидаемый результат: ПРАВДА
    • Тест: страница по умолчанию представляет текст «номер версии:»
    • Ожидаемые результаты: ПРАВДА
  • Post Test Actions (должно встречаться независимо от прохода или провала)
    • Написать результаты теста на стандартный выход
    • Уничтожьте кластер GKE и связанную с ними инфраструктуру
    • Беги пулуби уничтожить

Мой тестовый чехол (также называемый тестовым сценарием) завершен для этого учебника и четко показывает, что я заинтересован в тестировании. Для этого поста я напишу дымовые тесты, используя основу дыма на основе Bash, называемой Smoke.sh по ASM89 Отказ Для ваших собственных проектов вы можете написать дымовые тесты в каком языке или структуре вы предпочитаете. Я выбрал smoke.sh Потому что это простая структура для реализации, и это открытый источник. Теперь давайте рассмотрим, как выразить этот тестовый скрипт, используя Smoke.sh рамки.

Создать дымовый тест, используя Smoke.sh

Smoke.sh Рамки Документация Описывает, как его использовать. Следующий блок примерного кода показывает, как я использовал Smoke_test файл найден в Тест/ каталог Пример repo код Отказ

#!/bin/bash

. tests/smoke.sh

TIME_OUT=300
TIME_OUT_COUNT=0
PULUMI_STACK="k8s"
PULUMI_CWD="pulumi/gcp/gke/"
SMOKE_IP=$(pulumi stack --stack $PULUMI_STACK --cwd $PULUMI_CWD output app_endpoint_ip)
SMOKE_URL="http://$SMOKE_IP"

while true
do
  STATUS=$(curl -s -o /dev/null -w '%{http_code}' $SMOKE_URL)
  if [$STATUS -eq 200]; then
    smoke_url_ok $SMOKE_URL
    smoke_assert_body "Welcome to CI/CD"
    smoke_assert_body "Version Number:"
    smoke_report
    echo "\n\n"
    echo 'Smoke Tests Successfully Completed.'
    echo 'Terminating the Kubernetes Cluster in 300 second...'
    sleep 300
    pulumi destroy --stack $PULUMI_STACK --cwd $PULUMI_CWD --yes
    break
  elif [[$TIME_OUT_COUNT -gt $TIME_OUT]]; then
    echo "Process has Timed out! Elapsed Timeout Count.. $TIME_OUT_COUNT"
    pulumi destroy --stack $PULUMI_STACK --cwd $PULUMI_CWD --yes
    exit 1
  else
    echo "Checking Status on host $SMOKE... $TIME_OUT_COUNT seconds elapsed"
    TIME_OUT_COUNT=$((TIME_OUT_COUNT+10))
  fi
  sleep 10
done

Далее я объясню, что происходит в этом файле Smoke_test.

Линия по линейке Описание файла Smoke_test

Давайте начнем в верхней части файла.

#!/bin/bash

. tests/smoke.sh

Этот фрагмент указывает Bash Binary для использования, а также указывает путь к файлу к ядру Smoke.sh Рамки для импорта/включения в Smoke_test скрипт

TIME_OUT=300
TIME_OUT_COUNT=0
PULUMI_STACK="k8s"
PULUMI_CWD="pulumi/gcp/gke/"
SMOKE_IP=$(pulumi stack --stack $PULUMI_STACK --cwd $PULUMI_CWD output app_endpoint_ip)
SMOKE_URL="http://$SMOKE_IP"

Этот фрагмент определяет переменные среды, которые будут использоваться на протяжении всего Smoke_test скрипт Вот список каждой переменной окружающей среды и ее цель:

  • Pulumi_stack = "k8s" используется пульмой, чтобы указать стек приложения пула.
  • Pulumi_cwd = "Pulumi/GCP/GKE/" это путь к инфраструктуру пуломенного инфраструктуры.
  • Smoke_ip = $ (Stack Stack --stack $ Pulumi_Stack - CWD $ PULUMI_CWD Выход App_endPoint_ip) Это команда PULUMI, используемая для извлечения публичного IP-адреса приложения на кластере GKE. Эта переменная ссылается на протяжении всего сценария.
  • Smoke_url = "http://$ common_ip" Указывает конечную точку URL приложения на кластере GKE.
while true
do
  STATUS=$(curl -s -o /dev/null -w '%{http_code}' $SMOKE_URL)
  if [$STATUS -eq 200]; then
    smoke_url_ok $SMOKE_URL
    smoke_assert_body "Welcome to CI/CD"
    smoke_assert_body "Version Number:"
    smoke_report
    echo "\n\n"
    echo 'Smoke Tests Successfully Completed.'
    echo 'Terminating the Kubernetes Cluster in 300 second...'
    sleep 300
    pulumi destroy --stack $PULUMI_STACK --cwd $PULUMI_CWD --yes
    break
  elif [[$TIME_OUT_COUNT -gt $TIME_OUT]]; then
    echo "Process has Timed out! Elapsed Timeout Count.. $TIME_OUT_COUNT"
    pulumi destroy --stack $PULUMI_STACK --cwd $PULUMI_CWD --yes
    exit 1
  else
    echo "Checking Status on host $SMOKE... $TIME_OUT_COUNT seconds elapsed"
    TIME_OUT_COUNT=$((TIME_OUT_COUNT+10))
  fi
  sleep 10
done

Этот фрагмент — это то, где происходит вся магия. Это в то время как цикл, который выполняется до тех пор, пока не будет данным условием, либо скрипт выходит. В этом случае цикл использует Curl Команда для проверки, если приложение возвращает ОК 200 код ответа. Поскольку этот трубопровод создает совершенно новый кластер GKE с нуля, есть транзакции на платформе Google Cloud платформы, которые должны быть завершены, прежде чем мы начнем тестирование дыма.

  • Служба кластеров и приложений GKE должна быть запущена.
  • $ Статус Переменная заполнена результатами запросов CURL, а затем протестированы на значение 200 Отказ В противном случае контур увеличивает $ Time_out_count Переменная на 10 секунд, затем ждет 10 секунд, чтобы повторить Curl Запрос, пока приложение не отвечает.
  • Как только кластер и приложение работают, работает и отвечает, Статус Переменная будет производить 200 Код ответа и остаток испытаний будет продолжаться.

Smoke_assert_body "Добро пожаловать в CI/CD" и Smoke_assert_body "Номер версии:" Заявления — это то, где я проверяю, что тексты приветствия и номера версии оказываются на вызове веб-страницы. Если результат неверный, тест не пройдет неудачу, что приведет к сбою трубопровода. Если результат правда, то приложение вернет 200 Код ответа и наши текстовые тесты приведут к Правда Отказ Наш дымовой тест пройдет и выполнит Пулуби уничтожить Команда, которая прекращает всю инфраструктуру, созданную для этого теста. Поскольку в этом кластере нет дальнейшей необходимости, он прекратит всю инфраструктуру, созданную в этом тесте.

Эта петля также имеет элиф (Иначе, если) Заявление, которое проверяет, превысил ли приложение $ Time_out ценность. Элиф Заявление является примером Обработка исключений что позволяет нам контролировать то, что происходит, когда происходят неожиданные результаты. Если $ Time_out_count значение превышает Time_out Значение, то Пулуби уничтожить Команда выполнена и завершает вновь созданную инфраструктуру. Выход 1 Затем команда не удается ваш процесс сборки трубопровода. Независимо от результатов теста, кластер GKE будет прекращен, потому что на этой инфраструктуре действительно не нужно существовать вне тестирования.

Добавление дымовых испытаний на трубопроводы

Я объяснил пример теста дыма и мой процесс для разработки тестового случая. Теперь пришло время интегрировать его в конфигурацию трубопроводов CI/CD выше. Мы добавим новый Беги Шаг ниже Pulumi/Update Шаг Deploy_to_gcp работа:

      ...
      - run:
          name: Run Smoke Test against GKE
          command: |
            echo 'Initializing Smoke Tests on the GKE Cluster'
            ./tests/smoke_test
            echo "GKE Cluster Tested & Destroyed"
      ...

Этот фрагмент демонстрирует, как интегрировать и выполнить Smoke_test Скрипт в существующий CI/CD-трубопровод. Добавление этого нового блока запуска гарантирует, что каждая сборка по трубопроводам проверит приложение в Live GKE кластере и обеспечивает проверку, которую приложение прошло все тестовые случаи. Вы можете быть уверены, что конкретный релиз выполнит номинально, когда развернут к тестированной целевой среде, которая в этом случае является кластер Google Kubernetes.

Упаковка

Таким образом, я обсудил и продемонстрировал преимущества использования дымовых испытаний и инфраструктуру в качестве кода в CI/CD-трубопроводах для тестирования настроек в их целевых условиях развертывания. Тестирование приложения в целевой среде обеспечивает ценное представление о том, как она будет вести себя, когда он развернут. Интеграция тестирования дыма на трубопроводы CI/CD добавляет другой слой доверия к созданиям приложения.

Если у вас есть какие-либо вопросы, комментарии или отзывы, пожалуйста, не стесняйтесь пинговать меня в Twitter @punkdata Отказ

Спасибо за чтение!

Оригинал: «https://dev.to/circleci/smoke-testing-in-cicd-pipelines-1dh0»