name: Arduino CI Build (2 of 4) Release Arduino wolfSSL for Local Examples # TODO - implement this once future wolfSSL is released # # Known to fail on current 5.8.2 wolfSSL Arduino Release # # See arduino.yml - Arduino CI Build (3 of 4) Latest wolfSSL for Local Examples # # Test local Arduino examples with published Arduino wolfssl # # These 4 workflows across 3 repos are interdependent for the current $REPO_OWNER: # # Arduino CI Build 1: https://github.com/$REPO_OWNER/wolfssl # /.github/workflows/arduino.yml # - Builds Arduino library from local clone of wolfssl master branch # - Fetches examples from https://github.com/$REPO_OWNER/wolfssl-examples # # THIS Arduino CI Build 2: https://github.com/$REPO_OWNER/wolfssl-examples # /.github/workflows/arduino-release.yml # - Tests examples based on latest published release of Arduino library, NOT latest on wolfssl github. # - Should be identical to Arduino CI Build 3 in every way but wolfssl install. # - Copies only compile script from wolfssl-examples # - Builds local examples # - No other repos used # # Arduino CI Build 3: https://github.com/$REPO_OWNER/wolfssl-examples # /.github/workflows/arduino.yml # - Fetches current wolfSSL from https://github.com/$REPO_OWNER/wolfssl # - Creates an updated Arduino library # - Compiles local examples # - Contains the source of `compile-all-examples.sh` and respective board-list.txt # # Arduino CI Build 4: https://github.com/$REPO_OWNER/Arduino-wolfssl # /.github/workflows/arduino.yml # - Assembles and installs an updated Arduino wolfssl library from LOCAL wolfssl master source # - Copies only compile script copied from wolfssl-examples # - Builds local examples # - No other repos used # # # ** NOTE TO MAINTAINERS ** # # Consider using winmerge or similar tool to keep the 4 arduino[-release].yml files in relative sync. # Although there are some specific differences, most of the contents are otherwise identical. # # See https://github.com/wolfSSL/Arduino-wolfSSL # # To test locally: # cd [your WOLFSSL_ROOT], e.g. cd /mnt/c/workspace/wolfssl-$USER # [optional checkout] e.g. git checkout tags/v5.8.4-stable # pushd ./IDE/ARDUINO # export ARDUINO_ROOT="$HOME/Arduino/libraries" # ./wolfssl-arduino.sh INSTALL # cd [your WOLFSSL_EXAMPLES_ROOT] e.g. /mnt/c/workspace/wolfssl-examples-$USER # # START OF COMMON SECTION on: push: branches: [ '**', 'master', 'main', 'release/**' ] paths: # Specific to this Arduino CI Build (2 of 4) - 'Arduino/**' - '.github/workflows/arduino-release.yml' pull_request: branches: [ '**' ] paths: # Specific to this Arduino CI Build (2 of 4) - 'Arduino/**' - '.github/workflows/arduino-release.yml' workflow_dispatch: concurrency: # Same branch push cancels other jobs. Other PR branches untouched group: ${{ github.workflow }}-${{ github.ref_name }} cancel-in-progress: true # END OF COMMON SECTION jobs: build: name: on FQBN (${{ matrix.fqbn }}) if: github.repository_owner == 'wolfssl' runs-on: ubuntu-latest strategy: fail-fast: false matrix: fqbn: # When editing this list, be sure to also edit file: board_list.txt # The compile-all-examples.sh optionally takes a FQBN parameter to # optionally compile all examples ONLY for the respective fully qualified board name. # See https://github.com/wolfSSL/wolfssl-examples/blob/master/Arduino/sketches/board_list.txt - arduino:avr:ethernet - arduino:avr:leonardoeth - arduino:avr:mega - arduino:avr:nano - arduino:avr:uno - arduino:avr:yun - arduino:samd:mkrwifi1010 - arduino:samd:mkr1000 - arduino:samd:mkrfox1200 - arduino:mbed_edge:edge_control - arduino:mbed_nano:nanorp2040connect - arduino:mbed_portenta:envie_m7 - arduino:mbed_portenta:portenta_x8 - arduino:renesas_uno:unor4wifi - arduino:sam:arduino_due_x - arduino:samd:arduino_zero_native - arduino:samd:tian - esp32:esp32:esp32 - esp32:esp32:esp32s2 - esp32:esp32:esp32s3 - esp32:esp32:esp32c3 - esp32:esp32:esp32c6 - esp32:esp32:esp32h2 - esp8266:esp8266:generic - teensy:avr:teensy40 # Not yet supported, not in standard library # - esp32:esp32:nano_nora # End strategy matrix env: REPO_OWNER: ${{ github.repository_owner }} steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Install Arduino CLI run: | # Script to fetch and run install.sh from arduino/arduino-cli # The install script will test to see if the recently installed apps in the path # So set it up in advance: mkdir -p "${PWD}/bin" echo "${PWD}/bin" >> $GITHUB_PATH # Sets the install directory to a consistent path at the repo root. ROOT_BIN="$GITHUB_WORKSPACE/bin" # Ensures that BINDIR exists before the installer runs mkdir -p "$ROOT_BIN" # Save as a global environment variable echo "$ROOT_BIN" >> "$GITHUB_PATH" # Download and run install script from Arduino: # -S show errors; -L follow redirects; -v Verbose set +e # don't abort on error set -o pipefail curl -vSL --retry 5 --retry-delay 10 \ https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh \ | sh -x rc=$? c_rc=${PIPESTATUS[0]} # curl's exit code s_rc=${PIPESTATUS[1]} # sh's exit code set -e # restore default abort-on-error # If there was a curl error, we have our own local copy that is more reliable and can add our own debugging if [ "$rc" -ne 0 ]; then echo "Primary install failed: curl=$c_rc, sh=$s_rc. Falling back..." >&2 echo "Using local copy of arduino_install.sh" pushd ./Arduino/sketches chmod +x ./arduino_install.sh # Mimic curl install, does not use current directory: BINDIR="$ROOT_BIN" sh -x ./arduino_install.sh popd else echo "Alternative install script not needed." fi - name: Confirm Arduino CLI Install run: arduino-cli version - name: Derive CORE_ID (vendor:arch from FQBN) run: | CORE_ID="$(echo '${{ matrix.fqbn }}' | cut -d: -f1-2)" echo "CORE_ID=$CORE_ID" >> "$GITHUB_ENV" - name: Setup Arduino CLI run: | arduino-cli config init # wait 10 minutes for big downloads (or use 0 for no limit) arduino-cli config set network.connection_timeout 600s arduino-cli config add board_manager.additional_urls https://www.pjrc.com/teensy/package_teensy_index.json arduino-cli config add board_manager.additional_urls https://arduino.esp8266.com/stable/package_esp8266com_index.json arduino-cli core update-index echo "CORE_ID: $CORE_ID" arduino-cli core install "$CORE_ID" # The above is instead of: # arduino-cli core install esp32:esp32 # ESP32 # arduino-cli core install arduino:avr # Arduino Uno, Mega, Nano # arduino-cli core install arduino:sam # Arduino Due # arduino-cli core install arduino:samd # Arduino Zero # arduino-cli core install teensy:avr # PJRC Teensy # arduino-cli core install esp8266:esp8266 # ESP8266 # arduino-cli core install arduino:mbed_nano # nanorp2040connect # arduino-cli core install arduino:mbed_portenta # portenta_h7_m7 # arduino-cli core install arduino:mbed_edge # arduino-cli core install arduino:renesas_uno # For reference: # mbed nano not yet tested # sudo "/home/$USER/.arduino15/packages/arduino/hardware/mbed_nano/4.2.4/post_install.sh" # Always install networking (not part of FQBN matrix) # The first one also creates directory: /home/runner/Arduino/libraries arduino-cli lib install "ArduinoJson" # Example dependency arduino-cli lib install "WiFiNINA" # ARDUINO_SAMD_NANO_33_IOT arduino-cli lib install "Ethernet" # Install Ethernet library arduino-cli lib install "Bridge" # Pseudo-network for things like arduino:samd:tian - name: Set Job Environment Variables run: | # Script to assign some common environment variables after everything is installed ICON_OK=$(printf "\xE2\x9C\x85") ICON_FAIL=$(printf "\xE2\x9D\x8C") echo "GITHUB_WORK=$(realpath "$GITHUB_WORKSPACE/../..")" >> "$GITHUB_ENV" echo "ARDUINO_ROOT=$(realpath "$HOME/Arduino/libraries")" >> "$GITHUB_ENV" # Show repo-specific location of examples: echo "WOLFSSL_EXAMPLES_ROOT=$(realpath "./Arduino/sketches")" >> "$GITHUB_ENV" # Show predefined summary: echo "GITHUB_WORKSPACE = $GITHUB_WORKSPACE" # Show assigned build:env values (e.g. "wolfssl", "gojimmpi" or other owners): echo "REPO_OWNER = $REPO_OWNER" # Show our custom values: echo "GITHUB_WORK = $GITHUB_WORK" echo "ARDUINO_ROOT = $ARDUINO_ROOT" # WOLFSSL_EXAMPLES_ROOT is the report root, not example location echo "WOLFSSL_EXAMPLES_ROOT = $WOLFSSL_EXAMPLES_ROOT" - name: Cache Arduino Packages uses: actions/cache@v4 with: path: | ~/.arduino15 ~/.cache/arduino ~/.arduino15/staging # Arduino libraries # Specific to Arduino CI Build (2 of 4) Arduinbo Release wolfSSL for Local Examples # Include all libraries, as the latest Arduino-wolfSSL will only change upon release. ~/Arduino/libraries # Ensure wolfssl is not cached, we're always using the latest. See separate cache. !~/Arduino/libraries/wolfssl key: arduino-${{ runner.os }}-${{ env.CORE_ID }}-${{ hashFiles('Arduino/sketches/board_list.txt') }} restore-keys: | arduino-${{ runner.os }}-${{ env.CORE_ID }}- arduino-${{ runner.os }}- - name: Show wolfssl-examples run: | # The examples are local in this wolfssl-example repo, but should have been copied to library, above ls ./Arduino/sketches # end Show wolfssl-examples # Specific to Arduino CI Build (3 of 4) Arduinbo Release wolfSSL for Local Examples # - name: Shallow clone wolfssl # # not used here, we'll install with arduino-cli in next step # # These comments are mainly here to help align with arduino.yml source side-by-side sync # # end wolfssl source - name: Install wolfSSL Published Arduino library run: | # Install wolfssl via latest published version with arduino-cli lib install arduino-cli lib install "wolfSSL" # End Install wolfSSL Arduino library - name: List installed Arduino libraries run: arduino-cli lib list # This will fail with Arduino published wolfSSL v5.7.6 and older # as the examples moved. See https://github.com/wolfSSL/wolfssl/pull/8514 # - name: Compile Arduino Sketches for Various Boards run: | # Call the compile-all-examples.sh script to compile all the examples for each of the fqbn names in the local copy of board_list.txt echo "Current directory = $PWD" echo "ARDUINO_ROOT = $ARDUINO_ROOT" echo "WOLFSSL_EXAMPLES_ROOT = $WOLFSSL_EXAMPLES_ROOT" echo "FQBN = ${{ matrix.fqbn }}" echo "Change directory to Arduino examples..." pushd ./Arduino/sketches chmod +x ./compile-all-examples.sh # The script expects all the examples to be in the current directory. # So copy from local directory to newly installed wolfssl arduino library to compile there. cp ./compile-all-examples.sh "$ARDUINO_ROOT/wolfssl/examples/compile-all-examples.sh" cp ./board_list.txt "$ARDUINO_ROOT/wolfssl/examples/board_list.txt" # TODO Use standard board_list.txt after next release of wolfSSL # Remove this line and edit parameter to /compile-all-examples.sh board_list.txt cp ./board_list_v5.8.2.txt "$ARDUINO_ROOT/wolfssl/examples/board_list_v5.8.2.txt" # Compile the Arduino library examples in-place pushd "$ARDUINO_ROOT/wolfssl/examples/" echo "PWD=$PWD" ./compile-all-examples.sh board_list_v5.8.2.txt "${{ matrix.fqbn }}" popd popd # End Compile Arduino Sketches for Various Boards