Skip to content

Firmware Stack Usage #43

Firmware Stack Usage

Firmware Stack Usage #43

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