Рубрики
Uncategorized

Простое руководство по тестированию в ваших трубопроводах CI / CI с серверуми

Прогулка по разным тестам, используемым на каждом этапе запроса на тягу и основные трубопроводы CI / CD для приложения SWES Serverless. Tagged с серверусным, AWS, тестированием, DEVOPS.

Проектирование тестируемой стратегии и конвейера CI/CD для вашего приложения без сервеса GO вручную. Вы не можете сделать один без другого. И если у вас нет преданного эксперта DEVOPS в вашей команде, может быть трудно знать, как должен выглядеть ваш трубопровод.

Вам нужно будет ответить на такие вопросы, как:

  • Что среда нужно ли мне?
  • Что Типы Тестов/чеков мне нужно запустить?
  • Для каждого типа теста:
    • Какой цели это служит? Какой тип сбои Это предназначено для обнаружения?
    • Каковы его Зависимости/Предварительные реквизиты бежать? (E.g. Библиотеки кода, настройки конфигурации, развернутые ресурсы, сторонние API)
    • Когда Должен ли он работать и против какой среды?

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

Обзор рабочих процессов

Вот два рабочих процессы, которые я использую, наряду с ассоциированными триггерами:

  1. Потяните запрашивать рабочий процесс — создается новый запрос на тягу (PR), или существующая PR-филиал имеет новые коммиты
  2. Материнский рабочий процесс — PR объединяется на главную ветвь (или коммитан подталкивается непосредственно в главную ветку, если ваши настройки позволяют этому)

Давайте посмотрим на каждый рабочий процесс в свою очередь.

Рабочий процесс навлечения запроса (только CI)

Этот простой рабочий процесс срабатывает всякий раз, когда разработчик создает или обновляет PR в GitHub.

Цель этого рабочего процесса состоит в том, чтобы проверить качество изменений кода. Разработчик желает объединить, прежде чем выполняется любая проверка человеческого кода, и обратная связь с любыми нарушениями разработчика как можно быстрее.

В стороне: шаги, которые я запускаю здесь, являются CI только без CD. Это решение представляет собой компромисс на сложности, участвующей в создании динамических эфемерных средов AWS для каждого запроса на тягу, а не в условиях долгосрочных условий тестовое задание , постановка а также продлицо . Тем не менее, вы, возможно, вполне могут обнаружить, что стоит инвестировать эти усилия для вашей команды, чтобы выдвинуть обратную связь о неудачных тестах интеграции/E2E для предварительного объединения.

Вот что работает в этом рабочем процессе:

  1. NPM CI — вариация NPM установить который выполняет чистую установку Node_Modules указано в файле package-lock.json
  2. Статический анализ
    1. ESLINT — убедитесь, что кодовые совпадения согласованы на стандартах, чтобы обеспечить согласованность в команде (другие бикишены, так что вам не нужно!)
    2. Запустите TeampScript TSC проверить типы
  3. Беги Агрегаты тесты используя шутку. Устройства здесь должны быть полностью запускаются в памяти (или файловой системе) и не имеют никакой зависимости от развернутых ресурсов или сторонних API (что сделает их тесты в интеграцию/E2E, которые мы будем прикрывать позже).

Я недавно начал использовать Действия GitHub Чтобы запустить этот рабочий процесс:

  • Это действительно быстро настроить и работать, если вы уже используете GitHub, чтобы провести свой код.
  • Он обеспечивает чрезвычайно быструю обратную связь для разработчиков непосредственно внутри пользовательского интерфейса GitHUB, где они создали свой PR (чеки, обычно завершенные в течение 30 секунд).
  • Рецензеры кода могут видеть, что автоматические проверки проходили прямо в GitHub и не нужно проверять другую систему CI, прежде чем начать их обзор.
  • Учитывая, что я только бегущих единичных тестах здесь, мне не нужно беспокоиться о подключении моего рабочего процесса до учетных записей AWS или других сторонних услуг.

Вот код для настройки рабочего процесса:

# ./.github/workflows/ci.yml
name: CI

# Triggers the workflow on new/updated pull requests
on:
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [14.x] # set this to configured AWS Lambda Node.js runtime

    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}
    - name: Cache dependencies
      id: cache
      uses: actions/cache@v2
      with:
        path: ./node_modules
        key: modules-${{ hashFiles('package-lock.json') }}
    - name: Install dependencies
      if: steps.cache.outputs.cache-hit != 'true' # only install if package-lock has changed
      run: npm ci --ignore-scripts
    - run: npm run lint
    - run: npm run compile
    - run: npm test

(Проверьте Эта статья Подробнее о технике, которую я использовал здесь, чтобы кэшировать NPM Unlight Node_Modules между выполнениями, который был одним самым медленным шагом в моем рабочем процессе, часто 20-30 секунд).

Материнский рабочий процесс (CI + CD)

