Repository navigation
Firmware Stack Usage #43
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: Firmware Stack Usage | |
| on: | |
| pull_request: | |
| schedule: | |
| - cron: '17 3 * * *' | |
| workflow_dispatch: | |
| jobs: | |
| stack-usage: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - profile: f407-discovery | |
| meta-info: config/boards/f407-discovery/meta-info.env | |
| - profile: stm32f767_nucleo | |
| meta-info: config/boards/nucleo_f767/meta-info.env | |
| - profile: stm32h743_nucleo | |
| meta-info: config/boards/nucleo_h743/meta-info.env | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Checkout Submodules | |
| run: misc/git_scripts/common_submodule_init.sh | |
| - uses: ./.github/actions/setup-java | |
| - name: Install build tools | |
| run: | | |
| sudo bash misc/actions/add-ubuntu-latest-apt-mirrors.sh | |
| sudo bash misc/actions/ubuntu-install-tools.sh | |
| - name: Acquire Arm GNU Toolchain | |
| uses: carlosperate/arm-none-eabi-gcc-action@v1.13.0 | |
| with: | |
| release: '14.2.Rel1' | |
| - name: Build firmware and bootloader callgraphs | |
| working-directory: ./firmware/ | |
| env: | |
| EXTRA_3_PARAMS: -fstack-usage -fcallgraph-info=su -Wstack-usage=1024 | |
| run: bash bin/compile.sh "${{ matrix.meta-info }}" elf bootloader --output-sync=recurse | |
| - name: Test and generate stack usage report | |
| working-directory: ./firmware/ | |
| run: | | |
| ../gradlew -p .. :gcc_map_reader:test :gcc_map_reader:shadowJar | |
| java -cp ../java_tools/gcc_map_reader/build/libs/gcc_map_reader-all.jar \ | |
| com.rusefi.tools.stack.StackUsageReport \ | |
| --profile "${{ matrix.profile }}" \ | |
| --check-reviewed \ | |
| --output "build/firmware_stack_usage_${{ matrix.profile }}.md" | |
| - name: Publish pull request workflow summary | |
| if: ${{ github.event_name == 'pull_request' }} | |
| working-directory: ./firmware/ | |
| run: cat "build/firmware_stack_usage_${{ matrix.profile }}.md" >> "$GITHUB_STEP_SUMMARY" | |
| - name: Upload scheduled report | |
| if: ${{ github.event_name != 'pull_request' && github.ref == 'refs/heads/master' }} | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: firmware_stack_usage_${{ matrix.profile }} | |
| path: ./firmware/build/firmware_stack_usage_${{ matrix.profile }}.md | |
| update-reference: | |
| needs: stack-usage | |
| if: ${{ github.event_name != 'pull_request' && github.ref == 'refs/heads/master' }} | |
| runs-on: ubuntu-latest | |
| permissions: | |
| actions: read | |
| contents: write | |
| concurrency: | |
| group: firmware-stack-usage-${{ github.ref }} | |
| queue: max | |
| cancel-in-progress: false | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Download stack usage reports | |
| uses: actions/download-artifact@v8 | |
| with: | |
| pattern: firmware_stack_usage_* | |
| path: stack-usage | |
| merge-multiple: true | |
| - name: Assemble firmware stack usage document | |
| run: | | |
| { | |
| echo '<!-- Generated by .github/workflows/firmware-stack-usage.yaml from StackUsageReport output. Do not edit. See java_tools/gcc_map_reader/README.md. -->' | |
| echo | |
| cat stack-usage/firmware_stack_usage_f407-discovery.md | |
| echo | |
| cat stack-usage/firmware_stack_usage_stm32f767_nucleo.md | |
| echo | |
| cat stack-usage/firmware_stack_usage_stm32h743_nucleo.md | |
| } > docs/firmware_stack_usage.md | |
| - name: Commit firmware stack usage document | |
| run: | | |
| git config --local user.email "action@github.com" | |
| git config --local user.name "GitHub firmware stack usage Action" | |
| .github/workflows/bin/smart-git-add.sh docs/firmware_stack_usage.md | |
| OUT=$(git commit -m "Auto-generated firmware stack usage" docs/firmware_stack_usage.md 2>&1) || echo "commit failed, finding out why" | |
| echo "$OUT" | |
| if echo "$OUT" | grep 'nothing to commit\|no changes added'; then | |
| echo "firmware stack usage: looks like nothing to commit" | |
| elif echo "$OUT" | grep 'changed'; then | |
| if [ "${{ github.repository }}" = "rusefi/rusefi" ]; then | |
| echo "COMMIT=true" >> "$GITHUB_ENV" | |
| echo "firmware stack usage: changed on master, pushing" | |
| else | |
| echo "firmware stack usage: changed, but this is a fork" | |
| fi | |
| else | |
| echo "firmware stack usage: unexpected commit result" | |
| exit 1 | |
| fi | |
| - name: Push current firmware stack usage document | |
| if: ${{ env.COMMIT == 'true' }} | |
| run: | | |
| can_publish() { | |
| if ! git merge-base --is-ancestor "${{ github.sha }}" origin/master; then | |
| return 1 | |
| fi | |
| while IFS=$'\t' read -r AUTHOR SUBJECT; do | |
| if [ "$AUTHOR" != "action@github.com" ]; then | |
| return 1 | |
| fi | |
| case "$SUBJECT" in | |
| "Auto-generated configs and docs"|"Trigger wheel definitions"|"Auto-generated default tune"|"Update date") ;; | |
| *) return 1 ;; | |
| esac | |
| done < <(git log --format='%ae%x09%s' "${{ github.sha }}..origin/master") | |
| } | |
| for ATTEMPT in 1 2 3; do | |
| git fetch origin master | |
| if ! can_publish; then | |
| echo "master advanced with non-generated changes; skipping this stale report" | |
| exit 0 | |
| fi | |
| git rebase origin/master | |
| if git push origin HEAD:master; then | |
| exit 0 | |
| fi | |
| echo "push attempt $ATTEMPT raced another generated commit; retrying" | |
| sleep 2 | |
| done | |
| echo "failed to push firmware stack usage after 3 attempts" | |
| exit 1 |