Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
222 changes: 222 additions & 0 deletions .github/workflows/compiler_warnings.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
name: Report Compiler Warnings

on:
pull_request: {}

permissions:
pull-requests: write
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
cancel-in-progress: true

jobs:
warnings:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
# Clone the repo to a subdirectory, so we can initialize the Zephyr
# workspace in the parent directory.
path: zephyr-workspace/open-earable-v2

- name: Cache/Install APT Packages
uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: ccache git cmake ninja-build gperf ccache dfu-util device-tree-compiler wget python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1
version: 1.0
execute_install_scripts: true

- name: Cache PIP Packages
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-

- name: Install West
run: pip3 install west

- name: Install Zephyr SDK
run: |
wget -q https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.17.0/zephyr-sdk-0.17.0_linux-x86_64_minimal.tar.xz
tar xf zephyr-sdk-0.17.0_linux-x86_64_minimal.tar.xz -C ~/
~/zephyr-sdk-0.17.0/setup.sh -c -t arm-zephyr-eabi

- name: Initialize Zephyr Workspace
run: |
cd zephyr-workspace
west init -l open-earable-v2
west update --narrow -o=--depth=1
pip3 install -r zephyr/scripts/requirements.txt

- name: Register Custom Boards
run: |
mkdir -p $(pwd)/workflow-board-temp
cp -R $(pwd)/zephyr-workspace/open-earable-v2/boards $(pwd)/workflow-board-temp/boards

mkdir -p $(pwd)/workflow-board-temp/boards/arm
cp -R -f $(pwd)/workflow-board-temp/boards/teco/* $(pwd)/workflow-board-temp/boards/arm/ || true
rm -f -R $(pwd)/workflow-board-temp/boards/teco

cp -R -f $(pwd)/workflow-board-temp/boards/* $(pwd)/zephyr-workspace/zephyr/boards

- name: Cache ~/.cache/ccache
uses: actions/cache@v4
with:
path: ~/.cache/ccache
key: ccache-warnings-v1-${{ runner.os }}-${{ hashFiles('zephyr-workspace/open-earable-v2/west.yml') }}
restore-keys: |
ccache-warnings-v1-${{ runner.os }}-

- name: Build with Extended Compiler Warnings
continue-on-error: true
timeout-minutes: 15
id: warning-build
env:
EXTRA_CFLAGS: -Wextra -Wshadow
EXTRA_CXXFLAGS: -Wextra -Wshadow
run: |
set -o pipefail
cd zephyr-workspace
west build \
--build-dir build-warnings \
--board openearable_v2/nrf5340/cpuapp \
--pristine=always open-earable-v2 \
-- -DFILE_SUFFIX="fota" \
2>&1 | tee warning-build.log

- name: Collect Compiler Warnings
if: always()
continue-on-error: true
id: compiler-warnings
run: |
mkdir -p workflow-board-temp
warning_report="workflow-board-temp/compiler-warnings.txt"
project_warning_report="workflow-board-temp/project-compiler-warnings.txt"
configuration_warning_report="workflow-board-temp/configuration-warnings.txt"

if [ -f zephyr-workspace/warning-build.log ]; then
sed -E 's/\x1B\[[0-9;]*[mK]//g' zephyr-workspace/warning-build.log \
| grep -Ei '(^|[[:space:]])warning:' \
> "$warning_report" || true
else
touch "$warning_report"
fi

grep '/zephyr-workspace/open-earable-v2/' "$warning_report" \
| sed -E 's#^.*/zephyr-workspace/open-earable-v2/##' \
| awk '!seen[$0]++' \
> "$project_warning_report" || true

grep -Ei '^[[:space:]]*(---[[:space:]]*)?warning:' "$warning_report" \
| awk '!seen[$0]++' \
> "$configuration_warning_report" || true

