diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6adce30903..ac3ec33852 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -70,15 +70,35 @@ jobs: WLED_RELEASE: True WLED_NIGHTLY_BUILD: ${{ inputs.nightly_build && 'true' || 'false' }} run: pio run -e ${{ matrix.environment }} - - name: Rename Bin - run: mv -v .pio/build/${{ matrix.environment }}/firmware.bin firmware-${{ matrix.environment }}.bin + - name: Collect firmware files + run: | + mkdir -p artifact-${{ matrix.environment }} + cp .pio/build/${{ matrix.environment }}/firmware.bin artifact-${{ matrix.environment }}/firmware.bin + # partitions.bin is only produced by ESP32 builds (not ESP8266) + if [ -f .pio/build/${{ matrix.environment }}/partitions.bin ]; then + cp .pio/build/${{ matrix.environment }}/partitions.bin artifact-${{ matrix.environment }}/partitions.bin + fi + # bootloader.bin is only produced by ESP32 builds using arduino-esp32 >= 2.x (not ESP8266, not old 1.0.x) + if [ -f .pio/build/${{ matrix.environment }}/bootloader.bin ]; then + cp .pio/build/${{ matrix.environment }}/bootloader.bin artifact-${{ matrix.environment }}/bootloader.bin + fi + # boot_app0.bin is copied to the build dir by output_bins.py using the PlatformIO platform API (ESP32 only) + if [ -f .pio/build/${{ matrix.environment }}/boot_app0.bin ]; then + cp .pio/build/${{ matrix.environment }}/boot_app0.bin artifact-${{ matrix.environment }}/boot_app0.bin + fi + echo "--- Collected files for ${{ matrix.environment }} ---" + ls -la artifact-${{ matrix.environment }}/ + # Create a zip with all collected files for use as a release asset + (cd artifact-${{ matrix.environment }} && zip ../firmware-${{ matrix.environment }}.zip *) - uses: actions/upload-artifact@v4 with: name: firmware-${{ matrix.environment }} - path: firmware-${{ matrix.environment }}.bin + path: artifact-${{ matrix.environment }}/ - uses: actions/upload-artifact@v4 - if: startsWith(github.ref, 'refs/tags/') + if: startsWith(github.ref, 'refs/tags/') || inputs.nightly_build with: name: firmware-release-${{ matrix.environment }} - path: build_output/release/*.bin + path: | + build_output/release/*.bin + firmware-${{ matrix.environment }}.zip diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 070719d4bf..6e6478479f 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -20,6 +20,7 @@ jobs: - name: Download artifacts uses: actions/download-artifact@v4 with: + pattern: firmware-release-* merge-multiple: true - name: Show Files run: ls -la @@ -44,6 +45,7 @@ jobs: files: | *.bin *.bin.gz + *.zip # - name: Repository Dispatch # uses: peter-evans/repository-dispatch@v3 # with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 64ea99370e..dcf50e5f0b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,6 +17,7 @@ jobs: steps: - uses: actions/download-artifact@v4 with: + pattern: firmware-release-* merge-multiple: true - name: "✏️ Generate release changelog" id: changelog @@ -35,4 +36,5 @@ jobs: files: | *.bin *.bin.gz + *.zip diff --git a/pio-scripts/output_bins.py b/pio-scripts/output_bins.py index 5f5a3b85b9..ec423bb4af 100644 --- a/pio-scripts/output_bins.py +++ b/pio-scripts/output_bins.py @@ -150,6 +150,21 @@ def bin_rename_copy(source, target, env): if os.path.isfile(source_map): print(f"Found linker mapfile {source_map}") shutil.copy(source_map, map_file) + + # Copy boot_app0.bin to the build dir if available. + # Use the PlatformIO platform API to locate the exact arduino-esp32 framework package used + # for this build. ESP8266 builds return None from get_package_dir() and are silently skipped. + # Old arduino-esp32 1.0.x builds lack the file under tools/partitions/ and are also skipped. + _ARDUINO_ESP32_PACKAGE = "framework-arduinoespressif32" + try: + framework_dir = env.PioPlatform().get_package_dir(_ARDUINO_ESP32_PACKAGE) + if framework_dir: + boot_app0_src = os.path.join(str(framework_dir), "tools", "partitions", "boot_app0.bin") + if os.path.isfile(boot_app0_src): + shutil.copy(boot_app0_src, os.path.join(builddir, "boot_app0.bin")) + except Exception as e: + print(f"Warning: could not copy boot_app0.bin ({e})") + # Check if this is a release build (CI sets WLED_RELEASE=True) is_release_build = os.environ.get('WLED_RELEASE', '').lower() in ('true', '1', 'yes') # show build flags summary for github CI builds