InfiniTime.git

commit 028d40860dc32a96ce70bf820053ec93bd52f36d

Author: Riku Isokoski <riksu9000@gmail.com>

workflows: Add build size comparison workflow

Add .github/workflows/getSize.sh to extract sizes of sections from the
objfile

build-firmware uses getSize.sh to output the section sizes.

get-base-ref-size job added, which builds the base branch of the PR and
outputs the section sizes. Caches are used to avoid unnecessary builds
when the base branch hasn't been updated.

leave-build-size-comment job added, which creates or updates a comment
on the PR with the build size information from other jobs.

 .github/workflows/getSize.sh | 19 ++++++
 .github/workflows/main.yml | 106 ++++++++++++++++++++++++++++++++++++-


diff --git a/.github/workflows/getSize.sh b/.github/workflows/getSize.sh
new file mode 100755
index 0000000000000000000000000000000000000000..52a86132556e0b58fe9764436be2410c60e0f335
--- /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 7dc588ccdc687d57ecebe1a16110c2d5d368ede9..c2570627532e6e14cb694fb4fa29eebf640fa861 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -13,12 +13,19 @@     paths-ignore:
       - '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 @@         with:
           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 @@       uses: actions/upload-artifact@v3
       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