diff --git a/.github/workflows/getSize.sh b/.github/workflows/getSize.sh new file mode 100755 index 0000000000..52a8613255 --- /dev/null +++ b/.github/workflows/getSize.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +# Requires environment variables from docker/build.sh + +set -e + +SIZE_BIN="$TOOLS_DIR/$GCC_ARM_PATH/bin/arm-none-eabi-size" +[ ! -x "$SIZE_BIN" ] && exit 1 + +[ -z "$1" ] && exit 1 +SIZE_OUTPUT=$($SIZE_BIN "$1" | tail -n1) + +TEXT_SIZE=$(echo "$SIZE_OUTPUT" | cut -f 1 |tr -d '[:blank:]') +DATA_SIZE=$(echo "$SIZE_OUTPUT" | cut -f 2 |tr -d '[:blank:]') +BSS_SIZE=$(echo "$SIZE_OUTPUT" | cut -f 3 |tr -d '[:blank:]') + +echo "text_size=$TEXT_SIZE" +echo "data_size=$DATA_SIZE" +echo "bss_size=$BSS_SIZE" diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7dc588ccdc..c257062753 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,12 +13,19 @@ on: - 'doc/**' - '**.md' - jobs: build-firmware: runs-on: ubuntu-latest container: image: infinitime/infinitime-build + outputs: + text_size: ${{ steps.output-sizes.outputs.text_size }} + data_size: ${{ steps.output-sizes.outputs.data_size }} + bss_size: ${{ steps.output-sizes.outputs.bss_size }} + env: + # InfiniTime sources are downloaded to the current directory. + # Override SOURCES_DIR in build.sh + SOURCES_DIR: . steps: - name: Checkout source files uses: actions/checkout@v3 @@ -26,9 +33,12 @@ jobs: submodules: recursive - name: Build shell: bash - env: - SOURCES_DIR: . run: /opt/build.sh all + - name: Output build size + id: output-sizes + run: | + . /opt/build.sh + .github/workflows/getSize.sh "$BUILD_DIR"/src/pinetime-app-*.out >> $GITHUB_OUTPUT # Unzip the package because Upload Artifact will zip up the files - name: Unzip DFU package run: unzip ./build/output/pinetime-mcuboot-app-dfu-*.zip -d ./build/output/pinetime-mcuboot-app-dfu @@ -87,3 +97,93 @@ jobs: with: name: infinisim-${{ github.head_ref }} path: build_lv_sim/infinisim + + get-base-ref-size: + if: github.event_name == 'pull_request' + runs-on: ubuntu-22.04 + container: + image: infinitime/infinitime-build + outputs: + text_size: ${{ steps.output-sizes.outputs.text_size }} + data_size: ${{ steps.output-sizes.outputs.data_size }} + bss_size: ${{ steps.output-sizes.outputs.bss_size }} + env: + # InfiniTime sources are downloaded to the current directory. + # Override SOURCES_DIR in build.sh + SOURCES_DIR: . + steps: + - name: Cache sources + id: cache-sources + uses: actions/cache@v3 + with: + path: . + key: source-files-${{ github.event.pull_request.base.sha }} + + - if: ${{ steps.cache-sources.outputs.cache-hit != 'true' }} + name: Checkout source files + uses: actions/checkout@v3 + with: + ref: ${{ github.base_ref }} + submodules: recursive + + - if: ${{ steps.cache-sources.outputs.cache-hit != 'true' }} + name: Build + shell: bash + # Only pinetime-app target is needed, but post_build.sh fails + run: /opt/build.sh all + + - name: Output build size + id: output-sizes + run: | + . /opt/build.sh + .github/workflows/getSize.sh "$BUILD_DIR"/src/pinetime-app-*.out >> $GITHUB_OUTPUT + + leave-build-size-comment: + if: github.event_name == 'pull_request' + needs: [build-firmware, get-base-ref-size] + runs-on: ubuntu-latest + steps: + - name: Compare build size + id: output-sizes-diff + run: | + TEXT_SIZE=${{ needs.build-firmware.outputs.text_size }} + DATA_SIZE=${{ needs.build-firmware.outputs.data_size }} + BSS_SIZE=${{ needs.build-firmware.outputs.bss_size }} + + echo "text_size=$TEXT_SIZE" >> $GITHUB_OUTPUT + echo "data_size=$DATA_SIZE" >> $GITHUB_OUTPUT + echo "bss_size=$BSS_SIZE" >> $GITHUB_OUTPUT + + TEXT_SIZE_BASE=${{ needs.get-base-ref-size.outputs.text_size }} + DATA_SIZE_BASE=${{ needs.get-base-ref-size.outputs.data_size }} + BSS_SIZE_BASE=${{ needs.get-base-ref-size.outputs.bss_size }} + + TEXT_SIZE_DIFF=$((TEXT_SIZE - TEXT_SIZE_BASE)) + DATA_SIZE_DIFF=$((DATA_SIZE - DATA_SIZE_BASE)) + BSS_SIZE_DIFF=$((BSS_SIZE - BSS_SIZE_BASE)) + + echo "text_diff=$TEXT_SIZE_DIFF" >> $GITHUB_OUTPUT + echo "data_diff=$DATA_SIZE_DIFF" >> $GITHUB_OUTPUT + echo "bss_diff=$BSS_SIZE_DIFF" >> $GITHUB_OUTPUT + + - name: Find Comment + uses: peter-evans/find-comment@v2 + id: build-size-comment + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: 'github-actions[bot]' + body-includes: Build size and comparison to + + - name: Create or update comment + uses: peter-evans/create-or-update-comment@v2 + with: + comment-id: ${{ steps.build-size-comment.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body: | + Build size and comparison to ${{ github.base_ref }}: + | Section | Size | Difference | + | ------- | ---- | ---------- | + | text | ${{ needs.build-firmware.outputs.text_size }}B | ${{ steps.output-sizes-diff.outputs.text_diff }}B | + | data | ${{ needs.build-firmware.outputs.data_size }}B | ${{ steps.output-sizes-diff.outputs.data_diff }}B | + | bss | ${{ needs.build-firmware.outputs.bss_size }}B | ${{ steps.output-sizes-diff.outputs.bss_diff }}B | + edit-mode: replace