diff --git a/.github/workflows/firmware.yml b/.github/workflows/firmware.yml new file mode 100644 index 000000000..fa86a06f4 --- /dev/null +++ b/.github/workflows/firmware.yml @@ -0,0 +1,122 @@ +name: '๐Ÿ”ฅ Build Firmware ๐Ÿ”ฅ' + +on: + create: + branches: + - "!**" + tags: + - 'v*.*.*' + + push: + branches: + - 'master' + paths: + - 'src/**' + - '.github/workflows/*.yml' + - '!**/README.md' + + pull_request: + branches: + - 'master' + paths: + - 'src/**' + - '.github/workflows/*.yml' + - '!**/README.md' + +jobs: + build: + runs-on: ubuntu-20.04 + strategy: + matrix: + target: [OPENMV2, OPENMV3, OPENMV4, OPENMV4P, PORTENTA, OPENMVPT, NICLAV, NANO33, ARDUINO_NANO_RP2040_CONNECT] + steps: + - name: 'Checkout Repository โณ' + uses: actions/checkout@v2 + with: + submodules: false + + - name: 'Update Submodules ๐Ÿงฑ' + run: source tools/ci.sh && ci_update_submodules + + - name: 'Install Toolchain ๐Ÿ› ' + run: source tools/ci.sh && ci_install_arm_gcc + + - name: 'Build Firmware ๐Ÿ—' + run: source tools/ci.sh && ci_build_target ${{ matrix.target }} + + - name: 'Upload Artifacts โฌ†' + if: github.event_name != 'pull_request' + uses: actions/upload-artifact@v2 + with: + name: firmware + path: firmware + if-no-files-found: error + + release: + needs: build + runs-on: ubuntu-20.04 + if: github.event_name == 'create' + steps: + - name: 'Checkout Repository โณ' + uses: actions/checkout@v2 + with: + submodules: false + + - name: 'Download Artifacts ๐ŸคŒ' + uses: actions/download-artifact@v2 + with: + name: firmware + path: firmware + + - name: 'Package Firmware ๐Ÿ“ฆ' + run: source tools/ci.sh && ci_package_firmware_release ${{github.ref_name}} + + - name: '๐Ÿ”ฅ๐Ÿ”ฅ Create Release ๐Ÿ”ฅ๐Ÿ”ฅ' + uses: softprops/action-gh-release@v1 + with: + draft: true + files: firmware_*.zip + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: 'Remove Artifacts ๐Ÿงน๐Ÿชฃ' + uses: geekyeggo/delete-artifact@v1 + with: + name: firmware + failOnError: false + + development: + needs: build + runs-on: ubuntu-20.04 + if: github.event_name == 'push' + steps: + - name: 'Checkout Repository โณ' + uses: actions/checkout@v2 + with: + submodules: false + + - name: 'Download Artifacts ๐ŸคŒ' + uses: actions/download-artifact@v2 + with: + name: firmware + path: firmware + + - name: 'Package Firmware ๐Ÿ“ฆ' + run: source tools/ci.sh && ci_package_firmware_development + + - name: '๐Ÿ”ฅ๐Ÿ”ฅ Create Release ๐Ÿ”ฅ๐Ÿ”ฅ' + uses: softprops/action-gh-release@v1 + with: + draft: false + name: Development Release + tag_name: development + body: 'Warning: This a development release and it may contain bugs.' + files: firmware/firmware_*.zip + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: 'Remove Artifacts ๐Ÿงน๐Ÿชฃ' + uses: geekyeggo/delete-artifact@v1 + with: + name: firmware + failOnError: false diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index d89e3f4e2..000000000 --- a/.travis.yml +++ /dev/null @@ -1,158 +0,0 @@ -os: linux -dist: bionic -sudo: required -language: c -stage: build - -git: - depth: 1 - submodules: false - -notifications: - email: - on_success: never - -stages: - - build - - deploy - -cache: - directories: - - "${HOME}/persist" - -script: - # Update submodules. - - git submodule update --init --depth=1 --no-single-branch - - git -C src/micropython/ submodule update --init --depth=1 - # Install ARM GCC. - - | - mkdir ${HOME}/gcc - GCC_URL="https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2" - wget --no-check-certificate -O - ${GCC_URL} | tar --strip-components=1 -jx -C ${HOME}/gcc - export PATH=${HOME}/gcc/bin:${PATH} - - arm-none-eabi-gcc --version - # Install recent cmake if needed. - - | - if [[ ${TARGET} == ARDUINO_NANO_RP2040_CONNECT ]]; then - mkdir ${HOME}/cmake - CMAKE_URL="https://cmake.org/files/v3.20/cmake-3.20.0-linux-x86_64.tar.gz" - wget --no-check-certificate -O - ${CMAKE_URL} | tar --strip-components=1 -xz -C ${HOME}/cmake - export PATH=${HOME}/cmake/bin:${PATH} - fi - # Build the firmware. - - make -j$(nproc) -C src/micropython/mpy-cross - - make -j$(nproc) TARGET=$TARGET -C src - - mkdir ~/build/$TARGET - - cp -r src/build/bin/* ~/build/$TARGET - -jobs: - include: - - stage: build - env: TARGET=OPENMV2 - workspaces: - create: - name: OPENMV2_WORKSPACE # workspace names are escaped. - paths: ~/build/$TARGET - - - stage: build - env: TARGET=OPENMV3 - workspaces: - create: - name: OPENMV3_WORKSPACE # workspace names are escaped. - paths: ~/build/$TARGET - - - stage: build - env: TARGET=OPENMV4 - workspaces: - create: - name: OPENMV4_WORKSPACE # workspace names are escaped. - paths: ~/build/$TARGET - - - stage: build - env: TARGET=OPENMV4P - workspaces: - create: - name: OPENMV4P_WORKSPACE # workspace names are escaped. - paths: ~/build/$TARGET - - - stage: build - env: TARGET=PORTENTA - workspaces: - create: - name: PORTENTA_WORKSPACE # workspace names are escaped. - paths: ~/build/$TARGET - - - stage: build - env: TARGET=OPENMVPT - workspaces: - create: - name: OPENMVPT_WORKSPACE # workspace names are escaped. - paths: ~/build/$TARGET - - - stage: build - env: TARGET=NICLAV - workspaces: - create: - name: NICLAV_WORKSPACE # workspace names are escaped. - paths: ~/build/$TARGET - - - stage: build - env: TARGET=NANO33 - workspaces: - create: - name: NANO33_WORKSPACE # workspace names are escaped. - paths: ~/build/$TARGET - - - stage: build - env: TARGET=ARDUINO_NANO_RP2040_CONNECT - workspaces: - create: - name: ARDUINO_NANO_RP2040_CONNECT_WORKSPACE # workspace names are escaped. - paths: ~/build/$TARGET - - - stage: build - env: TARGET=WINC1500 - workspaces: - create: - name: WINC1500_WORKSPACE # workspace names are escaped. - paths: ~/build/$TARGET - script: - - cp -rf src/drivers/winc1500/firmware ~/build/$TARGET - - - stage: build - env: TARGET=CYW4343 - workspaces: - create: - name: CYW4343_WORKSPACE # workspace names are escaped. - paths: ~/build/$TARGET - script: - - cp -rf src/drivers/cyw4343/firmware ~/build/$TARGET - - - stage: deploy - git: - clone: false - workspaces: - use: - - OPENMV2_WORKSPACE - - OPENMV3_WORKSPACE - - OPENMV4_WORKSPACE - - OPENMV4P_WORKSPACE - - PORTENTA_WORKSPACE - - OPENMVPT_WORKSPACE - - NICLAV_WORKSPACE - - NANO33_WORKSPACE - - ARDUINO_NANO_RP2040_CONNECT_WORKSPACE - - WINC1500_WORKSPACE - - CYW4343_WORKSPACE - script: - - zip -r firmware_${TRAVIS_TAG}.zip OPENMV2 OPENMV3 OPENMV4 OPENMV4P PORTENTA OPENMVPT NICLAV NANO33 ARDUINO_NANO_RP2040_CONNECT WINC1500 CYW4343 - deploy: - provider: releases - api_key: - secure: lE3IuL9TA5LMCSefXm8BO4Eo9+M8DjIuNG2bmZlL7/ucY1i9OmGp56pnLcRwZ5slQbKX+hzNtTFDqb7eLGn1hpzYEZHl8VEjZLRoXqZC7JmQm7EmRRljpXSEoWCxee6kUOaltNAoycmTy0JtmnFdflJ+lXWQ8Pw/GVu91SXGjDWldNJLcLOcCl8CXEr8pwt5WUsRgQ7NYwj+Fd1vQ7ii7yPEwJNHsUHpWRezKorTgYKuphXOkWSLhbsc9HaGfbNKocgoU3hpDE445MKEa+PnBGMsqWQYXag9QA/vY1olKrB3ICzIV8rhARH9h6jJ0c0fnHtaR6pnp9IC11ZpvUTzsj/Dw7doUNHtUwQtBPmTWjm3FQAWLqJJKmo1zXIXUKyc32NTsnKBAdu9jI2i1/1wopATGQzlds4oqPHFzr7OLfZUFf/b19UC9GqnBuEV2Q4pFZJV5c853UNQ7qio39rD5ykJPNKlK1aeKv1Z4+5Yi/pHmVYKyqx1bPQX7qHYKgGQ7PYNa5InPMDWrDG7v5FRoVNFSffpMpk3hqjbjti6KT7YvL6rCQN8A5dp00m/cVizx3xj/CS1rXJUbGDkoV3PxYPUmUN+2NQsS9NDQfVQxWKwIGjJkOjTZsrFwNGQAzujR0rfuYAyp0mcvWjXGW7hKMZrYCMK7rxEOA4Dka3ndIo= - name: ${TRAVIS_TAG} - file: firmware_${TRAVIS_TAG}.zip - skip_cleanup: true - on: - tags: true - draft: true diff --git a/tools/ci.sh b/tools/ci.sh new file mode 100755 index 000000000..a9ba1b08b --- /dev/null +++ b/tools/ci.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +######################################################################################## +# Install ARM GCC. + +ci_install_arm_gcc_apt() { + sudo apt-get install gcc-arm-none-eabi libnewlib-arm-none-eabi + arm-none-eabi-gcc --version +} + +ci_install_arm_gcc() { + mkdir ${HOME}/gcc + GCC_URL="https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2" + wget --no-check-certificate -O - ${GCC_URL} | tar --strip-components=1 -jx -C ${HOME}/gcc + export PATH=${HOME}/gcc/bin:${PATH} + arm-none-eabi-gcc --version +} + +######################################################################################## +# Update Submodules. + +ci_update_submodules() { + git submodule update --init --depth=1 --no-single-branch + git -C src/micropython/ submodule update --init --depth=1 +# (cd src/micropython/ && for remote in `git branch -r | grep -v /HEAD | grep -v master`; do git checkout --track $remote ; done) +} + +######################################################################################## +# Build Targets. + +ci_build_target() { + export PATH=${HOME}/gcc/bin:${PATH} + make -j$(nproc) -C src/micropython/mpy-cross + make -j$(nproc) TARGET=${1} -C src + mkdir firmware + mv src/build/bin firmware/${1} +} + +######################################################################################## +# Prepare Firmware Packages. + +ci_package_firmware_release() { + # Add WiFi firmware blobs + cp -rf src/drivers/cyw4343/firmware firmware/CYW4343 + cp -rf src/drivers/winc1500/firmware firmware/WINC1500 + (cd firmware && zip -r ../firmware_${1}.zip *) +} + +ci_package_firmware_development() { + (cd firmware && for i in *; do zip -r -j "firmware_${i%/}.zip" "$i"; done) +}