CI/CD with GitHub Actions

Introduction

In today’s tech world, CI/CD (Continuous Integration/Continuous Deployment) is crucial for delivering fully tested and up-to-date software or firmware to your customers. This tutorial will guide you through integrating Edge Impulse Studio with GitHub workflows, enabling seamless build and deployment of your Edge Impulse model into your workflow.

Edge Impulse provides a comprehensive REST API for seamless integration with third-party services, allowing for the automation of tasks within Edge Impulse Studio. The GitHub Action we created available here simplifies the process of building and deploying models into your workflow.

This example was adapted from the Edge Impulse Blog - Integrate Your GitHub Workflow with Edge Impulse Studio By Mateusz Majchrzycki.

Prerequisites

  • GitHub repository for your firmware source code.

  • Edge Impulse project created in the Studio.

Steps

  1. Obtain Project ID and API Key

  • Navigate to your Edge Impulse project in the Studio.

  • Select "Dashboard" from the left pane, then click on "Keys" at the top.

  • Note down the Project ID and Project API Key.

  1. Add GitHub Action to Your Workflow

  • Open your workflow YAML file in your GitHub repository.

  • Add the following code to your workflow YAML file:

    - name: Build and deploy Edge Impulse Model
     uses: edgeimpulse/build-deploy@v1
     id: build-deploy
     with:
      project_id: ${{ secrets.PROJECT_ID }}
      api_key: ${{ secrets.API_KEY }}

    Replace ${{ secrets.PROJECT_ID }} and ${{ secrets.API_KEY }} with your actual Edge Impulse Project ID and API Key.

  1. Extract the Model and SDK

  • After the build and deployment action, you may want to extract the model and SDK.

  • Use the following example code in your workflow:

    - name: Extract the Model and SDK
     run: |
      mkdir temp
      unzip -q "${{ steps.build-deploy.outputs.deployment_file_name }}" -d temp
      mv temp/edge-impulse-sdk/ .
      mv temp/model-parameters/ .
      mv temp/tflite-model/ .
      rm -rf "${{ steps.build-deploy.outputs.deployment_file_name }}"
      rm -rf temp/
  1. Customize Deployment Type (Optional)

  • By default, the GitHub Action downloads the C++ library. You can customize the deployment type using the deployment_type input parameter. We can use a simple Python script here

  • Here's an example of downloading the Arduino library:

    - name: Build and deploy Edge Impulse Model
     uses: edgeimpulse/build-deploy@v1
     id: build-deploy
     with:
      project_id: ${{ secrets.PROJECT_ID }}
      api_key: ${{ secrets.API_KEY }}
      deployment_type: "arduino"
  1. Real-world Use Case

  • Utilize the GitHub Action for CI/CD purposes.

  • For example, testing public examples to prevent breaking changes.

  • Here's an example of using the Action with Nordic Semiconductor/Zephyr inference example:

GitHub Actions - IDE
```yaml
- name: Build and deploy EI Model
 uses: ./.github/actions/build-deploy
 id: build-deploy
 with:
  project_id: ${{ secrets.PROJECT_ID }}
  api_key: ${{ secrets.API_KEY }}
- name: Extract the EI Model
 run: |
  mkdir ei-model
  unzip -q "${{ steps.build-deploy.outputs.deployment_file_name }}" -d ei-model
  mv ei-model/edge-impulse-sdk/ .
  mv ei-model/model-parameters/ .
  mv ei-model/tflite-model/ .
  rm -rf "${{ steps.build-deploy.outputs.deployment_file_name }}"
  rm -rf ei-model/
- name: Build test app for nRF52840DK
 run: |
  docker run --rm -v $PWD:/app zephyr-ncs-1.9.1:latest west build -b nrf52840dk_nrf52840
```

6. Notification for Workflow Errors

  • Thanks to GitHub Actions notification, the person responsible for the commit that created an error in workflow will be notified.

Conclusion

Integrating Edge Impulse Studio with GitHub workflows enhances your CI/CD pipeline by automating the build and deployment process of your Edge Impulse models. This simplifies the development and testing of firmware, ensuring its accuracy and reliability. GitHub repository for your firmware source code. Edge Impulse project created in the Studio.

Last updated

Revision created

fix