Merge branch 'master' into dshot-nopause #847
This file contains hidden or 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 ExpressLRS | |
| on: [push, pull_request] | |
| jobs: | |
| build-and-validate-artifacts: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| - name: Install dependencies | |
| run: | | |
| cd src/html | |
| npm ci | |
| - name: Build Web UI for all platforms | |
| run: | | |
| cd src/html | |
| cp -r headers out | |
| npm run build:all | |
| - name: Validate artifacts | |
| id: validate | |
| run: | | |
| cd src/html | |
| diff -qr out headers >/dev/null 2>&1 | |
| exit_code=$? | |
| if [ "$exit_code" -eq 0 ]; then | |
| echo "Artifact check passed." | |
| exit 0 | |
| elif [ "$exit_code" -eq 1 ]; then | |
| echo "🚨 **Web UI Artifacts Error:** Web UI artifacts have not been built and committed. Please build and commit them as part of this PR." | |
| exit 1 # Fail the step | |
| else | |
| echo "⚠️ **Artifact Check Error:** An unexpected error ($exit_code) occurred during file comparison. Check the workflow logs." | |
| exit 2 # Fail the step | |
| fi | |
| test: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Inject slug/short variables | |
| uses: rlespinasse/github-slug-action@v4 | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.10' | |
| - name: Cache pip | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.cache/pip | |
| key: ${{ runner.os }}-pip-${{ matrix.target }} | |
| - name: Install PlatformIO | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install platformio | |
| pip install wheel | |
| - name: Cache PlatformIO | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.platformio | |
| key: ${{ runner.os }}-platformio | |
| - name: Run PlatformIO Tests | |
| run: | | |
| cd src | |
| platformio pkg install --platform native | |
| platformio pkg update | |
| PLATFORMIO_BUILD_FLAGS="-DRegulatory_Domain_ISM_2400" pio test -e native | |
| targets: | |
| needs: | |
| - build-and-validate-artifacts | |
| - test | |
| runs-on: ubuntu-latest | |
| outputs: | |
| targets: ${{ steps.set-targets.outputs.targets }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - id: set-targets | |
| run: echo "targets=[$( (grep '\[env:.*UART\]' src/targets/unified.ini ; grep -r '\[env:.*STLINK\]' src/targets/) | sed 's/.*://' | sed s/.$// | egrep "(STLINK|UART)" | grep -v DEPRECATED | tr '\n' ',' | sed 's/,$/"\n/' | sed 's/,/","/'g | sed 's/^/"/')]" >> $GITHUB_OUTPUT | |
| build: | |
| needs: targets | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| target: ${{fromJSON(needs.targets.outputs.targets)}} | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Inject slug/short variables | |
| uses: rlespinasse/github-slug-action@v4 | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.10' | |
| - name: Cache pip | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.cache/pip | |
| key: ${{ runner.os }}-pip-${{ matrix.target }} | |
| - name: Install PlatformIO | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install platformio | |
| pip install wheel | |
| - name: Cache PlatformIO | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.platformio | |
| key: ${{ runner.os }}-platformio | |
| - name: Install Node | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: 'latest' | |
| - name: Cache node-modules | |
| uses: actions/cache@v4 | |
| with: | |
| path: src/html/node-modules | |
| key: ${{ runner.os }}-node-modules | |
| - name: Run PlatformIO | |
| run: | | |
| mkdir -p ~/artifacts/firmware | |
| cd src | |
| platformio pkg install --platform native | |
| platformio pkg update | |
| case ${{matrix.target}} in | |
| *2400* | FM30*) | |
| # release builds | |
| PLATFORMIO_BUILD_FLAGS="-DRegulatory_Domain_EU_CE_2400" pio run -e ${{ matrix.target }} | |
| OUTDIR=~/artifacts/firmware/LBT/`echo ${{ matrix.target }} | sed s/_via.*//` | |
| mkdir -p $OUTDIR | |
| mv .pio/build/${{ matrix.target }}/*.{elrs,bin} $OUTDIR >& /dev/null || : | |
| PLATFORMIO_BUILD_FLAGS="-DRegulatory_Domain_ISM_2400" pio run -e ${{ matrix.target }} | |
| OUTDIR=~/artifacts/firmware/FCC/`echo ${{ matrix.target }} | sed s/_via.*//` | |
| mkdir -p $OUTDIR | |
| mv .pio/build/${{ matrix.target }}/*.{elrs,bin} $OUTDIR >& /dev/null || : | |
| ;; | |
| *LR1121*) | |
| # release builds | |
| PLATFORMIO_BUILD_FLAGS="-DRegulatory_Domain_EU_CE_2400 -DRegulatory_Domain_FCC_915" pio run -e ${{ matrix.target }} | |
| OUTDIR=~/artifacts/firmware/LBT/`echo ${{ matrix.target }} | sed s/_via.*//` | |
| mkdir -p $OUTDIR | |
| mv .pio/build/${{ matrix.target }}/*.{elrs,bin} $OUTDIR >& /dev/null || : | |
| PLATFORMIO_BUILD_FLAGS="-DRegulatory_Domain_FCC_915" pio run -e ${{ matrix.target }} | |
| OUTDIR=~/artifacts/firmware/FCC/`echo ${{ matrix.target }} | sed s/_via.*//` | |
| mkdir -p $OUTDIR | |
| mv .pio/build/${{ matrix.target }}/*.{elrs,bin} $OUTDIR >& /dev/null || : | |
| ;; | |
| *) | |
| # release build | |
| PLATFORMIO_BUILD_FLAGS="-DRegulatory_Domain_FCC_915" pio run -e ${{ matrix.target }} | |
| OUTDIR=~/artifacts/firmware/FCC/`echo ${{ matrix.target }} | sed s/_via.*//` | |
| mkdir -p $OUTDIR | |
| mv .pio/build/${{ matrix.target }}/*.{elrs,bin} $OUTDIR >& /dev/null || : | |
| ;; | |
| esac | |
| - name: Store Artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: temp-${{ matrix.target }} | |
| path: ~/artifacts/**/* | |
| retention-days: 1 | |
| continue-on-error: true | |
| firmware: | |
| needs: [build, test] | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Checkout targets repo | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: ExpressLRS/targets | |
| path: src/hardware | |
| - name: Get firmware artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: dist | |
| merge-multiple: true | |
| - name: Copy hardware files to firmware folder | |
| run: | | |
| cp -r src/hardware dist/firmware | |
| jq 'del(.generic)' src/hardware/targets.json > dist/firmware/hardware/targets.json | |
| - name: Copy Lua to to firmware folder | |
| run: | | |
| mkdir -p dist/firmware/lua | |
| cp -r src/lua/elrsV3.lua dist/firmware/lua | |
| - name: Copy bootloader files to firmware folder | |
| run: cd src ; find bootloader -name \*.bin -o -name \*.frk | grep -v src/ | cpio -pdm ../dist/firmware | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.10' | |
| - name: Build flasher "binary" with shiv | |
| run: | | |
| cd src/python | |
| pip install shiv==1.0.6 | |
| shiv -c flash -o ../../dist/firmware/flasher.pyz pyserial . | |
| - name: Update firmware artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: firmware | |
| path: dist/**/* | |
| - name: Create firmware zip bundle | |
| run: | | |
| cd dist | |
| zip -r -9 ../firmware.zip ./firmware | |
| - name: Install downgraded AWS CLI | |
| uses: unfor19/install-aws-cli-action@master | |
| with: | |
| version: "2.22.35" | |
| - name: Upload firmware bundle to ExpressLRS artifactory | |
| env: | |
| AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
| AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
| AWS_ENDPOINT_URL: ${{ secrets.AWS_ENDPOINT_URL }} | |
| AWS_REGION: "auto" | |
| run: | | |
| aws --version | |
| if [[ -z $AWS_ACCESS_KEY_ID || -z $AWS_SECRET_ACCESS_KEY || -z $AWS_ENDPOINT_URL ]]; then | |
| echo "Artifactory credentials are not defined. Most likely action is running from pull request. Not a bug." | |
| exit 0 | |
| fi | |
| aws s3api head-object --endpoint-url $AWS_ENDPOINT_URL --bucket expresslrs --key ExpressLRS/$GITHUB_SHA/firmware.zip > /dev/null || ALLOW_UPLOAD=true | |
| git describe --tags --exact-match HEAD && ALLOW_UPLOAD=true | |
| if [ $ALLOW_UPLOAD ]; then | |
| echo "Uploading firmware to artifactory" | |
| aws s3 cp --endpoint-url $AWS_ENDPOINT_URL firmware.zip s3://expresslrs/ExpressLRS/$GITHUB_SHA/firmware.zip | |
| echo "Generating artifact index" | |
| aws s3 ls --endpoint-url $AWS_ENDPOINT_URL s3://expresslrs/ExpressLRS/ | awk '{print $2}' | sed s/\\/// > /tmp/hashes | |
| echo '{' > index.json | |
| echo '"branches": {' >> index.json | |
| git branch --list --remotes --format '"%(refname:short)": "%(objectname)",' | grep origin/ | sed s/origin.// | grep -f /tmp/hashes | head -c-2 >> index.json | |
| echo '' >> index.json | |
| echo '},' >> index.json | |
| echo '"tags": {' >> index.json | |
| git tag --list --format '"%(refname:short)": "%(objectname)",' | grep -f /tmp/hashes | head -c-2 >> index.json | |
| echo '' >> index.json | |
| echo '}' >> index.json | |
| echo '}' >> index.json | |
| echo "Uploading artifact index" | |
| aws s3 cp --endpoint-url $AWS_ENDPOINT_URL index.json s3://expresslrs/ExpressLRS/index.json | |
| else | |
| echo "Not overwriting already existing artifact at $GITHUB_SHA" | |
| exit 1 | |
| fi |