Проектирование тестируемой стратегии и конвейера CI/CD для вашего приложения без сервеса GO вручную. Вы не можете сделать один без другого. И если у вас нет преданного эксперта DEVOPS в вашей команде, может быть трудно знать, как должен выглядеть ваш трубопровод.
Вам нужно будет ответить на такие вопросы, как:
- Что среда нужно ли мне?
- Что Типы Тестов/чеков мне нужно запустить?
- Для каждого типа теста:
- Какой цели это служит? Какой тип сбои Это предназначено для обнаружения?
- Каковы его Зависимости/Предварительные реквизиты бежать? (E.g. Библиотеки кода, настройки конфигурации, развернутые ресурсы, сторонние API)
- Когда Должен ли он работать и против какой среды?
В этой статье я помогу вам ответить на эти вопросы, пройденные два относительно простых рабочих процессов CI/CD, которые я использовал с моими клиентами. Для каждого рабочего процесса мы рассмотрим различные типы тестов или проверку, которые работают на разных этапах.
Обзор рабочих процессов
Вот два рабочих процессы, которые я использую, наряду с ассоциированными триггерами:
- Потяните запрашивать рабочий процесс — создается новый запрос на тягу (PR), или существующая PR-филиал имеет новые коммиты
- Материнский рабочий процесс — PR объединяется на главную ветвь (или коммитан подталкивается непосредственно в главную ветку, если ваши настройки позволяют этому)
Давайте посмотрим на каждый рабочий процесс в свою очередь.
Рабочий процесс навлечения запроса (только CI)
Этот простой рабочий процесс срабатывает всякий раз, когда разработчик создает или обновляет PR в GitHub.
Цель этого рабочего процесса состоит в том, чтобы проверить качество изменений кода. Разработчик желает объединить, прежде чем выполняется любая проверка человеческого кода, и обратная связь с любыми нарушениями разработчика как можно быстрее.
В стороне: шаги, которые я запускаю здесь, являются CI только без CD. Это решение представляет собой компромисс на сложности, участвующей в создании динамических эфемерных средов AWS для каждого запроса на тягу, а не в условиях долгосрочных условий тестовое задание , постановка а также продлицо . Тем не менее, вы, возможно, вполне могут обнаружить, что стоит инвестировать эти усилия для вашей команды, чтобы выдвинуть обратную связь о неудачных тестах интеграции/E2E для предварительного объединения.
Вот что работает в этом рабочем процессе:
NPM CI
— вариацияNPM установить
который выполняет чистую установкуNode_Modules
указано в файле package-lock.json- Статический анализ
- ESLINT — убедитесь, что кодовые совпадения согласованы на стандартах, чтобы обеспечить согласованность в команде (другие бикишены, так что вам не нужно!)
- Запустите TeampScript
TSC
проверить типы
- Беги Агрегаты тесты используя шутку. Устройства здесь должны быть полностью запускаются в памяти (или файловой системе) и не имеют никакой зависимости от развернутых ресурсов или сторонних 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-трубопроводу, рассмотрите возможность добавления каждого типа теста постепенно к вашему трубопроводу. Вот мой рекомендуемый заказ для построения каждого:
- Статический анализ — Начните с них, поскольку они быстро бегают, поймайте много глупых ошибок в раннем цикле и легко реализовать, поскольку они просто имеют один файл конфигурации на уровне репо.
- E2E тесты — Это Самые большие доверительные водители для приложений без прослушивания С так как только они будут успешно работать, вы можете иметь гораздо большую уверенность, выполняя постоянную доставку
- Агрегаты тесты — Удачные тесты обычно быстро работают и хорошая подгонка для тестирования комплексной бизнес-логики внутри ламбда. Я оценил их за тестами E2E, так как я вообще нахожу моих случаев использования, не требуют многих из них.
- Дымовые испытания — Если вы делаете ручное тестирование, они, вероятно, более низкие приоритеты
- Тесты на конфигурацию — Эти проверки были бы самыми низкими приоритетами, поскольку ваши тесты E2E или дыма должны захватывать любую недостающую/плохую конфигурацию. Основные тесты на конфигурации пособия приносят не повышенную уверенностью, а вместо более быстрой ошибки, поскольку они могут быть запущены перед (обычно медленным) шагом развертывания.
Если вы заинтересованы в том, чтобы получить практику практики в создании типов тестов, обсуждаемых в этой статье, проверить мою 4-неделю Семинар для тестирования без сердца . Семинар представляет собой смесь самостоятельных видео уроков наряду с еженедельными сессиями Live Group, где вы присоединитесь ко мне и другим инженерам, чтобы обсудить и работать через разные сценарии тестирования.
Оригинал: «https://dev.to/paulswail/the-simple-guide-to-testing-within-your-serverless-ci-cd-pipelines-i»