지속적 통합을 사용한 MicroPython 개발 및 테스트 자동화하기

Ari Mahpour
|  작성 날짜: December 3, 2022  |  업데이트 날짜: August 27, 2023
Micropython

MicroPython 및 Raspberry Pi Pico 시작하기에서는 Raspberry Pi Pico 장치에서 MicroPython을 설정, 구성 및 실행하는 방법을 살펴봤습니다. 이 문서에서는 해당 프로세스를 자동화하고 지속적 통합(CI) 파이프라인으로 전환하는 데 초점을 맞추었습니다. 자동화를 CI로 이동하면 코드 리포지토리에 커밋을 푸시할 때마다 코드가 테스트됩니다.

MicroPython 명령 및 개발 자동화하기

MicroPython 및 Raspberry Pi Pico 장치를 시작하는 방법을 살펴봤으니 코드 개발 프로세스를 좀 더 자동화하는 방법을 찾아보겠습니다. MicroPython 및 Raspberry Pi Pico 시작하기에서는 Raspberry Pi Pico 장치의 여러 기능 세트를 설명하기 위해 몇 가지 다른 명령을 실행했습니다. 이 문서에서는 스크립트를 사용하여 이러한 예시 중 하나를 자동화한 후 CI에 배치하는 방법을 살펴보겠습니다. 먼저 터미널에서 실행한 예시를 살펴보겠습니다.

터미널 예시

이 명령은 머신 인스턴스 정보를 제공해 주었습니다. 우리의 경우에는 다음과 같습니다.

머신 러닝 인스턴스

이는 우리가 RP2040 칩을 사용하여 Raspberry Pi Pico에서 MicroPython 버전 1.19.1을 실행하고 있음을 알려줍니다. PuTTY 또는 Thonny IDE를 사용하여 인터프리터 셸을 통해 이 명령을 실행하는 대신 MicroPython 라이브러리와 함께 제공되는 도구를 사용하여 명령줄에서 전체 프로세스를 실제로 실행할 수 있습니다. Pyboard.py 도구는 인터프리터 셸을 열지 않고(또는 새 파일을 기판에 직접 로드하지 않고) 대상 장치에서 직접 명령을 실행하는 메커니즘을 제공합니다. 또한 대상 장치에 또는 대상 장치로부터 파일을 나열하고 복사하는 것과 같은 다른 파일 시스템 명령도 제공합니다. 예를 들어 다음과 같이 Pyboard.py 도구를 사용하여 위의 sys.implementation 명령을 실행할 수 있습니다.

python pyboard.py --device $TARGET_PORT --command "import sys; print(sys.implementation)"

여기서 $TARGET_PORT는 장치를 나타내는 COM 포트입니다. 이는 PuTTY/Thonny IDE 단계를 건너뛰고 자동화를 가능하게 합니다.

CI에 코드 통합하기

이제 대상 장치에서 원격으로 명령 실행을 자동화할 수 있으므로 이를 전체 Python 스크립트에서 폴딩할 수 있을 것입니다. Pyboard 라이브러리를 사용하는 것은 매우 간단한 것으로 밝혀졌습니다. 이 예시 Python 스크립트에서는 위와 동일한 명령을 실행하며, 추가로 COM 포트를 자동으로 감지하고 어설션 기반 검사를 추가하는 등 몇 가지 정교한 대응도 함께 수행합니다. 하지만 머신 인스턴스를 가져와서 실행 기반을 검증한다는 원칙은 동일합니다.

이 모든 것을 스크립트로 캡슐화하고 나면 이제 이를 CI 시스템에 드롭할 수 있습니다. 저는 평소처럼 구현에 Gitlab을 사용하고 있지만 Raspberry Pi Pico 장치를 프로그래밍하는 데는 자체 실행기를 사용하고 있습니다. 여러분은 여기에서 전체 프로젝트를 따라 할 수 있으나 필요한 파일은 .gitlab-ci.yml 스크립트입니다. 여기에는 제가 코드를 변경하고 Gitlab에 다시 푸시할 때마다 빌드가 자동으로 발생하도록 하는 '지침'이 포함되어 있습니다.

여기서 몇 가지 '작업'이 발생하는데 Raspberry Pi Pico 장치와 관련되지 않은 작업은 Docker 빌드 단계뿐입니다. Docker 컨테이너를 빌드하면 환경이 가상 머신과 같은 것으로 캡슐화됩니다. 제가 Docker 컨테이너 내에서 CI 작업을 실행하면 저는 거의 모든 곳에서 이를 실행할 수 있습니다(단, 몇 가지 최소 요구 사항 필요). 이 경우에는 Docker 컨테이너가 관련된 모든 것과 함께 제공되기 때문에 저는 대상 장치에 연결된 데스크톱 컴퓨터에 특수 라이브러리를 설치하지 않아도 됩니다. 여기서 제가 유일하게 구별해야 할 점은 Docker 컨테이너가 '특권' 모드에서 실행되어야 한다는 것입니다. 또는 적어도 대상 장치에 대한 명시적 액세스 권한을 부여받아야 합니다. 그렇지 않으면 대상 장치와 통신할 수 없습니다.

Docker 컨테이너가 빌드되면 저는 작업이 실행될 때마다 Gitlab에서 이미지를 검색할 수 있으며 재미있는 경험을 하게 됩니다. 여러분은 제 작업이 점점 더 추상화되고, 그에 따라 더 복잡해진다는 것을 알게 되실 것입니다. 마지막 작업에서는 Pytest 프레임워크를 통해 전체 프로세스를 실행합니다.

MicroPython과 함께 Pytest 사용하기

제가 전에 작성한 FPGA: 임베디드 시스템 또는 PCB의 연속 통합 파이프라인 만들기, 디지털 및 아날로그 필터에 대한 저비용 검증'하드웨어 인 더 루프(Hardware in the Loop)' 프로젝트 구성하기와 같은 문서를 읽으셨다면 제가 Pytest 프레임워크의 열렬한 팬이라는 것을 알고 계실 것입니다. 저는 MicroPython에서도 마찬가지로 일부 Python 스크립트를 검증하는 간단한 방법으로 여전히 Pytest를 기본으로 사용합니다.

호출된 마지막 CI 작업은 test_rpi_pico.py Pytest 스크립트를 실행합니다. 이는 테스트 보고서를 생성한다는 점을 제외하고는 rpi_pico_check.py 스크립트와 거의 동일합니다. 늘 그렇듯 파싱을 위해 Gitlab에 해당 테스트 보고서를 제출하면 다음과 같이 통과되었다는 결과를 보여 주는 작은 테스트 섹션이 생깁니다.

그림 1: Pytest에 대한 테스트 요약

이 간단한 테스트는 이전 문서에서 살펴본 정보를 검증합니다. 다행히 우리는 여기서 자동화를 수행해 두었습니다. 코드가 수정될 때마다 우리는 검사를 실행하여 해당 장치가 기대하던 장치인지 확인합니다. 여기서 우리는 RP2040 칩을 사용하여 Raspberry Pi Pico에서 MicroPython 버전 1.19.1을 실행하고 있습니다.

결론

이 문서에서 우리는 Raspberry Pi Pico 장치와의 통신과 관련된 수동 단계를 상기하고 수동 프로세스를 스크립트로 변환했습니다. 스크립트를 통해 프로세스를 자동화한 후에는 워크플로를 CI 시스템에 통합한 다음 Pytest와 통합하는 방법을 살펴봤습니다. 이 문서의 예시를 살펴봤다면 자체 스크립트를 작성하고 CI에 통합할 수 있을 것입니다.

작성자 정보

작성자 정보

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.