Build firmware #34 #34
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 firmware | |
| run-name: "Build firmware #${{ github.run_number }}" | |
| on: | |
| workflow_dispatch: | |
| push: | |
| tags: | |
| - '*' | |
| jobs: | |
| build: | |
| runs-on: ubuntu-latest | |
| defaults: | |
| run: | |
| shell: bash | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Set up build tools | |
| run: | | |
| sudo apt update | |
| sudo apt install --no-install-recommends -y \ | |
| autoconf automake autopoint cmake \ | |
| bison build-essential flex gawk \ | |
| gettext git gperf libtool libtool-bin \ | |
| pkg-config fakeroot kmod cpio doxygen \ | |
| texinfo help2man libncurses5-dev \ | |
| zlib1g-dev libsqlite3-dev gcc-multilib \ | |
| curl dos2unix unzip wget locales xxd libltdl-dev \ | |
| libgmp3-dev libmpfr-dev libarchive-tools libblkid-dev | |
| sudo locale-gen --no-purge en_US.UTF-8 ru_RU.UTF-8 | |
| export LANG="en_US.UTF-8" | |
| export LC_ALL="en_US.UTF-8" | |
| - name: Get variables | |
| run: | | |
| sed -i 's|\r$||g' variables | |
| # Подтянуть переменные в текущий shell | |
| . variables | |
| # Если PADAVAN_THEMES — массив, склеиваем его в строку через пробел | |
| if declare -p PADAVAN_THEMES &>/dev/null && [[ "$(declare -p PADAVAN_THEMES)" == declare\ -a* ]]; then | |
| PADAVAN_THEMES="${PADAVAN_THEMES[*]}" | |
| echo "PADAVAN_THEMES=${PADAVAN_THEMES}" >> "$GITHUB_ENV" | |
| fi | |
| # Остальные PADAVAN_* как раньше — по строкам из файла | |
| grep -hE '^\s*PADAVAN_[A-Z0-9_]+=' variables | grep -v '^PADAVAN_THEMES=' >> "$GITHUB_ENV" | |
| - name: Download sources and toolchain | |
| run: | | |
| git config --global --add safe.directory '*' | |
| git clone -b "${{ env.PADAVAN_BRANCH }}" "${{ env.PADAVAN_REPO }}" padavan-ng --depth=1 | |
| git -C padavan-ng checkout "${{ env.PADAVAN_COMMIT }}" | |
| ARCH="" | |
| case "${{ env.PADAVAN_TOOLCHAIN_URL }}" in | |
| *.tzst|*.tar.zst) ARCH="--zstd" ;; | |
| *.txz|*.tar.xz) ARCH="--xz" ;; | |
| esac | |
| wget -qO- "${{ env.PADAVAN_TOOLCHAIN_URL }}" | tar -C padavan-ng $ARCH -xf - || : | |
| - name: Install themes | |
| run: | | |
| if [[ -n $PADAVAN_THEMES ]]; then | |
| git clone --depth 1 -b "$PADAVAN_THEMES_BRANCH" "$PADAVAN_THEMES_REPO" themes | |
| cp -r themes/common-theme themes/jquery.js padavan-ng/trunk/user/www/n56u_ribbon_fixed | |
| for theme in $PADAVAN_THEMES; do | |
| echo "Installing $theme theme" | |
| cp -r "themes/$theme-theme" padavan-ng/trunk/user/www/n56u_ribbon_fixed | |
| done | |
| fi | |
| - name: Run custom pre-build script | |
| run: '[[ -f pre-build.sh ]] && . pre-build.sh || :' | |
| - name: Build toolchain | |
| if: ${{ hashFiles('padavan-ng/toolchain/out/mipsel-linux-uclibc/sysroot/lib/libuClibc-*.so') == '' }} | |
| run: | | |
| cd padavan-ng/toolchain | |
| ./clean_sources.sh | |
| ./build_toolchain.sh | |
| - name: Build firmware | |
| run: | | |
| set -xe | |
| for cfg in $(ls configs.build/*.config); do | |
| cp -f "$cfg" padavan-ng/trunk/.config | |
| echo "::group::Build $(basename "$cfg" .config)" | |
| echo "Waiting for the last 589 lines of logs (~10-20 minutes per config)..." | |
| pushd padavan-ng/trunk | |
| sed -i 's|\r$||g' .config | |
| . <(grep -hE '^\s*CONFIG_(VENDOR|FIRMWARE_PRODUCT_ID)=' .config) | |
| TEMP_LOG=$(mktemp) | |
| ./clear_tree.sh >/dev/null 2>&1 | |
| ./build_firmware.sh > "$TEMP_LOG" 2>&1 | |
| echo "Showing last 589 lines:" | |
| tail -n 589 "$TEMP_LOG" | |
| rm -f "$TEMP_LOG" | |
| popd | |
| FW_FILE_NAME="$(find padavan-ng/trunk/images -type f -regextype posix-extended -iregex ".*\.(trx|bin)$" \ | |
| -printf "%T@\t%f\n" | sort -V | tail -1 | cut -f2)" | |
| [[ -n $FW_FILE_NAME ]] || { echo "Firmware file not found"; continue; } | |
| partitions="padavan-ng/trunk/configs/boards/$CONFIG_VENDOR/$CONFIG_FIRMWARE_PRODUCT_ID/partitions.config" | |
| max_fw_size="$(awk '/Firmware/ { getline; getline; sub(",", ""); print strtonum($2); }' "$partitions")" | |
| fw_size="$(stat -c %s "padavan-ng/trunk/images/$FW_FILE_NAME")" | |
| if ((fw_size > max_fw_size)); then | |
| fw_size_fmtd="$(numfmt --grouping "$fw_size") bytes" | |
| max_fw_size_fmtd="$(numfmt --grouping "$max_fw_size") bytes" | |
| echo "Firmware size ($fw_size_fmtd) exceeds max size ($max_fw_size_fmtd) for your target device" | |
| continue | |
| fi | |
| FW_PATH="release/${FW_FILE_NAME%.*}" | |
| [[ -d "$FW_PATH" ]] && FW_PATH="${FW_PATH}_$(basename "$cfg" .config)" | |
| mkdir -p "$FW_PATH" | |
| cp -f "padavan-ng/trunk/images/$FW_FILE_NAME" "$FW_PATH" | |
| cp -f "$cfg" "$FW_PATH" | |
| done | |
| - name: Run custom post-build script | |
| run: '[[ -f post-build.sh ]] && . post-build.sh || :' | |
| - name: Check if release files exist | |
| run: | | |
| if ! ls release/* >/dev/null 2>&1; then | |
| echo "❌ No files found in release directory" | |
| exit 1 | |
| fi | |
| - name: Upload artifacts | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: all_firmware_releases | |
| retention-days: 7 | |
| path: | | |
| release/* | |
| prepare-matrix: | |
| runs-on: ubuntu-latest | |
| needs: build | |
| outputs: | |
| files: ${{ steps.collect.outputs.files }} | |
| steps: | |
| - name: Download releases | |
| uses: actions/download-artifact@v8 | |
| with: | |
| name: all_firmware_releases | |
| path: release | |
| - id: collect | |
| run: | | |
| FILES=$(ls -d release/*/ 2>/dev/null | xargs -n1 basename \ | |
| | jq -R -cs 'split("\n")[:-1]') | |
| echo "files=$FILES" >> $GITHUB_OUTPUT | |
| upload-artifacts: | |
| runs-on: ubuntu-latest | |
| needs: prepare-matrix | |
| if: needs.prepare-matrix.outputs.files != '[]' | |
| strategy: | |
| matrix: | |
| file: ${{ fromJson(needs.prepare-matrix.outputs.files) }} | |
| steps: | |
| - name: Download releases | |
| uses: actions/download-artifact@v8 | |
| with: | |
| name: all_firmware_releases | |
| path: release | |
| - name: Upload artifact ${{ matrix.file }} | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: ${{ matrix.file }}_${{ env.BUILD_TIMESTAMP }} | |
| path: release/${{ matrix.file }} | |
| retention-days: 7 |