DevOps를 사용한 임베디드 시스템 시작하기: ATmega328P 사용하기

Ari Mahpour
|  작성 날짜: 오월 29, 2024  |  업데이트 날짜: 칠월 1, 2024
DevOps를 사용한 임베디드 시스템 시작하기: ATmega328P 사용하기

DevOps 및 Agile 방법론은 협업, 자동화 및 지속적인 개선을 강조함으로써 소프트웨어 개발을 변화시켰습니다. DevOps 원칙을 제 설계와 프로젝트에 적용하는 것은 효율성과 신뢰성을 향상시키는 게임 체인저였습니다. 이 글에서는 기존 임베디드 시스템 프로젝트에 대한 지속적 통합(CI) 워크플로우를 설정하는 방법을 살펴볼 것입니다. 이 프로젝트는 ATmega328P 마이크로컨트롤러를 사용합니다. 이 글을 마치면 이러한 실천 방법이 개발 프로세스를 간소화하고 품질이 더 높은 제품을 제공하는 방법을 볼 수 있을 것입니다.

임베디드 시스템을 위한 DevOps 및 Agile 이해하기

DevOps는 소프트웨어 개발(Dev)과 IT 운영(Ops)을 지속적인 흐름으로 연결하는 일련의 실천 방법으로, 소프트웨어 세계에서 인기를 얻었습니다. 소프트웨어 세계에서는 소프트웨어를 개발하고 운영 팀에게 고객에게 배포하기 위해 "벽 너머로 던지는" 것이 일반적이었습니다. DevOps는 그 벽을 허물고 전체 프로세스를 자동화하는 방법을 도입했습니다. 하드웨어 세계에서는 제품 개발과 생산 사이에 유사점을 발견하며, 설계를 제조 엔지니어링 팀에게 "벽 너머로 던져" 생산을 위해 모든 것이 준비되도록 합니다.

임베디드 제품 설계에서는 여전히 소프트웨어를 생산을 통해 진행해야 하지만, 그 어느 때보다 빠르게 움직이고 가능한 최고의 품질을 제공하는 도전에 직면해 있습니다. DevOps 원칙을 사용하여 이러한 도전을 해결하고자 합니다.

  • 하드웨어 의존성: 임베디드 시스템은 하드웨어와 특정 PCB 리비전에 의존합니다. 이는 테스트와 배포를 복잡하게 만들 수 있으며, 자동화되고 확장성이 높게 스트림라인화되지 않으면 문제가 될 수 있습니다. DevOps 실천 방법은 하드웨어와 소프트웨어 모두에 동일한 설정을 사용하여 자동화된 지속적 통합(CI) 시스템을 통해 이러한 프로세스를 자동화하는 데 도움이 됩니다.
  • 긴 빌드 시간: 임베디드 소프트웨어를 설정하는 것은 어려울 수 있으며 긴 빌드 시간을 초래할 수 있습니다. CI는 빌드를 클라우드로 오프로드하여 개발자가 일반적으로 접근할 수 없는 더 강력한 인스턴스를 활용함으로써 이 과정을 자동화하고 가속화합니다.
  • 수동 테스팅: 실제 하드웨어에서의 테스팅은 필수적이지만 종종 수동적이고, 지루하며, 시간이 많이 소요됩니다. 하드웨어 인 더 루프(HIL) 테스팅을 통한 자동화는 효율성과 정확성을 향상시키며, CI 시스템으로 구성된 자동화된 테스트 장비 설정에 오프로드될 수 있습니다.

DevOps 원칙을 적용함으로써 우리는 빌드-테스트-배포 패러다임 내에서 Agile 방법론을 사용하여 빠르게 반복하고 생산에 출시하고자 하는 추가 기능을 개발할 수 있습니다.

전체 작동 방식

“빌드, 테스트, 배포”는 DevOps를 논할 때 자주 듣게 되는 일련의 단어입니다. 임베디드 시스템에서도 우리는 배포가 생산(그리고 그 다음에 최종 고객에게)으로 이어지기 때문에 같은 작업을 합니다. 프로젝트의 저장소에서는 임베디드 DevOps의 종단 간 워크플로우를 주도하기 위해 Gitlab CI를 사용하고 있습니다. 소프트웨어를 컴파일하거나 대상에서 테스트를 실행하거나 공식 패키지로 릴리스하는 등의 특정 작업을 수행하는 “파이프라인”이라고 불리는 것을 사용합니다. Gitlab에서 파이프라인은 이렇게 순차적으로 실행되는 작업의 집합입니다:

파이프라인 예시

그림 1: Gitlab에서 ATmega328P DevOps 워크플로우와 함께 사용된 파이프라인 예시

