From 5167a27f18bed46ccf741a6f0fd7fb4515143037 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Sun, 31 Mar 2024 14:31:11 +0800 Subject: [PATCH] .github: add clang-tidy workflow iwyu is short for "include what you use". this workflow is added to identify missing "#include" and extraneous "#include" in C++ source files. This workflow is triggered when a pull request is created targetting the "master" branch. It uses the clang-include-cleaner tool provided by clang-tools package to analyze all the ".cc" and ".hh" source files. Signed-off-by: Kefu Chai --- .github/actions/setup-build/action.yaml | 70 +++++++++++++++++++++++++ .github/clang-tidy-matcher.json | 18 +++++++ .github/workflows/clang-tidy.yaml | 66 +++++++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 .github/actions/setup-build/action.yaml create mode 100644 .github/clang-tidy-matcher.json create mode 100644 .github/workflows/clang-tidy.yaml diff --git a/.github/actions/setup-build/action.yaml b/.github/actions/setup-build/action.yaml new file mode 100644 index 000000000000..ba21f40c01cb --- /dev/null +++ b/.github/actions/setup-build/action.yaml @@ -0,0 +1,70 @@ +name: setup-build-env +description: Setup Building Environment +inputs: + install_clang_tool: + description: 'install clang-tool' + required: false + default: false + type: boolean + install_clang_tidy: + description: 'install clang-tidy' + required: false + default: false + type: boolean +# use the development branch +env: + CLANG_VERSION: 19 + +runs: + using: 'composite' + steps: + - name: Add scylla-ppa repo + env: + scylla_ppa_key: 6B2BFD3660EF3F5B + shell: bash + # "add-apt-repository ppa:scylladb/ppa" does not work, as jammy is not built in this ppa repo, + # so, let's use xenial instead. it is the latest version provided by ppa:scylladb/pp + run: | + # see https://apt.llvm.org + gpg_home=$(mktemp -d) + gpg --homedir $gpg_home --no-default-keyring --keyring ppa.key --keyserver keyserver.ubuntu.com --recv-key $scylla_ppa_key + sudo gpg --homedir $gpg_home --keyring ppa.key --export --output /etc/apt/trusted.gpg.d/ubuntu-scylladb-ppa.gpg $scylla_ppa_key + echo "deb http://ppa.launchpadcontent.net/scylladb/ppa/ubuntu xenial main" | sudo tee -a /etc/apt/sources.list.d/scylla-ppa.list + + - name: Add clang apt repo + if: ${{ inputs.install_clang_tool || inputs.install_clang_tidy }} + shell: bash + run: | + sudo apt-get install -y curl + curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc >/dev/null + # use the development branch + echo "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy main" | sudo tee -a /etc/apt/sources.list.d/llvm.list + sudo apt-get update + + - name: Install clang-tools + if: ${{ inputs.install_clang_tools }} + shell: bash + run: | + sudo apt-get install -y clang-tools-$CLANG_VERSION + + - name: Install clang-tidy + if: ${{ inputs.install_clang_tidy }} + shell: bash + run: | + sudo apt-get install -y clang-tidy-$CLANG_VERSION + + - name: Install more build dependencies + shell: bash + run: | + # - do not install java dependencies, which is not only not necessary, + # and they include "python", which is not EOL and not available. + # - replace "scylla-libthrift010" with "libthrift-dev". because + # scylla-libthrift010 : Depends: libssl1.0.0 (>= 1.0.1) but it is not installable + # - we don't perform tests, so minio is not necessary. + sed -i.orig \ + -e '/tools\/.*\/install-dependencies.sh/d' \ + -e 's/scylla-libthrift010-dev/libthrift-dev/' \ + -e 's/(minio_download_jobs)/(true)/' \ + ./install-dependencies.sh + sudo ./install-dependencies.sh + mv ./install-dependencies.sh{.orig,} diff --git a/.github/clang-tidy-matcher.json b/.github/clang-tidy-matcher.json new file mode 100644 index 000000000000..0592e5ee7b2e --- /dev/null +++ b/.github/clang-tidy-matcher.json @@ -0,0 +1,18 @@ +{ + "problemMatcher": [ + { + "owner": "clang-tidy", + "pattern": [ + { + "regexp": "^([^:]+):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*?)\\s+\\[(.*?)\\]$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5, + "code": 6 + } + ] + } + ] +} diff --git a/.github/workflows/clang-tidy.yaml b/.github/workflows/clang-tidy.yaml new file mode 100644 index 000000000000..58a216bf25ca --- /dev/null +++ b/.github/workflows/clang-tidy.yaml @@ -0,0 +1,66 @@ +name: clang-tidy + +on: + push: + branches: + - master + inputs: + build_type: + description: 'CMake build type' + required: false + default: 'RelWithDebInfo' + type: choice + options: + - Debug + - RelWithDebInfo + - Dev + - Sanitize + - Coverage + clang_tidy_checks: + description: 'clang-tidy --checks options' + required: false + default: '-*,bugprone-use-after-move' + type: string + pull_request: + branches: + - master + schedule: + # only at 5AM Saturday + - cron: '0 5 * * SAT' + workflow_dispatch: +env: + CLANG_VERSION: 19 + BUILD_DIR: build + +permissions: {} + +jobs: + clang-tidy: + name: "Run clang-tidy" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - uses: ./.github/actions/setup-build + with: + install_clang_tidy: true + - name: Generate the building system + run: | + cmake \ + -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DCMAKE_CXX_CLANG_TIDY="clang-tidy-$CLANG_VERSION;--checks=${{ inputs.clang_tidy_checks }}" \ + -G Ninja \ + -B $BUILD_DIR \ + -S . + - run: | + # see https://github.com/actions/toolkit/blob/main/docs/problem-matchers.md + echo "::add-matcher::.github/clang-tidy-matcher.json" + - name: clang-tidy + run: | + cmake --build $BUILD_DIR --target scylla + - run: | + echo "::remove-matcher owner=clang-tidy::"