Newer
Older
mbed-os / .github / workflows / basic_checks.yml
# This workflow performs the checks like license check,
# doxygen, unit tests etc.
name: Basic Checks

on:
  pull_request:
  workflow_dispatch:
  push:
    branches:
      - master

jobs:
  license-check:
    runs-on: ubuntu-latest
    container:
      image: ghcr.io/armmbed/mbed-os-env:master-latest

    steps:
      - name: Checkout repo
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
          

      - 
        name: install dependencies
        shell: bash
        run: |
          pip install -U scancode-toolkit click

      - 
        name: license check 
        run: |
          set -x
          mkdir -p SCANCODE
          git config --global --add safe.directory "$GITHUB_WORKSPACE"
          git diff --name-only --diff-filter=d origin/${GITHUB_BASE_REF} \
            | ( grep '.\(c\|cpp\|h\|hpp\|py\)$' || true )
          echo $?
          git diff --name-only --diff-filter=d origin/${GITHUB_BASE_REF} \
            | ( grep '.\(c\|cpp\|h\|hpp\|py\)$' || true ) \
            | ( grep -v '^tools/test/toolchains/api_test.py' || true ) \
            | while read file; do cp --parents "${file}" SCANCODE; done
          ls SCANCODE
          scancode -l --json-pp scancode.json SCANCODE
          python ./tools/test/ci/scancode-evaluate.py scancode.json || true
          cat scancode-evaluate.log
          COUNT=$(cat scancode-evaluate.log | grep 'File:' | grep -v 'SPDX' | wc -l) || true
          if [ $COUNT = 0 ]; then
            echo "License check OK";
            true;
          else
            echo "License check failed, please review license issues found in files";
            false;
          fi

  include-check:
    runs-on: ubuntu-latest
    container:
      image: ghcr.io/armmbed/mbed-os-env:master-latest

    steps:
      - name: Checkout repo
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - 
        name: include check
        run: |
          git config --global --add safe.directory "$GITHUB_WORKSPACE"
          # checks mbed.h is not included in MbedOS files except in tests
          ! git grep '^#include\s["'"']mbed.h['"'"]$' -- '*.c' '*.h' '*.cpp' '*.hpp' \
              ':!*platform_mbed.h' ':!*TESTS/*' ':!TEST_APPS/' ':!UNITTESTS/' \
              ':!*tests/*' ':!*targets/*' ':!*TARGET_*' ':!*unsupported/*' \
              ':!*events/tests/*' ':!*drivers/tests/*'

  style-check:
    runs-on: ubuntu-latest
    container:
      image: ghcr.io/armmbed/mbed-os-env:master-latest

    steps:

      - name: Checkout repo
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
    
      - 
        name: UTF-8 Check
        run: |
          git config --global --add safe.directory "$GITHUB_WORKSPACE"
          # Make sure we're not introducing any text which is not UTF-8 encoded
          git diff origin/${GITHUB_BASE_REF} -U0 | ( grep -a '^+' || true ) | ( ! grep -axv '.*' )
          

      - 
        name: astyle checks
        run: |
          set -x
          git config --global --add safe.directory "$GITHUB_WORKSPACE"
          git diff --name-only --diff-filter=d origin/${GITHUB_BASE_REF} \
            | ( grep '.*\.\(c\|cpp\|h\|hpp\)$' || true ) \
            | ( grep -v -f .codecheckignore || true ) \
            | while read file; do astyle -n --options=.astylerc "${file}"; done
          git diff --exit-code --diff-filter=d --color


  docs-check:
    runs-on: ubuntu-latest
    container:
      image: ghcr.io/armmbed/mbed-os-env:master-latest

    steps:

      - name: Checkout repo
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
    
      - 
        name: spell checks
        run: |
          set -x
          ./tools/test/ci/doxy-spellchecker/spell.sh drivers .codecheckignore
          ./tools/test/ci/doxy-spellchecker/spell.sh platform .codecheckignore
          ./tools/test/ci/doxy-spellchecker/spell.sh events .codecheckignore
          ./tools/test/ci/doxy-spellchecker/spell.sh rtos .codecheckignore
          ./tools/test/ci/doxy-spellchecker/spell.sh connectivity/netsocket .codecheckignore

      - 
        name: doxygen
        run: |
          set -x
          ccache -s
          mkdir BUILD
          # Assert that the Doxygen build produced no warnings.
          # The strange command below asserts that the Doxygen command had an
          # output of zero length
          doxygen doxyfile_options 2>&1
          # Once Mbed OS has been fixed, enable the full test by replacing the top line with this:
          # - ( ! doxygen doxyfile_options 2>&1 | grep . )
          # Assert that all binary libraries are named correctly
          # The strange command below asserts that there are exactly 0 libraries
          # that do not start with lib
          find "(" -name "*.a" -or -name "*.ar" ")" -and -not -name "lib*" |
          tee BUILD/badlibs |
          sed -e "s/^/Bad library name found: /" && [ ! -s BUILD/badlibs ]
          # Assert that all assembler files are named correctly
          # The strange command below asserts that there are exactly 0 libraries
          # that do end with .s
          find  -name "*.s" | tee BUILD/badasm |
          sed -e "s/^/Bad Assembler file name found: /" && [ ! -s BUILD/badasm ]

  python-tests:
    # these tests run in 3.7, hence running in vm not in pre-built docker
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout repo
        uses: actions/checkout@v3


      - uses: actions/setup-python@v2
        with:
          python-version: '3.7'

      -
        name: install dependencies
        run: |
          pip install -r tools/requirements.txt 
          pip install -r tools/test/requirements.txt

      -
        name: pytest
        run: |
          set -x
          coverage run -a -m pytest tools/test
          python tools/test/pylint.py
          coverage run -a tools/project.py -S | sed -n '/^Total/p'
          coverage html

  pin-validation:
    runs-on: ubuntu-latest
    container:
      image: ghcr.io/armmbed/mbed-os-env:master-latest
    steps:
      -
        name: Checkout repo
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      -
        name: validate pins
        run: |
          set -x
          git config --global --add safe.directory "$GITHUB_WORKSPACE"
          git diff --name-only --diff-filter=d origin/${GITHUB_BASE_REF} \
            | ( grep '.*[\\|\/]PinNames.h$' || true ) \
            | while read file; do python ./hal/tests/pinvalidate/pinvalidate.py -vvvfp "${file}"; done
          git diff --exit-code --diff-filter=d --color

  cmake-checks:
    env: 
      NAME: mbed-test-mode-check 
      ROOT: tools/cmake/tests/mbed_test_mode/ 
      TOOLCHAIN: GCC_ARM 
      TARGET_NAME: K64F 
      PROFILE: develop
    runs-on: ubuntu-latest
    container:
      image: ghcr.io/armmbed/mbed-os-env:master-latest
    steps:
      -
        name: Checkout repo
        uses: actions/checkout@v3

      -
        name: cmake build
        run: |
          set -x
          mbedtools configure -p ${{ env.ROOT}} -t ${{ env.TOOLCHAIN }} -m ${{ env.TARGET_NAME }} --mbed-os-path .
          cmake -S ${{env.ROOT}} -B ${{ env.ROOT }}/cmake_build/${{env.TARGET_NAME}}/${{ env.PROFILE }}/${{ env.TOOLCHAIN }}/ -GNinja -DCMAKE_BUILD_TYPE=${{ env.PROFILE }}
          cmake --build ${{ env.ROOT }}/cmake_build/${{ env.TARGET_NAME }}/${{ env.PROFILE }}/${{ env.TOOLCHAIN }}/

      -
        name: cmake unittest
        run: |
          set -x     
          ctest --build-and-test . build --build-generator Ninja --build-options -DMBED_ENABLE_TESTING=ON -DCMAKE_BUILD_TYPE=Debug -DCOVERAGE=ON --test-command ctest        
          gcovr --gcov-executable gcov -r . ./build -s -e ".*\.h" --exclude-directories=${GITHUB_WORKSPACE}/build/UNITTESTS --exclude-directories=${GITHUB_WORKSPACE}/build/_deps
          ccache -s