# SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors) # # SPDX-License-Identifier: MIT name: Build CI on: push: pull_request: release: types: [published] check_suite: types: [rerequested] jobs: test: runs-on: ubuntu-20.04 steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: actions/checkout@v2.2.0 with: submodules: true fetch-depth: 0 - run: git fetch --recurse-submodules=no https://github.com/adafruit/circuitpython refs/tags/*:refs/tags/* - name: CircuitPython version run: | git describe --dirty --tags echo >>$GITHUB_ENV CP_VERSION=$(git describe --dirty --tags) - name: Set up Python 3.8 uses: actions/setup-python@v1 with: python-version: 3.8 - name: Install deps run: | sudo apt-get update sudo apt-get install -y eatmydata sudo eatmydata apt-get install -y gettext librsvg2-bin mingw-w64 latexmk texlive-fonts-recommended texlive-latex-recommended texlive-latex-extra gcc-aarch64-linux-gnu pip install -r requirements-dev.txt - name: Versions run: | gcc --version python3 --version - name: New boards check run: python3 -u ci_new_boards_check.py working-directory: tools - name: Duplicate USB VID/PID Check run: python3 -u -m tools.ci_check_duplicate_usb_vid_pid - name: Build and Validate Stubs run: make check-stubs -j2 - uses: actions/upload-artifact@v2 with: name: stubs path: circuitpython-stubs/dist/* - name: Install pypi dependencies run: | python -m pip install --upgrade pip pip install setuptools wheel twine - name: Test Documentation Build (HTML) run: sphinx-build -E -W -b html -D version=${{ env.CP_VERSION }} -D release=${{ env.CP_VERSION }} . _build/html - uses: actions/upload-artifact@v2 with: name: docs path: _build/html - name: Test Documentation Build (LaTeX/PDF) run: | make latexpdf - uses: actions/upload-artifact@v2 with: name: docs path: _build/latex - name: Build mpy-cross run: make -C mpy-cross -j2 - name: Build unix port run: | make -C ports/unix VARIANT=coverage -j2 - name: Test all run: MICROPY_CPYTHON3=python3.8 MICROPY_MICROPYTHON=../ports/unix/micropython-coverage ./run-tests.py -j1 working-directory: tests - name: Print failure info run: MICROPY_CPYTHON3=python3.8 MICROPY_MICROPYTHON=../ports/unix/micropython-coverage ./run-tests.py -j1 --print-failures if: failure() working-directory: tests - name: Native Tests run: MICROPY_CPYTHON3=python3.8 MICROPY_MICROPYTHON=../ports/unix/micropython-coverage ./run-tests.py -j1 --emit native working-directory: tests - name: mpy Tests run: MICROPY_CPYTHON3=python3.8 MICROPY_MICROPYTHON=../ports/unix/micropython-coverage ./run-tests.py -j1 --mpy-cross-flags='-mcache-lookup-bc' --via-mpy -d basics float micropython working-directory: tests - name: Native mpy Tests run: MICROPY_CPYTHON3=python3.8 MICROPY_MICROPYTHON=../ports/unix/micropython-coverage ./run-tests.py -j1 --mpy-cross-flags='-mcache-lookup-bc' --via-mpy --emit native -d basics float micropython working-directory: tests - name: Build mpy-cross.static-aarch64 run: make -C mpy-cross -j2 -f Makefile.static-aarch64 - uses: actions/upload-artifact@v2 with: name: mpy-cross.static-aarch64 path: mpy-cross/mpy-cross.static-aarch64 - name: Build mpy-cross.static-raspbian run: make -C mpy-cross -j2 -f Makefile.static-raspbian - uses: actions/upload-artifact@v2 with: name: mpy-cross.static-raspbian path: mpy-cross/mpy-cross.static-raspbian - name: Build mpy-cross.static run: make -C mpy-cross -j2 -f Makefile.static - uses: actions/upload-artifact@v2 with: name: mpy-cross.static-amd64-linux path: mpy-cross/mpy-cross.static - name: Build mpy-cross.static-mingw run: make -C mpy-cross -j2 -f Makefile.static-mingw - uses: actions/upload-artifact@v2 with: name: mpy-cross.static-x64-windows path: mpy-cross/mpy-cross.static.exe - name: Upload mpy-cross builds to S3 if: (github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested')) env: AWS_PAGER: '' AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} run: | [ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross.static-aarch64 s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross.static-aarch64-${{ env.CP_VERSION }} --no-progress --region us-east-1 [ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross.static-raspbian s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross.static-raspbian-${{ env.CP_VERSION }} --no-progress --region us-east-1 [ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross.static s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross.static-amd64-linux-${{ env.CP_VERSION }} --no-progress --region us-east-1 [ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross.static.exe s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross.static-x64-windows-${{ env.CP_VERSION }}.exe --no-progress --region us-east-1 zip -9r circuitpython-stubs.zip circuitpython-stubs [ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp circuitpython-stubs/dist/*.tar.gz s3://adafruit-circuit-python/bin/stubs/circuitpython-stubs-${{ env.CP_VERSION }}.zip --no-progress --region us-east-1 - name: Upload stubs to PyPi if: github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit' env: TWINE_USERNAME: ${{ secrets.pypi_username }} TWINE_PASSWORD: ${{ secrets.pypi_password }} run: | # setup.py sdist was run by 'make stubs' [ -z "$TWINE_USERNAME" ] || echo "Uploading dev release to PyPi" [ -z "$TWINE_USERNAME" ] || twine upload circuitpython-stubs/dist/* mpy-cross-mac: runs-on: macos-10.15 steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: actions/checkout@v2.2.0 with: submodules: true fetch-depth: 0 - run: git fetch --recurse-submodules=no https://github.com/adafruit/circuitpython refs/tags/*:refs/tags/* - name: CircuitPython version run: | git describe --dirty --tags echo >>$GITHUB_ENV CP_VERSION=$(git describe --dirty --tags) - name: Install dependencies run: | brew install gettext echo >>$GITHUB_PATH /usr/local/opt/gettext/bin - name: Versions run: | gcc --version python3 --version msgfmt --version - name: Build mpy-cross run: make -C mpy-cross -j2 - uses: actions/upload-artifact@v2 with: name: mpy-cross-macos-catalina path: mpy-cross/mpy-cross - name: Select SDK for M1 build run: sudo xcode-select -switch /Applications/Xcode_12.3.app - name: Build mpy-cross (arm64) run: make -C mpy-cross -j2 -f Makefile.m1 V=2 - uses: actions/upload-artifact@v2 with: name: mpy-cross-macos-bigsur-arm64 path: mpy-cross/mpy-cross-arm64 - name: Make universal binary run: lipo -create -output mpy-cross-macos-universal mpy-cross/mpy-cross mpy-cross/mpy-cross-arm64 - uses: actions/upload-artifact@v2 with: name: mpy-cross-macos-universal path: mpy-cross-macos-universal - name: Upload mpy-cross build to S3 run: | [ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross-macos-universal s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross-macos-universal-${{ env.CP_VERSION }} --no-progress --region us-east-1 [ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross-arm64 s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross-macos-bigsur-${{ env.CP_VERSION }}-arm64 --no-progress --region us-east-1 [ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross-macos-catalina-${{ env.CP_VERSION }} --no-progress --region us-east-1 env: AWS_PAGER: '' AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} if: (github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested')) build-arm: runs-on: ubuntu-20.04 needs: test strategy: fail-fast: false matrix: board: - "8086_commander" - "ADM_B_NRF52840_1" - "TG-Watch" - "adafruit_feather_rp2040" - "adafruit_itsybitsy_rp2040" - "adafruit_macropad_rp2040" - "adafruit_neokey_trinkey_m0" - "adafruit_proxlight_trinkey_m0" - "adafruit_qt2040_trinkey" - "adafruit_qtpy_rp2040" - "adafruit_rotary_trinkey_m0" - "adafruit_slide_trinkey_m0" - "aloriumtech_evo_m51" - "aramcon2_badge" - "aramcon_badge_2019" - "arduino_mkr1300" - "arduino_mkrzero" - "arduino_nano_33_ble" - "arduino_nano_33_iot" - "arduino_nano_rp2040_connect" - "arduino_zero" - "bast_pro_mini_m0" - "bastble" - "bdmicro_vina_d21" - "bdmicro_vina_d51" - "bdmicro_vina_d51_pcb7" - "bless_dev_board_multi_sensor" - "blm_badge" - "bluemicro840" - "capablerobot_usbhub" - "catwan_usbstick" - "circuitbrains_basic_m0" - "circuitbrains_deluxe_m4" - "circuitplayground_bluefruit" - "circuitplayground_express" - "circuitplayground_express_crickit" - "circuitplayground_express_displayio" - "clue_nrf52840_express" - "cp32-m4" - "cp_sapling_m0" - "cp_sapling_m0_revb" - "cp_sapling_m0_spiflash" - "cytron_maker_pi_rp2040" - "datalore_ip_m4" - "datum_distance" - "datum_imu" - "datum_light" - "datum_weather" - "dynalora_usb" - "dynossat_edu_eps" - "dynossat_edu_obc" - "electronut_labs_blip" - "electronut_labs_papyr" - "escornabot_makech" - "espruino_pico" - "espruino_wifi" - "feather_bluefruit_sense" - "feather_m0_adalogger" - "feather_m0_basic" - "feather_m0_express" - "feather_m0_express_crickit" - "feather_m0_rfm69" - "feather_m0_rfm9x" - "feather_m0_supersized" - "feather_m4_can" - "feather_m4_express" - "feather_m7_1011" - "feather_mimxrt1011" - "feather_mimxrt1062" - "feather_nrf52840_express" - "feather_stm32f405_express" - "fluff_m0" - "gemma_m0" - "grandcentral_m4_express" - "hallowing_m0_express" - "hallowing_m4_express" - "hiibot_bluefi" - "huntercat_nfc" - "ikigaisense_vita" - "imxrt1010_evk" - "imxrt1020_evk" - "imxrt1060_evk" - "itsybitsy_m0_express" - "itsybitsy_m4_express" - "itsybitsy_nrf52840_express" - "kicksat-sprite" - "loc_ber_m4_base_board" - "makerdiary_m60_keyboard" - "makerdiary_nrf52840_m2_devkit" - "makerdiary_nrf52840_mdk" - "makerdiary_nrf52840_mdk_usb_dongle" - "matrixportal_m4" - "meowbit_v121" - "meowmeow" - "metro_m0_express" - "metro_m4_airlift_lite" - "metro_m4_express" - "metro_m7_1011" - "metro_nrf52840_express" - "microbit_v2" - "mini_sam_m4" - "monster_m4sk" - "ndgarage_ndbit6" - "ndgarage_ndbit6_v2" - "neopixel_trinkey_m0" - "nfc_copy_cat" - "nice_nano" - "nucleo_f746zg" - "nucleo_f767zi" - "nucleo_h743zi_2" - "ohs2020_badge" - "openbook_m4" - "openmv_h7" - "particle_argon" - "particle_boron" - "particle_xenon" - "pca10056" - "pca10059" - "pca10100" - "pewpew10" - "pewpew_m4" - "picoplanet" - "pimoroni_interstate75" - "pimoroni_keybow2040" - "pimoroni_pga2040" - "pimoroni_picolipo_16mb" - "pimoroni_picolipo_4mb" - "pimoroni_picosystem" - "pimoroni_plasma2040" - "pimoroni_tiny2040" - "pitaya_go" - "pyb_nano_v2" - "pybadge" - "pyboard_v11" - "pycubed" - "pycubed_mram" - "pygamer" - "pyportal" - "pyportal_titano" - "pyruler" - "qtpy_m0" - "qtpy_m0_haxpress" - "raspberry_pi_pico" - "raytac_mdbt50q-db-40" - "raytac_mdbt50q-rx" - "robohatmm1_m4" - "sam32" - "same54_xplained" - "seeeduino_wio_terminal" - "seeeduino_xiao" - "sensebox_mcu" - "serpente" - "shirtty" - "silicognition-m4-shim" - "simmel" - "snekboard" - "sparkfun_lumidrive" - "sparkfun_micromod_rp2040" - "sparkfun_nrf52840_micromod" - "sparkfun_nrf52840_mini" - "sparkfun_pro_micro_rp2040" - "sparkfun_qwiic_micro_no_flash" - "sparkfun_qwiic_micro_with_flash" - "sparkfun_redboard_turbo" - "sparkfun_samd21_dev" - "sparkfun_samd21_mini" - "sparkfun_samd51_micromod" - "sparkfun_samd51_thing_plus" - "sparkfun_stm32f405_micromod" - "sparkfun_thing_plus_rp2040" - "spresense" - "stackrduino_m0_pro" - "stm32f411ce_blackpill" - "stm32f411ce_blackpill_with_flash" - "stm32f411ve_discovery" - "stm32f412zg_discovery" - "stm32f4_discovery" - "stm32f746g_discovery" - "stringcar_m0_express" - "teensy40" - "teensy41" - "teknikio_bluebird" - "thunderpack_v11" - "thunderpack_v12" - "tinkeringtech_scoutmakes_azul" - "trellis_m4_express" - "trinket_m0" - "trinket_m0_haxpress" - "uartlogger2" - "uchip" - "ugame10" - "winterbloom_big_honking_button" - "winterbloom_sol" - "xinabox_cc03" - "xinabox_cs11" steps: - name: Set up Python 3.8 uses: actions/setup-python@v1 with: python-version: 3.8 - uses: actions/checkout@v2.2.0 with: submodules: true fetch-depth: 0 - run: git fetch --recurse-submodules=no https://github.com/adafruit/circuitpython refs/tags/*:refs/tags/* - name: Install deps run: | sudo apt-get install -y gettext pip install -r requirements-dev.txt wget --no-verbose https://adafruit-circuit-python.s3.amazonaws.com/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 sudo tar -C /usr --strip-components=1 -xaf gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 - name: Versions run: | gcc --version arm-none-eabi-gcc --version python3 --version - name: mpy-cross run: make -C mpy-cross -j2 - name: Setup build failure matcher run: echo "::add-matcher::$GITHUB_WORKSPACE/.github/workflows/match-build-fail.json" - name: build run: python3 -u build_release_files.py working-directory: tools env: BOARDS: ${{ matrix.board }} - uses: actions/upload-artifact@v2 with: name: ${{ matrix.board }} path: bin/${{ matrix.board }} - name: Upload to S3 run: "[ -z \"$AWS_ACCESS_KEY_ID\" ] || aws s3 cp bin/ s3://adafruit-circuit-python/bin/ --recursive --no-progress --region us-east-1" env: AWS_PAGER: '' AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} if: (github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested')) build-riscv: runs-on: ubuntu-20.04 needs: test strategy: fail-fast: false matrix: board: - "fomu" steps: - name: Set up Python 3.8 uses: actions/setup-python@v1 with: python-version: 3.8 - uses: actions/checkout@v2.2.0 with: submodules: true fetch-depth: 0 - run: git fetch --recurse-submodules=no https://github.com/adafruit/circuitpython refs/tags/*:refs/tags/* - name: Install deps run: | sudo apt-get install -y gettext pip install -r requirements-dev.txt wget https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-centos6.tar.gz sudo tar -C /usr --strip-components=1 -xaf riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-centos6.tar.gz - name: Versions run: | gcc --version riscv64-unknown-elf-gcc --version python3 --version - name: mpy-cross run: make -C mpy-cross -j2 - name: Setup build failure matcher run: echo "::add-matcher::$GITHUB_WORKSPACE/.github/workflows/match-build-fail.json" - name: build run: python3 -u build_release_files.py working-directory: tools env: BOARDS: ${{ matrix.board }} - uses: actions/upload-artifact@v2 with: name: ${{ matrix.board }} path: bin/${{ matrix.board }} - name: Upload to S3 run: "[ -z \"$AWS_ACCESS_KEY_ID\" ] || aws s3 cp bin/ s3://adafruit-circuit-python/bin/ --recursive --no-progress --region us-east-1" env: AWS_PAGER: '' AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} if: (github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested')) build-xtensa: runs-on: ubuntu-20.04 needs: test strategy: fail-fast: false matrix: board: - "adafruit_feather_esp32s2_nopsram" - "adafruit_feather_esp32s2_tftback_nopsram" - "adafruit_funhouse" - "adafruit_magtag_2.9_grayscale" - "adafruit_metro_esp32s2" - "ai_thinker_esp_12k_nodemcu" - "artisense_rd00" - "atmegazero_esp32s2" - "crumpspace_crumps2" - "electroniccats_bastwifi" - "espressif_kaluga_1" - "espressif_kaluga_1.3" - "espressif_saola_1_wroom" - "espressif_saola_1_wrover" - "franzininho_wifi_wroom" - "franzininho_wifi_wrover" - "gravitech_cucumber_m" - "gravitech_cucumber_ms" - "gravitech_cucumber_r" - "gravitech_cucumber_rs" - "lilygo_ttgo_t8_s2_st7789" - "microdev_micro_s2" - "morpheans_morphesp-240" - "muselab_nanoesp32_s2_wroom" - "muselab_nanoesp32_s2_wrover" - "odt_pixelwing_esp32_s2" - "targett_module_clip_wroom" - "targett_module_clip_wrover" - "unexpectedmaker_feathers2" - "unexpectedmaker_feathers2_prerelease" - "unexpectedmaker_tinys2" steps: - name: Set up Python 3.8 uses: actions/setup-python@v1 with: python-version: 3.8 - uses: actions/checkout@v2.2.0 with: submodules: true fetch-depth: 0 - run: git fetch --recurse-submodules=no https://github.com/adafruit/circuitpython refs/tags/*:refs/tags/* - name: CircuitPython version run: git describe --dirty --tags - uses: actions/cache@v2 name: Fetch IDF tool cache id: idf-cache with: path: ${{ github.workspace }}/.idf_tools key: ${{ runner.os }}-idf-tools-${{ hashFiles('.git/modules/ports/esp32s2/esp-idf/HEAD') }}-20210716 - name: Clone IDF submodules run: | (cd $IDF_PATH && git submodule update --init) env: IDF_PATH: ${{ github.workspace }}/ports/esp32s2/esp-idf - name: Install IDF tools run: | $IDF_PATH/tools/idf_tools.py --non-interactive install required $IDF_PATH/tools/idf_tools.py --non-interactive install cmake $IDF_PATH/tools/idf_tools.py --non-interactive install-python-env rm -rf $IDF_TOOLS_PATH/dist env: IDF_PATH: ${{ github.workspace }}/ports/esp32s2/esp-idf IDF_TOOLS_PATH: ${{ github.workspace }}/.idf_tools - name: Install CircuitPython deps run: | source $IDF_PATH/export.sh pip install -r requirements-dev.txt sudo apt-get install -y gettext ninja-build env: IDF_PATH: ${{ github.workspace }}/ports/esp32s2/esp-idf IDF_TOOLS_PATH: ${{ github.workspace }}/.idf_tools - name: Versions run: | source $IDF_PATH/export.sh gcc --version xtensa-esp32s2-elf-gcc --version python3 --version ninja --version cmake --version shell: bash env: IDF_PATH: ${{ github.workspace }}/ports/esp32s2/esp-idf IDF_TOOLS_PATH: ${{ github.workspace }}/.idf_tools - name: mpy-cross run: make -C mpy-cross -j2 - name: Setup build failure matcher run: echo "::add-matcher::$GITHUB_WORKSPACE/.github/workflows/match-build-fail.json" - name: build run: | source $IDF_PATH/export.sh python3 -u build_release_files.py working-directory: tools shell: bash env: IDF_PATH: ${{ github.workspace }}/ports/esp32s2/esp-idf IDF_TOOLS_PATH: ${{ github.workspace }}/.idf_tools BOARDS: ${{ matrix.board }} - uses: actions/upload-artifact@v2 with: name: ${{ matrix.board }} path: bin/${{ matrix.board }} - name: Upload to S3 run: "[ -z \"$AWS_ACCESS_KEY_ID\" ] || aws s3 cp bin/ s3://adafruit-circuit-python/bin/ --recursive --no-progress --region us-east-1" env: AWS_PAGER: '' AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} if: (github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))