name: CI #concurrency: # group: ${{ github.ref }} # cancel-in-progress: ${{ github.ref != 'refs/heads/master' }} on: # # Triggers the workflow on push but only for the master branch push: branches: [master, develop] paths-ignore: - "**.md" - version.properties # Note: This is different from "pull_request". Need to specify ref when doing checkouts. pull_request_target: branches: [master, develop] paths-ignore: - "**.md" #- "**.yml" workflow_dispatch: jobs: setup: strategy: fail-fast: false matrix: arch: [esp32, esp32s3, esp32c3, nrf52840, rp2040, check] runs-on: ubuntu-latest steps: - id: checkout uses: actions/checkout@v4 name: Checkout base - id: jsonStep run: | TARGETS=$(./bin/generate_ci_matrix.py ${{matrix.arch}}) echo "$TARGETS" echo "${{matrix.arch}}=$(jq -cn --argjson environments "$TARGETS" '{board: $environments}')" >> $GITHUB_OUTPUT outputs: esp32: ${{ steps.jsonStep.outputs.esp32 }} esp32s3: ${{ steps.jsonStep.outputs.esp32s3 }} esp32c3: ${{ steps.jsonStep.outputs.esp32c3 }} nrf52840: ${{ steps.jsonStep.outputs.nrf52840 }} rp2040: ${{ steps.jsonStep.outputs.rp2040 }} check: ${{ steps.jsonStep.outputs.check }} check: needs: setup strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.check) }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build base id: base uses: ./.github/actions/setup-base - name: Check ${{ matrix.board }} run: bin/check-all.sh ${{ matrix.board }} build-esp32: needs: setup strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.esp32) }} uses: ./.github/workflows/build_esp32.yml with: board: ${{ matrix.board }} build-esp32-s3: needs: setup strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.esp32s3) }} uses: ./.github/workflows/build_esp32_s3.yml with: board: ${{ matrix.board }} build-esp32-c3: needs: setup strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.esp32c3) }} uses: ./.github/workflows/build_esp32_c3.yml with: board: ${{ matrix.board }} build-nrf52: needs: setup strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.nrf52840) }} uses: ./.github/workflows/build_nrf52.yml with: board: ${{ matrix.board }} build-rpi2040: needs: setup strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.rp2040) }} uses: ./.github/workflows/build_rpi2040.yml with: board: ${{ matrix.board }} package-raspbian: uses: ./.github/workflows/package_raspbian.yml package-raspbian-armv7l: uses: ./.github/workflows/package_raspbian_armv7l.yml build-native: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build base id: base uses: ./.github/actions/setup-base # We now run integration test before other build steps (to quickly see runtime failures) #- name: Build for native # run: platformio run -e native #- name: Integration test # run: | #.pio/build/native/program #& sleep 20 # 5 seconds was not enough #echo "Simulator started, launching python test..." #python3 -c 'from meshtastic.test import testSimulator; testSimulator()' - name: Build Native run: bin/build-native.sh - name: Get release version string run: echo "version=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT id: version - name: Store binaries as an artifact uses: actions/upload-artifact@v4 with: name: firmware-native-${{ steps.version.outputs.version }}.zip overwrite: true path: | release/device-*.sh release/device-*.bat - name: Docker login if: ${{ github.event_name != 'pull_request_target' && github.event_name != 'pull_request' }} uses: docker/login-action@v3 with: username: meshtastic password: ${{ secrets.DOCKER_TOKEN }} - name: Docker setup if: ${{ github.event_name != 'pull_request_target' && github.event_name != 'pull_request' }} uses: docker/setup-buildx-action@v3 - name: Docker build and push tagged versions if: ${{ github.event_name == 'workflow_dispatch' }} uses: docker/build-push-action@v5 with: context: . file: ./Dockerfile push: true tags: meshtastic/device-simulator:${{ steps.version.outputs.version }} - name: Docker build and push if: ${{ github.ref == 'refs/heads/master' && github.event_name != 'pull_request_target' && github.event_name != 'pull_request' }} uses: docker/build-push-action@v5 with: context: . file: ./Dockerfile push: true tags: meshtastic/device-simulator:latest after-checks: runs-on: ubuntu-latest needs: [check] steps: - name: Checkout code uses: actions/checkout@v4 with: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} gather-artifacts: permissions: contents: write pull-requests: write runs-on: ubuntu-latest needs: [ build-esp32, build-esp32-s3, build-esp32-c3, build-nrf52, build-native, build-rpi2040, package-raspbian, package-raspbian-armv7l, ] steps: - name: Checkout code uses: actions/checkout@v4 with: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} - uses: actions/download-artifact@v4 with: path: ./ merge-multiple: true - name: Display structure of downloaded files run: ls -R - name: Get release version string run: echo "version=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT id: version - name: Move files up run: mv -b -t ./ ./release/meshtasticd_linux_aarch64 ./release/meshtasticd_linux_armv7l ./bin/config-dist.yaml - name: Repackage in single firmware zip uses: actions/upload-artifact@v4 with: name: firmware-${{ steps.version.outputs.version }} overwrite: true path: | ./firmware-*.bin ./firmware-*.uf2 ./firmware-*-ota.zip ./device-*.sh ./device-*.bat ./meshtasticd_linux_* ./config-dist.yaml ./littlefs-*.bin ./bleota*bin ./Meshtastic_nRF52_factory_erase*.uf2 retention-days: 90 - uses: actions/download-artifact@v4 with: name: firmware-${{ steps.version.outputs.version }} merge-multiple: true path: ./output # For diagnostics - name: Show artifacts run: ls -lR - name: Device scripts permissions run: | chmod +x ./output/device-install.sh chmod +x ./output/device-update.sh - name: Zip firmware run: zip -j -9 -r ./firmware-${{ steps.version.outputs.version }}.zip ./output - name: Repackage in single elfs zip uses: actions/upload-artifact@v4 with: name: debug-elfs-${{ steps.version.outputs.version }}.zip overwrite: true path: ./*.elf retention-days: 30 - name: Create request artifacts continue-on-error: true # FIXME: Why are we getting 502, but things still work? if: ${{ github.event_name == 'pull_request_target' || github.event_name == 'pull_request' }} uses: gavv/pull-request-artifacts@v2.1.0 with: commit: ${{ (github.event.pull_request_target || github.event.pull_request).head.sha }} repo-token: ${{ secrets.GITHUB_TOKEN }} artifacts-token: ${{ secrets.ARTIFACTS_TOKEN }} artifacts-repo: meshtastic/artifacts artifacts-branch: device artifacts: ./firmware-${{ steps.version.outputs.version }}.zip release-artifacts: runs-on: ubuntu-latest if: ${{ github.event_name == 'workflow_dispatch' }} needs: [gather-artifacts, after-checks] steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: 3.x - name: Get release version string run: echo "version=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT id: version - uses: actions/download-artifact@v4 with: name: firmware-${{ steps.version.outputs.version }} merge-multiple: true path: ./output - uses: actions/download-artifact@v4 with: pattern: meshtasticd_${{ steps.version.outputs.version }}_*.deb merge-multiple: true path: ./output - name: Display structure of downloaded files run: ls -R - name: Device scripts permissions run: | chmod +x ./output/device-install.sh chmod +x ./output/device-update.sh - name: Zip firmware run: zip -j -9 -r ./firmware-${{ steps.version.outputs.version }}.zip ./output - uses: actions/download-artifact@v4 with: name: debug-elfs-${{ steps.version.outputs.version }}.zip merge-multiple: true path: ./elfs - name: Zip Elfs run: zip -j -9 -r ./debug-elfs-${{ steps.version.outputs.version }}.zip ./elfs # For diagnostics - name: Show artifacts run: ls -lR - name: Create release uses: actions/create-release@v1 id: create_release with: draft: true prerelease: true release_name: Meshtastic Firmware ${{ steps.version.outputs.version }} Alpha tag_name: v${{ steps.version.outputs.version }} body: | Autogenerated by github action, developer should edit as required before publishing... env: GITHUB_TOKEN: ${{ github.token }} - name: Add bins to release uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ github.token }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: ./firmware-${{ steps.version.outputs.version }}.zip asset_name: firmware-${{ steps.version.outputs.version }}.zip asset_content_type: application/zip - name: Add debug elfs to release uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ github.token }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: ./debug-elfs-${{ steps.version.outputs.version }}.zip asset_name: debug-elfs-${{ steps.version.outputs.version }}.zip asset_content_type: application/zip - name: Add raspbian aarch64 .deb uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ github.token }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: ./output/meshtasticd_${{ steps.version.outputs.version }}_arm64.deb asset_name: meshtasticd_${{ steps.version.outputs.version }}_arm64.deb asset_content_type: application/vnd.debian.binary-package - name: Add raspbian armv7l .deb uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ github.token }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: ./output/meshtasticd_${{ steps.version.outputs.version }}_armhf.deb asset_name: meshtasticd_${{ steps.version.outputs.version }}_armhf.deb asset_content_type: application/vnd.debian.binary-package - name: Bump version.properties run: >- bin/bump_version.py - name: Create version.properties pull request uses: peter-evans/create-pull-request@v6 with: add-paths: | version.properties