Skip to content

CI chore: esp32 bump qemu/pytest tools #6729

CI chore: esp32 bump qemu/pytest tools

CI chore: esp32 bump qemu/pytest tools #6729

Workflow file for this run

#
# Copyright 2022 Davide Bettio <davide@uninstall.it>
#
# SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later
#
name: ESP32 Builds
on:
push:
paths:
- '.github/workflows/esp32-build.yaml'
- 'CMakeLists.txt'
- 'CMakeModules/**'
- 'libs/**'
- 'src/platforms/esp32/**'
- 'src/platforms/esp32/**/**'
- 'src/libAtomVM/**'
- 'tools/packbeam/**'
pull_request:
paths:
- '.github/workflows/esp32-build.yaml'
- 'CMakeLists.txt'
- 'CMakeModules/**'
- 'libs/**'
- 'src/platforms/esp32/**'
- 'src/platforms/esp32/**/**'
- 'src/libAtomVM/**'
- 'tools/packbeam/**'
concurrency:
group: ${{ github.workflow }}-${{ github.ref != 'refs/heads/main' && github.ref || github.run_id }}
cancel-in-progress: true
jobs:
esp-idf:
runs-on: ubuntu-24.04
container: espressif/idf:${{ matrix.idf-version }}
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
esp-idf-target: ["esp32", "esp32c3"]
idf-version:
- 'v5.2.7'
- 'v5.3.5'
- 'v5.4.4'
- 'v5.5.4'
jit: [false]
include:
- esp-idf-target: "esp32p4"
idf-version: 'v5.4.4'
jit: false
- esp-idf-target: "esp32p4"
idf-version: 'v5.5.4'
jit: false
- esp-idf-target: "esp32s3"
idf-version: 'v5.5.4'
jit: false
- esp-idf-target: "esp32s3"
idf-version: 'v5.5.4'
usb-serial: 'ON'
jit: false
- esp-idf-target: "esp32s3"
idf-version: 'v5.5.4'
usb-cdc: 'ON'
jit: false
- esp-idf-target: "esp32"
idf-version: 'v5.4.4'
libsodium: 'ON'
jit: false
# JIT builds (v5.5.4 only)
- esp-idf-target: "esp32c3"
idf-version: 'v5.5.4'
jit: true
- esp-idf-target: "esp32"
idf-version: 'v5.5.4'
jit: true
- esp-idf-target: "esp32s3"
idf-version: 'v5.5.4'
jit: true
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: "Git config safe.directory for codeql"
run: git config --global --add safe.directory /__w/AtomVM/AtomVM
- name: "Initialize CodeQL"
uses: github/codeql-action/init@v4
with:
languages: "cpp"
build-mode: manual
queries: +./code-queries/term-to-non-term-func.ql,./code-queries/non-term-to-term-func.ql,./code-queries/mismatched-atom-string-length.ql,./code-queries/mismatched-free-type.ql,./code-queries/term-use-after-gc.ql,./code-queries/allocations-exceeding-ensure-free.ql,./code-queries/allocations-without-ensure-free.ql
- name: Add libsodium dependency
if: matrix.libsodium == 'ON'
working-directory: ./src/platforms/esp32/
run: |
. $IDF_PATH/export.sh
idf.py add-dependency "espressif/libsodium^1.0.20~4"
- name: Add ESP TinyUSB dependency
if: matrix.usb-serial == 'ON' || matrix.usb-cdc == 'ON'
working-directory: ./src/platforms/esp32/
run: |
. $IDF_PATH/export.sh
idf.py add-dependency "espressif/esp_tinyusb^2.0.0"
- name: Build with idf.py
shell: bash
working-directory: ./src/platforms/esp32/
env:
USB_SERIAL: ${{ matrix.usb-serial || 'OFF' }}
USB_CDC: ${{ matrix.usb-cdc || 'OFF' }}
run: |
. $IDF_PATH/export.sh
if [[ "${USB_SERIAL}" == "ON" ]]; then
echo 'CONFIG_USE_USB_SERIAL=y' >> sdkconfig.defaults.in
fi
if [[ "${USB_CDC}" == "ON" ]]; then
printf '%s\n' \
'CONFIG_TINYUSB_CDC_ENABLED=y' \
'CONFIG_AVM_ENABLE_USB_CDC_PORT_DRIVER=y' \
>> sdkconfig.defaults.in
fi
export IDF_TARGET=${{matrix.esp-idf-target}}
if [ "${{ matrix.jit }}" = "true" ]; then
SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.jit" idf.py set-target ${{matrix.esp-idf-target}}
SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.jit" idf.py build
else
idf.py set-target ${{matrix.esp-idf-target}}
idf.py ${{ matrix.libsodium == 'ON' && '-DAVM_USE_LIBSODIUM=ON' || '' }} build
fi
- name: Print size info with idf.py
if: matrix.idf-version != 'v5.2.7'
shell: bash
working-directory: ./src/platforms/esp32/
run: |
. $IDF_PATH/export.sh
idf.py size
idf.py size-components
- name: "Perform CodeQL Analysis"
uses: github/codeql-action/analyze@v4
- name: Install dependencies to build host AtomVM and run qemu
run: |
set -eu
apt update
DEBIAN_FRONTEND=noninteractive apt install -y -q \
doxygen libglib2.0-0 libpixman-1-0 \
gcc g++ zlib1g-dev libsdl2-2.0-0 libslirp0 libmbedtls-dev
- name: "Set ImageOS for erlef/setup-beam"
run: |
sed -n -E -e 's|VERSION_ID="(.+)\..+"|ImageOS=ubuntu\1|p' /etc/os-release >> ${GITHUB_ENV}
- uses: erlef/setup-beam@v1
with:
otp-version: "28"
elixir-version: "1.19"
rebar3-version: "3.25.1"
gleam-version: "1.11.1"
hexpm-mirrors: |
https://builds.hex.pm
https://repo.hex.pm
https://cdn.jsdelivr.net/hex
- name: Install qemu binary from espressif/qemu esp32
if: runner.arch != 'ARM64' && runner.os == 'Linux' && (matrix.esp-idf-target == 'esp32' || matrix.esp-idf-target == 'esp32s3')
run: |
set -eu
QEMU_VER=esp-develop-9.2.2-20260417
QEMU_XTENSA_DIST=qemu-xtensa-softmmu-esp_develop_9.2.2_20260417-x86_64-linux-gnu.tar.xz
QEMU_XTENSA_SHA256=0eecb2a34a5586c0e59110f77b9343b7b336e82fdb0e1a30e1dc1bab8a547e35
wget --no-verbose https://github.com/espressif/qemu/releases/download/${QEMU_VER}/${QEMU_XTENSA_DIST}
echo "${QEMU_XTENSA_SHA256} *${QEMU_XTENSA_DIST}" | sha256sum --check --strict -
tar -xf ${QEMU_XTENSA_DIST} -C /opt && rm ${QEMU_XTENSA_DIST}
- name: Install qemu binary from espressif/qemu esp32c3
if: runner.arch != 'ARM64' && runner.os == 'Linux' && matrix.esp-idf-target == 'esp32c3'
run: |
set -eu
QEMU_VER=esp-develop-9.2.2-20260417
QEMU_RISCV32_DIST=qemu-riscv32-softmmu-esp_develop_9.2.2_20260417-x86_64-linux-gnu.tar.xz
QEMU_RISCV32_SHA256=547f03e04701a92cbb699f7f7d015adc1f5b5ef93cbb94c0dd9b7107e2d84e77
wget --no-verbose https://github.com/espressif/qemu/releases/download/${QEMU_VER}/${QEMU_RISCV32_DIST}
echo "${QEMU_RISCV32_SHA256} *${QEMU_RISCV32_DIST}" | sha256sum --check --strict -
tar -xf ${QEMU_RISCV32_DIST} -C /opt && rm ${QEMU_RISCV32_DIST}
- name: Install qemu binary from espressif/qemu ARM64 esp32
if: runner.arch == 'ARM64' && runner.os == 'Linux' && (matrix.esp-idf-target == 'esp32' || matrix.esp-idf-target == 'esp32s3')
run: |
set -eu
QEMU_VER=esp-develop-9.2.2-20260417
QEMU_XTENSA_DIST=qemu-xtensa-softmmu-esp_develop_9.2.2_20260417-aarch64-linux-gnu.tar.xz
QEMU_XTENSA_SHA256=00de5985094c14e47d1b38464a006b8ed64fd0fa7a289c56da24f3a329f65339
wget --no-verbose https://github.com/espressif/qemu/releases/download/${QEMU_VER}/${QEMU_XTENSA_DIST}
echo "${QEMU_XTENSA_SHA256} *${QEMU_XTENSA_DIST}" | sha256sum --check --strict -
tar -xf ${QEMU_XTENSA_DIST} -C /opt && rm ${QEMU_XTENSA_DIST}
- name: Install qemu binary from espressif/qemu ARM64 esp32c3
if: runner.arch == 'ARM64' && runner.os == 'Linux' && matrix.esp-idf-target == 'esp32c3'
run: |
set -eu
QEMU_VER=esp-develop-9.2.2-20260417
QEMU_RISCV32_DIST=qemu-riscv32-softmmu-esp_develop_9.2.2_20260417-aarch64-linux-gnu.tar.xz
QEMU_RISCV32_SHA256=a9f7b98636008edcf7a11c96f10b3a3ec83c2a890fc54c3e3ceb3ec9edace427
wget --no-verbose https://github.com/espressif/qemu/releases/download/${QEMU_VER}/${QEMU_RISCV32_DIST}
echo "${QEMU_RISCV32_SHA256} *${QEMU_RISCV32_DIST}" | sha256sum --check --strict -
tar -xf ${QEMU_RISCV32_DIST} -C /opt && rm ${QEMU_RISCV32_DIST}
- name: Install pytest and pytest-embedded plugins
# ESP32P4 is not currently supported by espressif/qemu, but an issue has been opened
# (https://github.com/espressif/qemu/issues/127) and marked as "todo" status, but no
# expected timeline is available yet.
# TODO: remove the following exclusion when ESP32P4 support is added to espressif/qemu
if: matrix.esp-idf-target != 'esp32p4'
run: |
set -e
. $IDF_PATH/export.sh
pip install pytest==8.3.4 \
esptool==5.3.0 \
pytest-embedded==2.8.1 \
pytest-embedded-serial-esp==2.8.1 \
pytest-embedded-idf==2.8.1 \
pytest-embedded-qemu==2.8.1
- name: Build ESP32 tests using idf.py with memory checks
# TODO: remove the following exclusion when ESP32P4 support is added to espressif/qemu
if: matrix.esp-idf-target != 'esp32p4'
working-directory: ./src/platforms/esp32/test/
run: |
set -e
export PATH=${PATH}:${HOME}/.cache/rebar3/bin
cp sdkconfig.defaults sdkconfig.defaults.backup
echo "CONFIG_COMPILER_STACK_CHECK_MODE_ALL=y" >> sdkconfig.defaults
echo "CONFIG_COMPILER_STACK_CHECK=y" >> sdkconfig.defaults
echo "CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=y" >> sdkconfig.defaults
echo "CONFIG_HEAP_POISONING_COMPREHENSIVE=y" >> sdkconfig.defaults
echo "CONFIG_ESP_WIFI_IRAM_OPT=n" >> sdkconfig.defaults
echo "CONFIG_ESP_WIFI_RX_IRAM_OPT=n" >> sdkconfig.defaults
if [ "${{ matrix.jit }}" = "true" ]; then
echo "CONFIG_JIT_ENABLED=y" >> sdkconfig.defaults
fi
. $IDF_PATH/export.sh
export IDF_TARGET=${{matrix.esp-idf-target}}
idf.py set-target ${{matrix.esp-idf-target}}
idf.py build
- name: Run ESP32 tests using qemu with memory checks build
# TODO: remove the following exclusion when ESP32P4 support is added to espressif/qemu
if: matrix.esp-idf-target != 'esp32p4'
working-directory: ./src/platforms/esp32/test/
timeout-minutes: 10
run: |
set -e
. $IDF_PATH/export.sh
export PATH=/opt/qemu/bin:${PATH}
pytest --target=${{matrix.esp-idf-target}} --embedded-services=idf,qemu -s
idf.py clean
cp sdkconfig.defaults.backup sdkconfig.defaults
- name: Upload ESP32 tests ELF artifact with memory checks build
# TODO: remove the following exclusion when ESP32P4 support is added to espressif/qemu
if: failure() && matrix.esp-idf-target != 'esp32p4'
uses: actions/upload-artifact@v4
with:
name: atomvm-esp32-test-${{ matrix.esp-idf-target }}-${{ matrix.idf-version }}${{ matrix.jit && '-jit' || '' }}-memcheck.elf
path: ./src/platforms/esp32/test/build/atomvm-esp32-test.elf
if-no-files-found: error
- name: Build ESP32 tests using idf.py
# TODO: remove the following exclusion when ESP32P4 support is added to espressif/qemu
if: matrix.esp-idf-target != 'esp32p4'
working-directory: ./src/platforms/esp32/test/
run: |
set -e
. $IDF_PATH/export.sh
export IDF_TARGET=${{matrix.esp-idf-target}}
export PATH=${PATH}:${HOME}/.cache/rebar3/bin
cp sdkconfig.defaults sdkconfig.defaults.backup
if [ "${{ matrix.jit }}" = "true" ]; then
echo "CONFIG_JIT_ENABLED=y" >> sdkconfig.defaults
fi
idf.py set-target ${{matrix.esp-idf-target}}
idf.py build
- name: Run ESP32 tests using qemu
# TODO: remove the following exclusion when ESP32P4 support is added to espressif/qemu
if: matrix.esp-idf-target != 'esp32p4'
working-directory: ./src/platforms/esp32/test/
timeout-minutes: 10
run: |
set -e
. $IDF_PATH/export.sh
export PATH=/opt/qemu/bin:${PATH}
pytest --target=${{matrix.esp-idf-target}} --embedded-services=idf,qemu -s
cp sdkconfig.defaults.backup sdkconfig.defaults
- name: Upload ESP32 tests ELF artifact
# TODO: remove the following exclusion when ESP32P4 support is added to espressif/qemu
if: failure() && matrix.esp-idf-target != 'esp32p4'
uses: actions/upload-artifact@v4
with:
name: atomvm-esp32-test-${{ matrix.esp-idf-target }}-${{ matrix.idf-version }}${{ matrix.jit && '-jit' || '' }}.elf
path: ./src/platforms/esp32/test/build/atomvm-esp32-test.elf
if-no-files-found: error