DevOps и методологии Agile преобразили разработку программного обеспечения, делая акцент на сотрудничестве, автоматизации и непрерывном улучшении. Применение принципов DevOps к моим проектам и дизайнам стало настоящим прорывом, повышая эффективность и надежность. В этой статье мы рассмотрим процесс настройки рабочего процесса непрерывной интеграции (CI) для существующего проекта встроенных систем, использующего микроконтроллер ATmega328P. К концу этой статьи вы увидите, как эти практики могут оптимизировать ваш процесс разработки и обеспечить высокое качество продуктов.
DevOps — это набор практик, популяризированных в мире программного обеспечения, который объединяет разработку программного обеспечения (Dev) и IT-операции (Ops) в непрерывный процесс. В мире программного обеспечения раньше было обычным разрабатывать программное обеспечение и «перебрасывать его через стену» к операционным специалистам для развертывания клиентам. DevOps предложил способ не только разрушить эту стену, но и автоматизировать весь процесс от начала до конца. В мире аппаратного обеспечения мы находим схожие моменты между разработкой продукта и производством, постоянно перебрасывая дизайн «через стену» к нашим инженерам по производству, чтобы убедиться, что все готово к производству.
В дизайне встроенных продуктов нам все еще нужно пройти наше программное обеспечение через производство, но сталкиваемся с вызовом двигаться быстрее, чем когда-либо, и обеспечивать максимально возможное качество. С принципами DevOps мы стремимся решить некоторые из этих вызовов.
Применяя принципы DevOps, мы можем быстро итерировать, используя методологии Agile в рамках парадигмы сборки-тестирования-развертывания для каждой дополнительной функции, которую мы хотим выпустить в производство.
«Создание, тестирование и развертывание» — это распространенный набор слов, который вы часто слышите при обсуждении DevOps. Во встроенных системах мы делаем то же самое, поскольку наше развертывание также направлено в производство (а затем к конечному потребителю). В репозитории проекта мы используем Gitlab CI для управления нашим рабочим процессом Embedded DevOps от начала до конца. Мы используем то, что называется «пайплайнами», для создания задач, которые выполняют определенные задачи, такие как компиляция программного обеспечения, выполнение тестов на целевом устройстве или его выпуск в качестве официального пакета. В Gitlab пайплайн представляет собой набор задач, которые выполняются последовательно, как это:
Рисунок 1: Пример пайплайна, используемого в рабочем процессе ATmega328P DevOps в Gitlab
Вот разбивка скрипта CI (.gitlab-ci.yml файл), чтобы дать вам представление о том, как это работает.
Есть некоторые мелкие детали, которые превращают этот рабочий процесс из простой реализации DevOps в плавно работающую, хорошо задокументированную и легко наблюдаемую систему. Есть несколько тонких деталей в рабочем процессе CI, на которые важно указать.
if [ "$CI_COMMIT_REF_SLUG" == "$CI_DEFAULT_BRANCH" ]; then
export IMAGE_TAG=$CI_REGISTRY_IMAGE/$IMAGE_TYPE:latest
else
export IMAGE_TAG=$CI_REGISTRY_IMAGE/$IMAGE_TYPE:$CI_COMMIT_REF_SLUG
fi
Эта логика задаёт правило, согласно которому тег «latest» используется только для Docker-образа, собранного из главной ветки (т.е. после успешного прохождения запроса на слияние). Это гарантирует, что только успешные запросы на слияние публикуют самый последний и лучший Docker-образ, который используется всеми и во всех пайплайнах.
Рисунок 2: Покрытие кода в запросе на слияние
На этом скриншоте Gitlab подводит итоги тестов, выполненных на целевом оборудовании:
Рисунок 3: Сводка тестов, выполненных на целевом оборудовании
В конце концов, после того как наш код был проверен как с помощью модульного тестирования, так и на целевом оборудовании, этапы публикации и выпуска создают хорошо упакованный продукт, который может быть использован производственной командой:
Рисунок 4: Выпуск программного пакета
Благодаря всем этим автоматизированным шагам мы можем итеративно выпускать новые функции в духе Agile. Нет необходимости разрабатывать множество функций, отправлять их в отдел QA, а затем проводить рецензирование для выпуска пакета производственной командой. Всё это происходит в рамках одного рабочего процесса и полностью автоматизировано.
В этой статье мы рассмотрели, как методологии DevOps и Agile могут быть применены к разработке встроенных систем, в частности, с использованием микроконтроллера ATmega328P. Мы обсудили преимущества внедрения рабочего процесса CI в Gitlab, который включает в себя автоматизацию, ускорение времени сборки и эффективное тестирование. Разбив CI-скрипт и объясняя каждый этап, мы показали, как создать надежный и оптимизированный процесс разработки, который повышает эффективность и качество продукта. Следуя этому практическому руководству (и исходному коду в репозитории), вы также должны быть в состоянии настроить собственный рабочий процесс Embedded DevOps.
Исходный код проекта можно найти здесь:https://gitlab.com/embedded-designs/atmega328p-serial-led-control.