Материнский рабочий процесс отвечает за получение изменений за разработчиком (которое прошло автоматизированные проверки CI и Change Code) через дальнейшие этапы и в конечном итоге в производство.

Для реализации этого я использую AWS CodePipipeline для Orchestration The Flow и AWS CodeBuild для запуска задач развертывания и тестирования. Поскольку эти услуги уже тесно интегрированы в экосистему AWS, существует меньше усилий и риск безопасности в выполнении развертывания (например, мне не нужно давать внешний доступ к моему доступу к моей учетной записи AWS).

Вот что выглядит мой поток:

Вы заметите, что есть 3 этапа: Тест , Постановка и продлицо . Я обычно развернул каждый из этих этапов своим собственным учетной записи AWS. Хотя это не обязательно-имеет для предварительной продукции среды, граница счета обеспечивает наилучшую изоляцию между средами, чтобы вы могли быть более уверены, что развертывание и тесты, работающие в каждой среде, не мешают друг другу. И вы всегда должны изолировать прод В своем собственном аккаунте AWS.

Есть несколько предположений, что мой трубопровод делает здесь, что вы должны знать:

  • Команда Dev следит за релизом от Mainline Развитие на основе багажника Модель ветвления Git. Если это не так для вашей команды, большая часть того, что я рекомендую здесь, может быть адаптирован для Филиал для выпуска модель.
  • Приложение развернуто монолитически от MonoRepo, то есть все ресурсы внутри системы развернуты одновременно. Я нахожу монолитные развертывания — это самое проще всего управлять в клиентских командах и продуктах, с которыми я работаю. Если ваша система имеет несколько микросервисов, и вы хотите развернуть их независимо на основе того, какой код изменился, то вам понадобится несколько трубопроводов, которые будут значительно более сложными, чем то, что я предлагаю здесь (посмотреть четыре о том, что я предлагаю. Для большого примера CI/CD-трубопровода для самостоятельно развернутых беспроблемных микросервисов).

В следующих разделах я прогулюсь по каждому этапу более подробно.

Стадия сборки

Этап сборки повторяет статический анализ и тестовые задачи единиц, выполняемые в Github Actions Project Workflow. Это позволяет дважды проверить, что слияние не вводится никаких проблем.

Вы можете быть удивлены, чтобы заметить, что здесь нет шага упаковки здесь. Причина этого заключается в том, что, к сожалению, структура без сервеса (которые я использую для определения и развертывания ресурсов инфраструктуры), не поддерживает создание независимого от окружающей среды артефакт развертывания, который затем затем проходит через каждый этап в трубопроводе. Это означает, что задача «Стеки развертывания», которые вы видите на более поздних этапах, создают ущерб для окружающей среды пакет, который он развернут к целевой учетной записи. (Общий консенсус среди опытных стержень с сервезой без сердца состоит в том, что это ограничение не о чем беспокоиться).

Тестовая сцена

Цель Тест Этап заключается в том, чтобы обеспечить изолированную среду, что только этот конвейер Ci/CD имеет доступ к автоматическому тестированию E2E. Ни один человеческие тестеры или другие системы не имеют доступа к этой среде.

Первый шаг на этом этапе это Тест конфигурации Отказ Хотя подавляющее большинство конфигурации будет содержаться в исходном коде, управляемом версией (потому что каждый ресурс определен в инфраструктуре — как-код ), единственная вещь, которая не в Git Is Секреты Отказ Такие секреты, такие как пароли, ключи API и т. Д., которые требуются функциями лямбда, должны храниться в магазине параметров SSM (или менеджера секретов) и выяснены во время выполнения. Тем не менее, развертывание ценностей для этих секретов необходимо выполнять инженера человека заранее, и это то, что они могут забыть сделать! Эта проверка использует Secrets.sample.env Файл, хранящийся в Git Repo и проверяет, что каждый ключ, определенный в нем, имеет связанный параметр, установленный в магазине параметров SSM для целевой среды. Если этот чек не удается, развертывание не продолжается.

После проверки конфигурации наступает сам развертывание, используя SLS развертывает команда. У меня обычно есть 2 стека для развертывания (An infra стек, содержащий элементные ресурсы, такие как таблицы Dynamodb и ведра S3 и API API стеки, содержащие apigw или appsync, наряду с функциями лямбда), которые развертываются последовательно.

Как только развертывание завершится, E2E тесты работают с помощью шума. Перед запуском этих тестов Serverless-Export-env Плагин используется для генерации .env Файл со всеми URL-адресами и т. Д. Из развертывания, так что тесты знают, какие конечные точки ударить.

Постановка этапа

Цель Постановка Этап заключается в том, чтобы выступить в качестве среды, в которой человеческие тестеры могут выполнять ручное тестирование, прежде чем высвобождать изменения в производстве. Если вы создаете API, и у вас есть отдельные фронт-концевые (веб-сайты или мобильные) команды, они могут указывать на их предварительно производственные приложения в этой среде, поскольку она будет относительно стабильной, поскольку код, который далеко прошел полное тестирование E2E в Тест сцена.

