This is an old revision of the document!
În laboratorul anterior am configurat mediul de lucru și am testat comunicarea între ESP32-CAM și clientul Python. În acest laborator vom automatiza procesul de verificare a codului folosind un pipeline CI/CD (Continuous Integration / Continuous Delivery) cu GitHub Actions.
firmware.bin pentru deployment.Într-un proiect clasic de software, CI/CD este standard. Dar și în embedded este esențial:
firmware.bin este generat automat și poate fi distribuit fără ca cineva să aibă PlatformIO instalat.Dacă proiectul nu este deja într-un repository git:
cd /path/to/proiect git init
Asigurați-vă că fișierul .gitignore generat de PlatformIO exclude fișierele generate și mediile virtuale:
# PlatformIO .pio/ # Python .venv/ __pycache__/ *.pyc # IDE .vscode/ .idea/ # OS .DS_Store Thumbs.db
Creați un repository nou pe GitHub (fără README), apoi:
git add . git commit -m "Initial commit" git branch -M main git remote add origin https://github.com/UTILIZATOR/NUMELE-REPO.git git push -u origin main
UTILIZATOR cu username-ul vostru GitHub și NUMELE-REPO cu numele repository-ului creat.
Workflow-urile GitHub Actions sunt definite ca fișiere YAML în directorul .github/workflows/.
Creați fișierul .github/workflows/ci.yml:
name: ESP32-CAM CI Pipeline # Declanșare la push sau pull request pe branch-ul main on: push: branches: [ "main" ] pull_request: branches: [ "main" ] jobs: # ============================================= # Job 1: Compilarea firmware-ului ESP32 # ============================================= build-firmware: name: Build ESP32 Firmware runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.12' - name: Install PlatformIO run: pip install platformio - name: Build Firmware (ESP32-CAM AI-Thinker) run: pio run -e esp32cam # Salvăm firmware.bin ca artifact descărcabil - name: Upload Firmware Artifact uses: actions/upload-artifact@v4 with: name: firmware-esp32cam path: .pio/build/esp32cam/firmware.bin # ============================================= # Job 2: Analiza statică C++ (Firmware) # ============================================= analyze-firmware: name: Static Analysis (C++) runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Install Cppcheck run: sudo apt-get install -y cppcheck - name: Run Cppcheck run: | cppcheck --enable=all \ --inconclusive \ --std=c++11 \ -I include/ \ --suppress=missingIncludeSystem \ --suppress=missingInclude \ --suppress=unusedFunction \ --suppress=cstyleCast \ --error-exitcode=1 \ src/ # ============================================= # Job 3: Verificarea codului Python (Receiver) # ============================================= check-python: name: Python Lint & Security runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.12' - name: Install dependencies run: | pip install pylint bandit # opencv-python-headless se folosește în CI (fără display) pip install paho-mqtt opencv-python-headless numpy - name: Lint with Pylint # || true = soft-fail, pipeline-ul nu eșuează pe warning-uri pylint run: pylint --disable=C0114,C0115,C0116,C0103 receiver.py || true - name: Security scan with Bandit run: bandit receiver.py -ll
Acest workflow definește 3 job-uri independente care rulează în paralel:
| Job | Ce face | Când eșuează |
|---|---|---|
build-firmware | Compilează codul ESP32 cu PlatformIO | Erori de compilare (sintaxă, linkare) |
analyze-firmware | Rulează cppcheck pe codul C++ | Buffer overflows, memory leaks, variabile neinițializate |
check-python | Rulează pylint + bandit pe receiver | Probleme de stil, parole hardcodate, funcții nesigure |
push/PR
│
├──► build-firmware ──► firmware.bin (artifact)
│
├──► analyze-firmware ──► raport cppcheck
│
└──► check-python ──► raport pylint + bandit
git add .github/workflows/ci.yml git commit -m "Add CI pipeline" git push
ESP32-CAM CI Pipeline rulând.Dacă build-ul reușește:
firmware-esp32cam.firmware.bin gata de upload pe dispozitiv.
esptool fără a avea PlatformIO instalat:
pip install esptool esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 460800 write_flash 0x10000 firmware.bin
Pe Windows, înlocuiți /dev/ttyUSB0 cu portul COM corespunzător (ex: COM3).
Acest lucru este util pentru distribuirea firmware-ului către colegi sau pentru deployment pe dispozitive fără a recompila codul sursă.
Pentru a preveni merge-ul codului care nu trece CI-ul:
main.Build ESP32 Firmware, Static Analysis (C++), Python Lint & Security.
De acum, nimeni nu poate face merge pe main dacă pipeline-ul eșuează.
main.cpp (ex: ștergeți un ;), faceți push pe un branch separat și creați un Pull Request. Observați cum pipeline-ul blochează merge-ul.receiver.py poate fi parsat fără erori de sintaxă:- name: Smoke test run: python -m py_compile receiver.py
firmware.bin atașat, doar când se face push pe un tag (ex: v1.0). Hint: folosiți if: startsWith(github.ref, 'refs/tags/') și action-ul softprops/action-gh-release.