Build ESP32 Rust no_std binaries and upload to GitHub Release #8
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build ESP32 Rust Binaries and upload to GitHub Release | |
on: | |
workflow_dispatch: | |
inputs: | |
release_tag: | |
description: "Upload to specific release" | |
required: true | |
default: 'v0.1.0' | |
skip_projects: | |
description: "Skip projects during build (e.g. esp32-c3-devkit-rust)" | |
required: false | |
default: '' | |
jobs: | |
get_release: | |
name: Get release | |
runs-on: ubuntu-latest | |
outputs: | |
upload_url: ${{ steps.get_upload_url.outputs.url }} | |
steps: | |
- uses: octokit/[email protected] | |
id: get_release | |
with: | |
route: GET /repos/{owner}/{repo}/releases/tags/${{ github.event.inputs.release_tag }} | |
owner: georgik | |
repo: esp32-lang-lab | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: get upload url | |
id: get_upload_url | |
run: | | |
url=$(echo "$response" | jq -r '.upload_url' | sed 's/{?name,label}//') | |
echo "url=$url" >> $GITHUB_OUTPUT | |
env: | |
response: ${{ steps.get_release.outputs.data }} | |
build: | |
runs-on: ubuntu-22.04 | |
container: | |
image: espressif/idf-rust:all_1.75.0.0 | |
options: --user esp --workdir /home/esp | |
needs: get_release | |
steps: | |
- name: Clone repository with specific branch | |
run: | | |
export HOME=/home/esp | |
cd /home/esp | |
set +e # Workaround for Exit code 2 exit code installation | |
curl -L https://wokwi.com/ci/install.sh | sh | |
exit_code=$? | |
if [ $exit_code -eq 2 ]; then | |
echo "Received exit code 2 from install script, overriding to 0" | |
exit_code=0 | |
else | |
exit $exit_code | |
fi | |
set -e | |
pwd | |
git clone --depth 1 --branch ${{ github.ref_name }} https://github.com/georgik/esp32-lang-lab.git esp32-lang-lab | |
- name: Build and upload binaries | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
WOKWI_CLI_TOKEN: ${{ secrets.WOKWI_CLI_TOKEN }} | |
run: | | |
# Workaround GitHub issue with setting HOME in container https://github.com/actions/runner/issues/863 | |
export HOME=/home/esp | |
export PROJECT="${HOME}/esp32-lang-lab/examples/rust/no_std/hello-world" | |
cd /home/esp | |
. /home/esp/.bashrc | |
. /home/esp/export-esp.sh | |
# Upload loop for each binary | |
cd ${PROJECT} | |
for TARGET in esp32 esp32s2 esp32s3 esp32c3 esp32c6 esp32h2; do | |
echo "Building $TARGET" | |
OUTPUT_PREFIX="rust-no_std-hello-world-${TARGET}-${{ github.event.inputs.release_tag }}" | |
OUTPUT_BIN="${OUTPUT_PREFIX}.bin" | |
OUTPUT_TXT="${OUTPUT_PREFIX}.txt" | |
# If TARGET is a substring in SKIP_PROJECTS, skip it | |
#if echo "${{ github.event.inputs.skip_projects }}" | grep -q "${TARGET}"; then | |
# echo "Skipping $TARGET" | |
# continue | |
#fi | |
#cd $TARGET | |
echo "Building $TARGET" | |
#VERSION=$(grep '^version =' Cargo.toml | cut -d '"' -f2) | |
#CHIP=$(grep 'hal = { package =' Cargo.toml | cut -d '"' -f2 | cut -d '-' -f1) | |
# Prepare Rust build | |
cp support/rust/rust-toolchain-${TARGET}.toml rust-toolchain.toml | |
echo "Toolchain: $(cat rust-toolchain.toml)" | |
# Using alias from .cargo/config.toml | |
cargo "save-image-${TARGET}" --release --merge --skip-padding ${OUTPUT_BIN} | |
# Prepare Wokwi test | |
cp support/wokwi/diagram-${TARGET}.json diagram.json | |
cp support/wokwi/wokwi-${TARGET}.toml wokwi.toml | |
# Run Wokwi test | |
/home/esp/bin/wokwi-cli --timeout 5000 \ | |
--timeout-exit-code 0 \ | |
--serial-log-file ${PROJECT}/${OUTPUT_TXT} \ | |
--elf ${OUTPUT_BIN} \ | |
"." | |
# Upload binary | |
asset_path="${PROJECT}/${OUTPUT_BIN}" | |
asset_name="${OUTPUT_BIN}" | |
curl \ | |
--request POST \ | |
--header "authorization: Bearer $GITHUB_TOKEN" \ | |
--header "Content-Type: application/octet-stream" \ | |
--data-binary "@$asset_path" \ | |
--url "${{ needs.get_release.outputs.upload_url }}?name=${asset_name}" | |
# Upload log | |
asset_path="${PROJECT}/${OUTPUT_TXT}" | |
asset_name="${OUTPUT_TXT}" | |
curl \ | |
--request POST \ | |
--header "authorization: Bearer $GITHUB_TOKEN" \ | |
--header "Content-Type: application/octet-stream" \ | |
--data-binary "@$asset_path" \ | |
--url "${{ needs.get_release.outputs.upload_url }}?name=${asset_name}" | |
# If skip-wokwi-test.toml exists, skip Wokwi test | |
#if [ ! -f "skip-wokwi-test.toml" ]; then | |
# asset_path="/home/esp/project/${TARGET}/screenshot.png" | |
# asset_name="spooky-maze-${TARGET}-${{ github.event.inputs.release_tag }}.png" | |
# curl \ | |
# --request POST \ | |
# --header "authorization: Bearer $GITHUB_TOKEN" \ | |
# --header "Content-Type: application/octet-stream" \ | |
# --data-binary "@$asset_path" \ | |
# --url "${{ needs.get_release.outputs.upload_url }}?name=${asset_name}" | |
#fi | |
cd - | |
done |