Нам все еще нужно запускать несколько тестов на этом этапе, хотя. Перед развертыванием мы должны снова выполнить проверку конфигурации, чтобы убедиться, что секреты были развернуты правильно.

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

Например, если функция Lambda разговаривает с API третьей стороны, мы могли бы написать тест дыма, который вызывает функцию и проверяет, что она правильно общается с этой услугой. Это подтвердит, что URL-адрес API и API, которые мы используем, верны.

Важным аспектом дымовых испытаний (которые дифференцирует их из E2E Tests), заключается в том, что они должны иметь минимальные побочные эффекты. В идеале они были бы полностью отреагированы, но по крайней мере, они не должны вводить какие-либо тестовые данные в систему, которая может стать видимой людским пользователям.

Ручное одобрение

Однажды Постановка Полное развертывание и тесты, уведомление отправляется в команду, чтобы вручную одобрить. Это возможность выполнить любое ручное тестирование, прежде чем приступить к производству.

После удовлетворения системой вы можете использовать консоль CodePipeline для одобрения, а трубопровод переместится на прод сцена.

Производственная стадия

прод Этап — это живая среда, которую ваши пользователи будут доступны. Шаги на этом этапе такие же, как в Постановка сцена.

Сводка типов тестов

Итак, теперь мы достигли конца трубопровода, давайте суммируем разные типы тестов, которые мы использовали, и где они работали:

Статический анализ Lint и компиляция (TSC) При запуске трубопроводов PR и магистралей
Ед. изм Проверяет сложную бизнес-логику. Не имеет вне процесса зависимости выполнения После статического анализа при запуске PR и магистральных трубопроводов
Конфигурация Проверяет наличие немосковой контрольной конфигурации (например, секреты) Предварительное развертывание, в тесте, промежуточное покрытие и прод этапы
E2E. Проверяет поведение развернутой системы, например Призывая конечные точки API, развернутые функции лямбда и т. Д. Пост-развертывание, в тестовой стадии
Курить Проверяет доступность системы и правильность определения окружающей среды конфигурации Пост-развертывание, в стадии постановки и прод

Сделать свой собственный трубопровод

Это может показаться много проверок, чтобы создать свой собственный конвейер, и, возможно, у вас нет времени, чтобы построить всю эту аванс. Но не позволяйте этому отключить, как имеющие какие-либо тесты, работающие в конвейере CI/CD, лучше, чем нет. Я видел много команд, которые вообще не делают CI/CD и просто развертывают непосредственно от рабочих станций разработчиков (и Я не единственный !).

Чтобы начать работу, рабочий процесс запроса натяжения гораздо проще настроить, так как у него меньше движущихся частей. Ограничение заключается в том, что вы можете сделать только CI, а не CD.

После того, как вы перейдете к главному CI + CD-трубопроводу, рассмотрите возможность добавления каждого типа теста постепенно к вашему трубопроводу. Вот мой рекомендуемый заказ для построения каждого:

  1. Статический анализ — Начните с них, поскольку они быстро бегают, поймайте много глупых ошибок в раннем цикле и легко реализовать, поскольку они просто имеют один файл конфигурации на уровне репо.
  2. E2E тесты — Это Самые большие доверительные водители для приложений без прослушивания С так как только они будут успешно работать, вы можете иметь гораздо большую уверенность, выполняя постоянную доставку
  3. Агрегаты тесты — Удачные тесты обычно быстро работают и хорошая подгонка для тестирования комплексной бизнес-логики внутри ламбда. Я оценил их за тестами E2E, так как я вообще нахожу моих случаев использования, не требуют многих из них.
  4. Дымовые испытания — Если вы делаете ручное тестирование, они, вероятно, более низкие приоритеты
  5. Тесты на конфигурацию — Эти проверки были бы самыми низкими приоритетами, поскольку ваши тесты E2E или дыма должны захватывать любую недостающую/плохую конфигурацию. Основные тесты на конфигурации пособия приносят не повышенную уверенностью, а вместо более быстрой ошибки, поскольку они могут быть запущены перед (обычно медленным) шагом развертывания.

Если вы заинтересованы в том, чтобы получить практику практики в создании типов тестов, обсуждаемых в этой статье, проверить мою 4-неделю Семинар для тестирования без сердца . Семинар представляет собой смесь самостоятельных видео уроков наряду с еженедельными сессиями Live Group, где вы присоединитесь ко мне и другим инженерам, чтобы обсудить и работать через разные сценарии тестирования.

Оригинал: «https://dev.to/paulswail/the-simple-guide-to-testing-within-your-serverless-ci-cd-pipelines-i»