warning_count=$(wc -l < "$warning_report" | tr -d ' ')
project_warning_count=$(wc -l < "$project_warning_report" | tr -d ' ')
configuration_warning_count=$(wc -l < "$configuration_warning_report" | tr -d ' ')

echo "count=$warning_count" >> "$GITHUB_OUTPUT"
echo "project_count=$project_warning_count" >> "$GITHUB_OUTPUT"
echo "configuration_count=$configuration_warning_count" >> "$GITHUB_OUTPUT"
echo "Collected $warning_count warning(s): $project_warning_count unique project and $configuration_warning_count unique configuration warning(s)."

- name: Upload Complete Compiler Warning Report
if: always()
continue-on-error: true
uses: actions/upload-artifact@v4
id: warning-artifact-upload
with:
name: compiler-warnings
path: workflow-board-temp/compiler-warnings.txt

- name: Prepare PR Comment
if: always()
continue-on-error: true
env:
WARNING_BUILD_OUTCOME: ${{ steps.warning-build.outcome }}
TOTAL_WARNING_COUNT: ${{ steps.compiler-warnings.outputs.count }}
PROJECT_WARNING_COUNT: ${{ steps.compiler-warnings.outputs.project_count }}
CONFIGURATION_WARNING_COUNT: ${{ steps.compiler-warnings.outputs.configuration_count }}
WARNING_REPORT_URL: ${{ steps.warning-artifact-upload.outputs.artifact-url }}
run: |
comment="workflow-board-temp/compiler-warnings-comment.md"
project_warning_report="workflow-board-temp/project-compiler-warnings.txt"
configuration_warning_report="workflow-board-temp/configuration-warnings.txt"
touch "$project_warning_report" "$configuration_warning_report"

{
echo "## Compiler warnings"
echo

if [ "$WARNING_BUILD_OUTCOME" = "success" ]; then
echo "The extended-warning build completed successfully."
elif [ "$WARNING_BUILD_OUTCOME" = "failure" ]; then
echo "The extended-warning build failed; this report may be incomplete."
else
echo "The extended-warning build did not run."
fi

echo
if [ "$WARNING_BUILD_OUTCOME" = "skipped" ]; then
echo "### Project compiler warnings: unavailable"
elif [ "${PROJECT_WARNING_COUNT:-0}" -eq 0 ]; then
echo "### Project compiler warnings: none"
else
echo "### Project compiler warnings: $PROJECT_WARNING_COUNT"
echo
echo "<details open>"
echo "<summary>Show project warnings</summary>"
echo
echo '```text'
head -n 100 "$project_warning_report"
echo '```'
echo
if [ "$PROJECT_WARNING_COUNT" -gt 100 ]; then
echo "Showing the first 100 unique project warnings."
echo
fi
echo "</details>"
fi

if [ "$WARNING_BUILD_OUTCOME" != "skipped" ]; then
echo
if [ "${CONFIGURATION_WARNING_COUNT:-0}" -eq 0 ]; then
echo "### Configuration and security warnings: none"
else
echo "### Configuration and security warnings: $CONFIGURATION_WARNING_COUNT"
echo
echo "<details>"
echo "<summary>Show configuration warnings</summary>"
echo
echo '```text'
head -n 50 "$configuration_warning_report"
echo '```'
echo
echo "</details>"
fi

echo
if [ -n "$WARNING_REPORT_URL" ]; then
echo "The [complete warning report]($WARNING_REPORT_URL) contains all ${TOTAL_WARNING_COUNT:-0} warning lines, including warnings from Zephyr and other dependencies."
else
echo "The complete warning report artifact could not be uploaded."
fi
fi

echo
echo "[View the warning workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})"
} > "$comment"

cat "$comment" >> "$GITHUB_STEP_SUMMARY"

- name: Comment Compiler Warnings on PR
if: always()
continue-on-error: true
uses: thollander/actions-comment-pull-request@v3
with:
file-path: workflow-board-temp/compiler-warnings-comment.md
comment-tag: compiler-warnings
Loading