name: Build and Pack on: [push, pull_request] jobs: ######################################################################################### ## Build Firmware ######################################################################################### build: runs-on: ubuntu-latest steps: - id: skip_check uses: fkirc/skip-duplicate-actions@v5 with: concurrent_skipping: same_content_newer - uses: actions/checkout@v3 with: submodules: recursive - name: Set Variables id: vars run: | echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - name: Cache PlatformIO uses: actions/cache@v3 with: path: ~/.platformio key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.10' - name: Install PlatformIO run: | python -m pip install --upgrade pip pip install --upgrade platformio - name: Build Firmware #run: echo "Testing... ${{ github.ref_name }}, ${{ steps.vars.outputs.sha_short }}" > ./sd-card/html/version.txt; mkdir -p ./code/.pio/build/esp32cam/; cd ./code/.pio/build/esp32cam/; echo "${{ steps.vars.outputs.sha_short }}" > firmware.bin; cp firmware.bin partitions.bin; cp firmware.bin bootloader.bin # Testing run: cd code; platformio run --environment esp32cam - name: Store generated files in cache uses: actions/cache@v3 with: path: | ./code/.pio/build/esp32cam/firmware.bin ./code/.pio/build/esp32cam/partitions.bin ./code/.pio/build/esp32cam/bootloader.bin ./sd-card/html/version.txt key: ${{ github.run_number }} ######################################################################################### ## Pack for new OTA ######################################################################################### pack-for-OTA: # New OTA concept # update__version.zip file with following content: # - /firmware.bin # - (optional) /html/* # - (optional) /config/*.tfl runs-on: ubuntu-latest needs: build steps: - uses: actions/checkout@v3 - name: Get generated files from cache uses: actions/cache@v3 with: path: | ./code/.pio/build/esp32cam/firmware.bin ./code/.pio/build/esp32cam/partitions.bin ./code/.pio/build/esp32cam/bootloader.bin ./sd-card/html/version.txt key: ${{ github.run_number }} - name: Set Variables id: vars run: | echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT echo "branch=$(echo ${{ github.ref_name }} | tr / __)" >> $GITHUB_OUTPUT - name: Prepare update.zip artifact run: | mkdir -p ./dist cp "./code/.pio/build/esp32cam/firmware.bin" "dist/firmware.bin" - name: Add Web UI to dist run: cp -r ./sd-card/html ./dist/ - name: Add CNN to dist run: | mkdir ./dist/config/ cp ./sd-card/config/*.tfl ./dist/config/ 2>/dev/null || true cp ./sd-card/config/*.tflite ./dist/config/ 2>/dev/null || true - name: Upload dist as update.zip artifact (Firmware + Web UI + CNN) uses: actions/upload-artifact@v3 with: name: "update__${{ steps.vars.outputs.branch }}_(${{ steps.vars.outputs.sha_short }})" path: ./dist/* - name: Store generated files in cache uses: actions/cache@v3 with: path: dist key: ${{ github.run_number }}-pack-for-OTA ######################################################################################### ## Pack for a fresh install (USB flashing) (initial_esp32_setup) ######################################################################################### pack-for-fresh-install: # creates old style binaries for fresh installation (backward compatible to wiki) runs-on: ubuntu-latest needs: build steps: - uses: actions/checkout@v3 - name: Get generated files from cache uses: actions/cache@v3 with: path: | ./code/.pio/build/esp32cam/firmware.bin ./code/.pio/build/esp32cam/partitions.bin ./code/.pio/build/esp32cam/bootloader.bin ./sd-card/html/version.txt key: ${{ github.run_number }} - name: Set Variables id: vars run: | echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT echo "branch=$(echo ${{ github.ref_name }} | tr / __)" >> $GITHUB_OUTPUT - name: Prepare artifacts for release run: | mkdir -p firmware rm -rf firmware/*.zip mkdir -p release # copy builds to firmware folder cp -f "./code/.pio/build/esp32cam/firmware.bin" "firmware/firmware.bin" cp -f "./code/.pio/build/esp32cam/bootloader.bin" "firmware/bootloader.bin" cp -f "./code/.pio/build/esp32cam/partitions.bin" "firmware/partitions.bin" zip -r ./firmware/sd-card.zip sd-card cd ./firmware - name: Upload initial_esp32_setup.zip artifact (Firmware + Bootloader + Partitions + Web UI) uses: actions/upload-artifact@v3 with: name: "initial_esp32_setup__${{ steps.vars.outputs.branch }}_(${{ steps.vars.outputs.sha_short }})" path: ./firmware - name: Store generated files in cache uses: actions/cache@v3 with: path: firmware key: ${{ github.run_number }}-pack-for-fresh-install ######################################################################################### ## Prepare and create release ######################################################################################### release: runs-on: ubuntu-latest needs: [pack-for-OTA, pack-for-fresh-install] if: startsWith(github.ref, 'refs/tags/') steps: - uses: actions/checkout@v3 - name: Set Variables id: vars run: | echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT # import the changes from - name: Get generated files from cache uses: actions/cache@v3 with: path: dist key: ${{ github.run_number }}-pack-for-OTA # import cached artifacts from pack-for-fresh-install - name: Get generated files from cache uses: actions/cache@v3 with: path: firmware key: ${{ github.run_number }}-pack-for-fresh-install - name: Prepare artifacts for release run: | mkdir -p release mkdir -p dist # create a update.zip like "update__rolling" pwd cd ./dist zip -r ../release/update.zip . cd ../firmware zip -r ../release/initial_esp32_setup.zip . # extract the version used in next step - id: get_version if: startsWith(github.ref, 'refs/tags/') uses: battila7/get-version-action@v2 # the changelog [unreleased] will now be changed to the release version - name: Update changelog uses: thomaseizinger/keep-a-changelog-new-release@v1 if: startsWith(github.ref, 'refs/tags/') with: changelogPath: Changelog.md version: ${{ steps.get_version.outputs.version-without-v }} # the release notes will be extracted from changelog - name: Extract release notes id: extract-release-notes if: startsWith(github.ref, 'refs/tags/') uses: ffurrer2/extract-release-notes@v1 with: changelog_file: Changelog.md # Releases should only be created on master by tagging the last commit. # all artifacts in firmware folder pushed to the release - name: Release uses: softprops/action-gh-release@v1 if: startsWith(github.ref, 'refs/tags/') with: name: ${{ steps.get_version.outputs.version-without-v }} body: ${{ steps.extract-release-notes.outputs.release_notes }} files: | release/* # Commit&Push Changelog to master branch. Must be manually merged back to rolling - name: Commit changes and push changes if: startsWith(github.ref, 'refs/tags/') run: | git config user.name github-actions git config user.email github-actions@github.com git add Changelog.md git commit Changelog.md -m "Update Changelog.md for ${{github.event.inputs.versionIncrement}} release" git push origin HEAD:master