From f241b17804c27874333a14816edc7466f85ca043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Wed, 19 Apr 2023 15:10:36 +0200 Subject: CI: Speed up static checks by checking only changed files - file_format, header_guards and clang-format benefit from this short list. - dotnet-format, Python and JS checks don't, but they're only relevant for PRs changing a specific set of files, so we skip them when those files aren't modified. The logic to get changed files only works reliably for: - Pull request events - Non-force pushed push events So when force pushing a branch in your fork, or creating a new branch, it will still scan all files as fallback. Upgraded CI runner to Ubuntu 22.04 so we get clang-format 14 out of the box, so we don't need to install a custom version (saves ~15 s). We also cache the APT dependencies to speed up the build and avoid flaky Ubuntu/Microsoft repos. (cherry picked from commit 068f89307245d062bf2bf995de3726e33faef5d8) --- .github/workflows/runner.yml | 2 +- .github/workflows/static_checks.yml | 69 ++++++++++++++++++++++++++----------- 2 files changed, 50 insertions(+), 21 deletions(-) (limited to '.github') diff --git a/.github/workflows/runner.yml b/.github/workflows/runner.yml index 0487b1e090..be255b5468 100644 --- a/.github/workflows/runner.yml +++ b/.github/workflows/runner.yml @@ -7,7 +7,7 @@ concurrency: jobs: static-checks: - name: 📊 Static + name: 📊 Static checks uses: ./.github/workflows/static_checks.yml android-build: diff --git a/.github/workflows/static_checks.yml b/.github/workflows/static_checks.yml index b2ab913234..8ef49c4539 100644 --- a/.github/workflows/static_checks.yml +++ b/.github/workflows/static_checks.yml @@ -8,38 +8,58 @@ concurrency: jobs: static-checks: - name: Static Checks (clang-format, black format, file format, documentation checks) - runs-on: ubuntu-20.04 + name: Code style, file formatting, and docs + runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 + with: + fetch-depth: 2 + + - name: Install APT dependencies + uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: dos2unix libxml2-utils moreutils - - name: Install dependencies + - name: Install Python dependencies and general setup run: | - sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - - sudo apt-add-repository "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-15 main" - sudo apt-get install -qq dos2unix clang-format-15 libxml2-utils python3-pip moreutils - sudo update-alternatives --remove-all clang-format || true - sudo update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-15 100 - sudo pip3 install black==22.3.0 pytest==7.1.2 mypy==0.971 + pip3 install black==22.3.0 pytest==7.1.2 mypy==0.971 git config diff.wsErrorHighlight all + - name: Get changed files + id: changed-files + run: | + if [ "${{ github.event_name }}" == "pull_request" ]; then + files=$(git diff-tree --no-commit-id --name-only -r ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }} 2> /dev/null) + elif [ "${{ github.event_name }}" == "push" -a "${{ github.event.forced }}" == "false" -a "${{ github.event.created }}" == "false" ]; then + files=$(git diff-tree --no-commit-id --name-only -r ${{ github.event.before }}..${{ github.event.after }} 2> /dev/null) + fi + echo "$files" >> changed.txt + cat changed.txt + - name: File formatting checks (file_format.sh) run: | - bash ./misc/scripts/file_format.sh + bash ./misc/scripts/file_format.sh changed.txt - name: Header guards formatting checks (header_guards.sh) run: | - bash ./misc/scripts/header_guards.sh + bash ./misc/scripts/header_guards.sh changed.txt - name: Python style checks via black (black_format.sh) run: | - bash ./misc/scripts/black_format.sh + if grep -qE '*\.py|SConstruct|SCsub' changed.txt || [ ! -s changed.txt ]; then + bash ./misc/scripts/black_format.sh + else + echo "Skipping Python formatting as no Python files were changed." + fi - name: Python scripts static analysis (mypy_check.sh) run: | - bash ./misc/scripts/mypy_check.sh + if grep -qE '*\.py|SConstruct|SCsub' changed.txt || [ ! -s changed.txt ]; then + bash ./misc/scripts/mypy_check.sh + else + echo "Skipping Python static analysis as no Python files were changed." + fi - name: Python builders checks via pytest (pytest_builders.sh) run: | @@ -47,10 +67,14 @@ jobs: - name: JavaScript style and documentation checks via ESLint and JSDoc run: | - cd platform/web - npm ci - npm run lint - npm run docs -- -d dry-run + if grep -q "platform/web" changed.txt || [ ! -s changed.txt ]; then + cd platform/web + npm ci + npm run lint + npm run docs -- -d dry-run + else + echo "Skipping JavaScript formatting as no Web/JS files were changed." + fi - name: Class reference schema checks run: | @@ -62,11 +86,16 @@ jobs: - name: Style checks via clang-format (clang_format.sh) run: | - bash ./misc/scripts/clang_format.sh + clang-format --version + bash ./misc/scripts/clang_format.sh changed.txt - name: Style checks via dotnet format (dotnet_format.sh) run: | - bash ./misc/scripts/dotnet_format.sh + if grep -q "modules/mono" changed.txt || [ ! -s changed.txt ]; then + bash ./misc/scripts/dotnet_format.sh + else + echo "Skipping dotnet format as no C# files were changed." + fi - name: Spell checks via codespell uses: codespell-project/actions-codespell@v1 -- cgit v1.2.3