Fix Clicker and TCP Utils and NetCut UI #1113
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 and Push Releases | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| on: | |
| push: | |
| branches: | |
| - main | |
| - dev | |
| paths: | |
| - "**.yml" | |
| - "**.h" | |
| - "**.cpp" | |
| - "**.py" | |
| - "**.html" | |
| - "**.css" | |
| - "**.js" | |
| - "**.ini" | |
| - "**.json" | |
| - "**.csv" | |
| tags: | |
| - "*" | |
| workflow_dispatch: | |
| jobs: | |
| compile_sketch: | |
| name: Build ${{ matrix.board.env }} | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| board: | |
| - { env: "arduino-nesso-n1", family: "ESP32-C6",} | |
| - { env: "m5stack-cardputer", family: "ESP32-S3",} | |
| - { env: "m5stack-sticks3", family: "ESP32-S3",} | |
| - { env: "m5stack-cplus2", family: "ESP32",} | |
| - { env: "m5stack-cplus1_1", family: "ESP32",} | |
| - { env: "LAUNCHER_m5stack-cplus1_1", family: "ESP32",} | |
| - { env: "m5stack-core2", family: "ESP32",} | |
| - { env: "m5stack-core16mb", family: "ESP32",} | |
| - { env: "m5stack-core4mb", family: "ESP32",} | |
| - { env: "m5stack-cores3", family: "ESP32-S3",} | |
| - { env: "m5stack-dinmeter", family: "ESP32-S3",} | |
| - { env: "esp32-s3-devkitc-1", family: "ESP32-S3",} | |
| - { env: "esp32-s3-devkitc-1-psram", family: "ESP32-S3",} | |
| - { env: "esp32-c5", family: "ESP32-C5",} | |
| - { env: "esp32-c5-tft", family: "ESP32-C5",} | |
| - { env: "nm-cyd-c5", family: "ESP32-C5",} | |
| - { env: "CYD-2432S028", family: "ESP32",} | |
| - { env: "CYD-2USB", family: "ESP32",} | |
| - { env: "CYD-2432W328C", family: "ESP32",} | |
| - { env: "CYD-2432W328C_2", family: "ESP32",} | |
| - { env: "CYD-2432W328R-or-S024R", family: "ESP32",} | |
| - { env: "CYD-3248S035R", family: "ESP32",} | |
| - { env: "CYD-3248S035C", family: "ESP32",} | |
| - { env: "LAUNCHER_CYD-2432W328R-or-S024R", family: "ESP32",} | |
| - { env: "LAUNCHER_CYD-2432S028", family: "ESP32",} | |
| - { env: "LAUNCHER_CYD-2USB", family: "ESP32",} | |
| - { env: "LAUNCHER_CYD-2432W328C", family: "ESP32",} | |
| - { env: "LAUNCHER_CYD-3248S035R", family: "ESP32",} | |
| - { env: "LAUNCHER_CYD-3248S035C", family: "ESP32",} | |
| - { env: "lilygo-t-embed-cc1101", family: "ESP32-S3",} | |
| - { env: "lilygo-t-embed", family: "ESP32-S3",} | |
| - { env: "lilygo-t-deck", family: "ESP32-S3",} | |
| - { env: "lilygo-t-watch-s3", family: "ESP32-S3",} | |
| - { env: "lilygo-t-deck-pro", family: "ESP32-S3",} | |
| - { env: "lilygo-t-display-s3", family: "ESP32-S3",} | |
| - { env: "lilygo-t-display-s3-touch", family: "ESP32-S3",} | |
| - { env: "lilygo-t-display-s3-mmc", family: "ESP32-S3",} | |
| - { env: "lilygo-t-display-s3-touch-mmc", family: "ESP32-S3",} | |
| - { env: "lilygo-t-display-S3-pro", family: "ESP32-S3",} | |
| - { env: "lilygo-t-display-ttgo", family: "ESP32",} | |
| - { env: "lilygo-t-hmi", family: "ESP32-S3",} | |
| - { env: "lilygo-t-lora-pager", family: "ESP32-S3",} | |
| - { env: "elecrow-24B", family: "ESP32",} | |
| - { env: "elecrow-28B", family: "ESP32",} | |
| - { env: "elecrow-advance-35-s3", family: "ESP32-S3",} | |
| - { env: "smoochiee-board", family: "ESP32-S3",} | |
| - { env: "reaper", family: "ESP32-S3",} | |
| - { env: "Phantom_S024R", family: "ESP32",} | |
| - { env: "LAUNCHER_Phantom_S024R", family: "ESP32",} | |
| - { env: "Marauder-Mini", family: "ESP32",} | |
| - { env: "LAUNCHER_Marauder-Mini", family: "ESP32",} | |
| - { env: "Awok-Mini", family: "ESP32",} | |
| - { env: "Marauder-v7", family: "ESP32",} | |
| - { env: "LAUNCHER_Marauder-v7", family: "ESP32",} | |
| - { env: "Marauder-V4-V6", family: "ESP32",} | |
| - { env: "Marauder-v61", family: "ESP32",} | |
| - { env: "LAUNCHER_Marauder-V4-V6", family: "ESP32",} | |
| - { env: "LAUNCHER_Marauder-v61", family: "ESP32",} | |
| - { env: "Awok-Touch", family: "ESP32",} | |
| - { env: "WaveSentry-R1", family: "ESP32",} | |
| - { env: "LAUNCHER_WaveSentry-R1", family: "ESP32",} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - id: build | |
| name: setup Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.13" | |
| - name: Install build deps (multilib) | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y --no-install-recommends gcc-multilib libc6-dev-i386 | |
| - name: Cache pip | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.cache/pip | |
| key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }} | |
| restore-keys: | | |
| ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }} | |
| ${{ runner.os }}-pip- | |
| - name: Cache PlatformIO Framework | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.platformio | |
| key: ${{ runner.os }}-platformio-${{ hashFiles('platformio.ini') }} | |
| restore-keys: | | |
| ${{ runner.os }}-platformio-${{ hashFiles('platformio.ini') }} | |
| ${{ runner.os }}-platformio- | |
| - name: PIO libraries cache | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| .pio/libdeps | |
| key: ${{ runner.os }}-pio-${{ matrix.board.env }}-${{ hashFiles('platformio.ini') }} | |
| restore-keys: | | |
| ${{ runner.os }}-pio-${{ matrix.board.env }}-${{ hashFiles('platformio.ini') }} | |
| ${{ runner.os }}-pio-${{ matrix.board.env }}- | |
| - name: Install dependencies | |
| run: | | |
| pip install requests esptool intelhex | |
| pip install platformio | |
| - name: Prepare PlatformIO file | |
| run: | | |
| if [[ "${{ github.ref_type }}" == "tag" ]]; then | |
| version=${{ github.ref_name }} | |
| sed -i "s/-D ENABLE_RAM_LOGGING=1/;-D ENABLE_RAM_LOGGING=1'\"$version\"' ; /g" ./platformio.ini | |
| else | |
| version="${GITHUB_SHA::7}" | |
| fi | |
| sed -i "s/-DBRUCE_VERSION=/-DBRUCE_VERSION='\"$version\"' ; /g" ./platformio.ini | |
| sed -i "s/-DGIT_COMMIT_HASH='\"Homebrew\"'/\!echo '-DGIT_COMMIT_HASH=\\\\\\\\\"'\$\(git describe --always --dirty)'\\\\\\\\\"'/g" ./platformio.ini | |
| cat ./platformio.ini | |
| - name: Run Compile | |
| run: | | |
| set -o pipefail | |
| platformio run -e ${{ matrix.board.env }} | tee build-${{ matrix.board.env }}.log | |
| - name: Build summary | |
| run: | | |
| if [[ -f build-${{ matrix.board.env }}.log ]]; then | |
| echo "Last 75 lines of build-${{ matrix.board.env }}.log:" | |
| tail -n 75 build-${{ matrix.board.env }}.log | |
| else | |
| echo "Build log not found; nothing to show." | |
| fi | |
| - name: Upload ${{ matrix.board.env }} | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: Bruce-${{ matrix.board.env }} | |
| path: Bruce-*.* | |
| retention-days: 1 | |
| if-no-files-found: error | |
| post_compile_steps: | |
| name: Update Placeholders | |
| runs-on: ubuntu-latest | |
| environment: github_release | |
| needs: compile_sketch | |
| if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') || github.ref_type == 'tag' | |
| steps: | |
| - name: Download all artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| pattern: '*' | |
| merge-multiple: true | |
| path: artifacts | |
| - name: Ensure releases exist and get IDs | |
| id: get_release | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const ensureByTag = async (tag, prerelease=true) => { | |
| try { | |
| const { data } = await github.rest.repos.getReleaseByTag({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| tag | |
| }); | |
| return data.id; | |
| } catch (e) { | |
| if (e.status !== 404) throw e; | |
| const { data } = await github.rest.repos.createRelease({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| tag_name: tag, | |
| name: tag, | |
| prerelease | |
| }); | |
| return data.id; | |
| } | |
| }; | |
| const betaId = await ensureByTag('betaRelease'); | |
| const lastId = await ensureByTag('lastRelease'); | |
| core.setOutput('beta', String(betaId)); | |
| core.setOutput('last', String(lastId)); | |
| - name: Get current sha | |
| id: get_sha | |
| run: | | |
| echo "GITHUB_SHA_SHORT=${GITHUB_SHA::7}" >> $GITHUB_OUTPUT | |
| - name: Delete old betaRelease assets | |
| uses: actions/github-script@v6 | |
| with: | |
| script: | | |
| const release_id = ${{ steps.get_release.outputs.beta }}; | |
| const assets = await github.rest.repos.listReleaseAssets({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| release_id: release_id | |
| }); | |
| for (const asset of assets.data) { | |
| await github.rest.repos.deleteReleaseAsset({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| asset_id: asset.id | |
| }); | |
| } | |
| - name: Upload new betaRelease asset | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| name: betaRelease commit (${{ steps.get_sha.outputs.GITHUB_SHA_SHORT }}) | |
| tag_name: betaRelease | |
| prerelease: true | |
| files: artifacts/** | |
| fail_on_unmatched_files: false | |
| make_latest: false | |
| generate_release_notes: false | |
| - name: Delete old lastRelease assets | |
| uses: actions/github-script@v6 | |
| if: github.ref_type == 'tag' | |
| with: | |
| script: | | |
| const release_id = ${{ steps.get_release.outputs.last }}; | |
| const assets = await github.rest.repos.listReleaseAssets({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| release_id: release_id | |
| }); | |
| for (const asset of assets.data) { | |
| await github.rest.repos.deleteReleaseAsset({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| asset_id: asset.id | |
| }); | |
| } | |
| - name: Upload new lastRelease asset | |
| uses: softprops/action-gh-release@v2 | |
| if: github.ref_type == 'tag' | |
| with: | |
| name: lastRelease commit (${{ steps.get_sha.outputs.GITHUB_SHA_SHORT }}) | |
| tag_name: lastRelease | |
| prerelease: true | |
| files: artifacts/** | |
| fail_on_unmatched_files: false | |
| make_latest: false | |
| generate_release_notes: false | |
| - name: Checkout main to trigger WebPage deploy | |
| if: ${{ success() }} | |
| uses: actions/checkout@v4 | |
| with: | |
| ref: main | |
| fetch-depth: 1 | |
| - name: Trigger WebPage deploy (workflow_dispatch) | |
| if: ${{ success() }} | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: | | |
| gh workflow list | |
| gh workflow run .github/workflows/deploy.yml --ref WebPage | |
| create_release: | |
| runs-on: ubuntu-latest | |
| environment: github_release | |
| needs: [compile_sketch] | |
| if: github.ref_type == 'tag' | |
| permissions: | |
| contents: write | |
| issues: write | |
| steps: | |
| - id: bruce_version | |
| name: Get Version | |
| run: | | |
| set -x | |
| if [[ "${{ github.ref_type }}" == "tag" ]]; then | |
| version=${{ github.ref_name }} | |
| else | |
| version="${GITHUB_SHA::7}" | |
| fi | |
| echo "version=${version}" > $GITHUB_OUTPUT | |
| - uses: actions/download-artifact@v4 | |
| with: | |
| merge-multiple: true | |
| - name: List all files | |
| if: always() | |
| run: | | |
| set -x | |
| pwd | |
| ls -all | |
| tree | |
| - name: Create Release ${{ steps.bruce_version.outputs.version }} | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| name: Bruce Release ${{ steps.bruce_version.outputs.version }} | |
| tag_name: ${{ steps.bruce_version.outputs.version }} | |
| generate_release_notes: true | |
| files: | | |
| Bruce-*.bin | |
| - name: Close "Fixed on Beta" issues | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| VERSION: ${{ steps.bruce_version.outputs.version }} | |
| run: | | |
| set -x | |
| gh issue list \ | |
| --repo "${{ github.repository }}" \ | |
| --label "Fixed on Beta" \ | |
| --state open \ | |
| --limit 500 \ | |
| --json number \ | |
| --jq '.[].number' | while read -r issue; do | |
| [ -z "$issue" ] && continue | |
| gh issue close "$issue" \ | |
| --repo "${{ github.repository }}" \ | |
| --comment "Fixed on ${VERSION}. Issue automatically closed after release" | |
| done |