name: '๐Ÿ”ฅ Firmware Build' on: push: tags: - 'v*.*.*' branches: - 'master' paths: - '**' - '.github/workflows/*.yml' - '.github/workflows/*.json' - '!**.md' - '!**.rst' - '!**.md' - '!cubeai**' - '!scripts**' pull_request: branches: - 'master' paths: - '**' - '.github/workflows/*.yml' - '.github/workflows/*.json' - '!**.md' - '!**.rst' - '!**.md' - '!cubeai**' - '!scripts**' jobs: build-firmware: runs-on: ubuntu-24.04 strategy: matrix: target: - OPENMV2 - OPENMV3 - OPENMV4 - OPENMV4P - OPENMVPT - OPENMV_RT1060 - OPENMV_AE3 - OPENMV_N6 - ARDUINO_PORTENTA_H7 - ARDUINO_GIGA - ARDUINO_NICLA_VISION - ARDUINO_NANO_RP2040_CONNECT - ARDUINO_NANO_33_BLE_SENSE qemu: [false] profile: [0] artifacts: [true] include: - target: DOCKER qemu: false profile: 0 artifacts: false - target: OPENMV_N6 qemu: false profile: 1 artifacts: false - target: MPS2_AN500 qemu: true profile: 0 artifacts: false - target: MPS3_AN547 qemu: true profile: 0 artifacts: false fail-fast: false steps: - name: 'โณ Checkout repository' uses: actions/checkout@v5 with: submodules: false - name: '๐Ÿงฑ Update submodules' run: source tools/ci.sh && ci_update_submodules - name: 'โ™ป Caching dependencies' uses: actions/cache@v4.3.0 id: cache with: path: | ~/cache/gcc ~/cache/llvm ~/cache/make ~/cache/stedgeai key: 'gcc-14.3.rel1_llvm-18.1.3_make-4.4.1_stedgeai-2.1' - name: '๐Ÿ Install Python' uses: actions/setup-python@v6 with: cache: 'pip' python-version: "3.12.4" - name: '๐Ÿ›  Install dependencies' run: | sudo apt-get update sudo apt-get install -y qemu-system-arm pip install -r .github/workflows/requirements.txt flake8 --version pytest --version vela --version - name: '๐Ÿ›  Install GNU Make ' if: steps.cache.outputs.cache-hit != 'true' run: source tools/ci.sh && ci_install_gnu_make - name: '๐Ÿ›  Install GCC toolchain ' if: steps.cache.outputs.cache-hit != 'true' run: source tools/ci.sh && ci_install_arm_gcc - name: '๐Ÿ›  Install LLVM toolchain ' if: steps.cache.outputs.cache-hit != 'true' run: source tools/ci.sh && ci_install_arm_llvm - name: '๐Ÿ›  Install STEdge AI tools ' if: steps.cache.outputs.cache-hit != 'true' run: source tools/ci.sh && ci_install_stedgeai ${HOME}/cache/stedgeai - name: '๐Ÿ— Build firmware' run: source tools/ci.sh && ci_build_target ${{ matrix.target }} ${{ matrix.qemu }} ${{ matrix.profile }} ${{ matrix.artifacts }} - name: '๐Ÿงช Run QEMU tests' if: matrix.qemu run: source tools/ci.sh && ci_run_qemu_tests ${{ matrix.target }} - name: 'โฌ† Upload artifacts' if: matrix.artifacts uses: actions/upload-artifact@v4 with: name: ${{ matrix.target }} path: ${{ matrix.target }} if-no-files-found: error code-size-report: needs: build-firmware runs-on: ubuntu-24.04 if: github.event_name == 'pull_request' steps: - name: 'โณ Checkout repository' uses: actions/checkout@v5 with: submodules: false - name: 'โ™ป Caching dependencies' uses: actions/cache@v4.3.0 id: cache with: path: | ~/cache/gcc ~/cache/llvm ~/cache/make ~/cache/stedgeai key: 'gcc-14.3.rel1_llvm-18.1.3_make-4.4.1_stedgeai-2.1' - name: '๐Ÿ Install Python' uses: actions/setup-python@v6 with: cache: 'pip' python-version: "3.12.4" - name: '๐Ÿ›  Install dependencies' run: | pip install tabulate==0.9.0 - name: 'โ†“ Download artifacts' uses: actions/download-artifact@v5 with: path: new_firmware merge-multiple: false - name: 'โ†“ Download release' uses: robinraju/release-downloader@v1 with: repository: 'openmv/openmv' tag: 'development' fileName: '*.zip' extract: false out-file-path: 'old_firmware' - name: '๐Ÿ“ Generate report' run: | TOOLCHAIN_PATH=${HOME}/cache/gcc export PATH=${TOOLCHAIN_PATH}/bin:${PATH} python tools/code_size.py > ${GITHUB_WORKSPACE}/${{ github.event.pull_request.number }}.md - name: 'โฌ† Upload report' uses: actions/upload-artifact@v4 with: overwrite: true name: code-size-report path: ${{ github.event.pull_request.number }}.md if-no-files-found: error stable-release: needs: build-firmware runs-on: ubuntu-24.04 if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') steps: - name: 'โณ Checkout repository' uses: actions/checkout@v5 with: submodules: false - name: 'โ†“ Download artifacts' uses: actions/download-artifact@v5 with: path: firmware - name: '๐Ÿ“ฆ Package firmware' run: source tools/ci.sh && ci_package_firmware_release ${{github.ref_name}} - name: "โœ๏ธ Generate release changelog" id: changelog uses: mikepenz/release-changelog-builder-action@v5 with: toTag: ${{ github.sha }} configuration: '.github/workflows/changelog.json' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: '๐Ÿ”ฅ Create stable release' uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090 with: draft: true files: firmware_*.zip body: ${{steps.changelog.outputs.changelog}} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: '๐Ÿงน Remove artifacts' uses: geekyeggo/delete-artifact@v5 with: name: firmware failOnError: false development-release: needs: build-firmware runs-on: ubuntu-24.04 if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') == false permissions: contents: write steps: - name: 'โณ Checkout repository' uses: actions/checkout@v5 with: submodules: false - name: 'โ†“ Download artifacts' uses: actions/download-artifact@v5 with: path: firmware - name: '๐Ÿ“ฆ Package firmware' run: source tools/ci.sh && ci_package_firmware_development - name: '๐Ÿงน Delete old release' uses: dev-drprasad/delete-tag-and-release@v1.1 with: delete_release: true tag_name: development env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: "โœ๏ธ Generate release changelog" id: changelog uses: mikepenz/release-changelog-builder-action@v5 with: toTag: ${{ github.sha }} configuration: '.github/workflows/changelog.json' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: '๐Ÿ”ฅ Create development release' uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090 with: draft: false name: Development Release tag_name: development body: | **โš ๏ธ This is a development release, and it may be unstable.** ${{steps.changelog.outputs.changelog}} files: firmware/firmware_*.zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: '๐Ÿงน Remove artifacts' uses: geekyeggo/delete-artifact@v5 with: name: firmware failOnError: false