CI 스크립트(.gitlab-ci.yml 파일)의 분석을 통해 이것이 어떻게 작동하는지에 대한 아이디어를 제공합니다.

  • Docker: 하드웨어 인 더 루프 테스팅을 위한 빌드 및 런타임 환경 컨테이너화에서 논의된 바와 같이, 이 단계는 코드를 빌드, 테스트, 플래싱하는 일관된 환경을 생성하기 위해 Docker 이미지를 빌드합니다. 이는 데스크탑 PC 대비 라즈베리 파이와 같은 다른 기계 및 아키텍처에서 빌드 프로세스를 재현 가능하게 합니다.
  • Test: 이 단계는 당신의 코드가 의도한 대로 작동하는지 확인하기 위해 유닛 테스트를 실행합니다. 자동화된 테스트는 기존 코드를 수정하거나 리팩토링할 때 빠르고 중요합니다.
  • Build: 이 단계는 소스 코드를 바이너리로 컴파일합니다. 이 프로젝트에서는 .elf 및 .hex 파일과 같은 아티팩트를 생성하는데, 이는 ATmega328P 칩을 플래시하는 데 사용됩니다.
  • HIL (Hardware-in-the-Loop): 이 단계는 실제 하드웨어에서 소프트웨어를 테스트하여 실제 조건에서 올바르게 작동하는지 확인하는 것을 포함합니다. 하드웨어에 소프트웨어를 로드하고 설계한 기능이 최종 제품에서 실제로 작동하는지 확인하기 위해 테스트를 실행합니다.
  • Deploy: 이 단계는 빌드된 아티팩트를 패키지 레지스트리에 게시하여 사용할 수 있게 처리합니다.
  • Release: 이 단계는 새 소프트웨어 릴리스를 생성하여 배달 프로세스를 자동화함으로써 빠르고 신뢰할 수 있는 업데이트를 보장합니다. 이는 생산 팀이 제품의 전체 조립을 위해 필요한 소프트웨어 버전을 검색하는 데 사용할 것입니다.

세부 사항

몇 가지 사소한 세부 사항이 이 워크플로우를 기본적인 DevOps 구현에서 원활하게 실행되고 잘 문서화되며 쉽게 관찰할 수 있는 시스템으로 전환합니다. CI 워크플로우 내에 중요하게 지적할 몇 가지 미묘한 세부 사항이 있습니다.

  • 시맨틱 버전 관리: 자동화된 메커니즘을 통해 또는 수동으로 버전을 설정하는 것은 특히 생산 작업을 할 때 릴리스 주기에 매우 중요합니다. 예를 들어, 이는 CI 스크립트 내에서 변수로 설정되어 게시 및 릴리스 작업에서 사용됩니다.
  • Docker 빌드 로직: Docker 컨테이너 빌드에 사용되는 로직 블록이 있다는 것을 알 수 있습니다:

 


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

 

이 로직은 메인 브랜치(즉, 병합 요청이 성공적으로 통과한 후)에서 빌드된 Docker 이미지만 "latest" 태그를 사용하도록 설정합니다. 이는 성공적인 병합 요청만이 모든 사람과 모든 파이프라인이 가져가는 최신 및 최고의 도커 이미지를 게시하도록 보장합니다.

  • 보고서 및 커버리지: Gitlab과 같은 현대적인 CI 시스템에서는 병합 요청과 파이프라인 내에서 테스트 및 커버리지 보고서를 추출하여 표시할 수 있습니다. 예를 들어, 이 병합 요청에서는 코드 커버리지를 캡처했습니다:
병합 요청 내의 코드 커버리지

그림 2: 병합 요청 내의 코드 커버리지

이 스크린샷에서, Gitlab은 하드웨어 인 더 루프를 사용하여 대상에서 실행된 테스트를 요약합니다:

대상에서 실행된 테스트 요약

그림 3: 대상에서 실행된 테스트 요약

마지막으로, 우리의 코드가 단위 테스트와 대상에서 모두 검증되면, 게시 및 릴리스 단계는 생산 팀이 사용할 수 있는 멋진 패키지를 생성합니다:

소프트웨어 패키지 릴리스

그림 4: 소프트웨어 패키지 릴리스

이 모든 자동화된 단계를 통해 우리는 애자일 방식으로 새로운 기능을 반복적으로 출시할 수 있습니다. 많은 기능을 개발하여 QA 부서로 보내고, 그 후 생산 팀의 패키지 릴리스 검토를 기다릴 필요가 없습니다. 여기서 모든 것이 단일 워크플로우에서 일어나며 완전히 자동화됩니다.

결론

이 기사에서는 ATmega328P 마이크로컨트롤러를 사용하여 임베디드 시스템 개발에 DevOps 및 Agile 방법론을 적용하는 방법을 탐구했습니다. Gitlab에서 CI 워크플로우를 구현하는 이점에 대해 논의했으며, 이에는 자동화, 빠른 빌드 시간, 효율적인 테스팅이 포함됩니다. CI 스크립트를 분해하고 각 단계를 설명함으로써, 효율성과 제품 품질을 향상시키는 강력하고 간소화된 개발 프로세스를 만드는 방법을 보여주었습니다. 이 실용적인 가이드(및 저장소 내의 소스 코드)를 따르면 여러분도 자체 임베디드 DevOps 워크플로우를 설정할 수 있어야 합니다.

프로젝트의 소스 코드는 여기에서 찾을 수 있습니다:https://gitlab.com/embedded-designs/atmega328p-serial-led-control.

작성자 정보

작성자 정보

Ari is an engineer with broad experience in designing, manufacturing, testing, and integrating electrical, mechanical, and software systems. He is passionate about bringing design, verification, and test engineers together to work as a cohesive unit.

관련 자료

관련 기술 문서

홈으로 돌아가기
Thank you, you are now subscribed to updates.