From afa20517efc8540d0a5290eea80b6cbcda4af594 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/clang-tidy-matcher.json | 26 ++++++++++++ .github/workflows/clang-tidy.yaml | 58 +++++++++++++++++++++++++++ .github/workflows/setup-build.yaml | 64 ++++++++++++++++++++++++++++++ 3 files changed, 148 insertions(+) create mode 100644 .github/clang-tidy-matcher.json create mode 100644 .github/workflows/clang-tidy.yaml create mode 100644 .github/workflows/setup-build.yaml diff --git a/.github/clang-tidy-matcher.json b/.github/clang-tidy-matcher.json new file mode 100644 index 000000000000..07bf60e3411f --- /dev/null +++ b/.github/clang-tidy-matcher.json @@ -0,0 +1,26 @@ +{ + "problemMatcher": [ + { + "owner": "clang-tidy-warning", + "pattern": [ + { + "regexp": "^([^:]+):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*?)\\s+\\[(.*?)\\]$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5, + "code": 6 + }, + { + "regexp": "^([^:]+):(\\d+):(\\d+):\\s+note:\\s+(.+)$", + "file": 1, + "line": 2, + "column": 3, + "message": 4, + "loop": true + }, + ] + } + ] +} diff --git a/.github/workflows/clang-tidy.yaml b/.github/workflows/clang-tidy.yaml new file mode 100644 index 000000000000..17a344b0d936 --- /dev/null +++ b/.github/workflows/clang-tidy.yaml @@ -0,0 +1,58 @@ +name: clang-tidy + +on: + push: + branches: + - master + pull_request: + branches: + - master + schedule: + # only at 5AM Saturday + - cron: '0 5 * * SAT' + workflow_dispatch: + 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 +env: + CLANG_VERSION: 19 + BUILD_DIR: build + +permissions: {} + +jobs: + clang-tidy: + name: "Run clang-tidy" + runs-on: ubuntu-latest + steps: + - uses: ./.github/workflows/setup-build.yaml + - name: Generate 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 . + - name: clang-tidy + run: | + # see https://github.com/actions/toolkit/blob/main/docs/problem-matchers.md + echo "::add-matcher::.github/clang-tidy-matcher.json + cmake --build $BUILD_DIR --target scylla diff --git a/.github/workflows/setup-build.yaml b/.github/workflows/setup-build.yaml new file mode 100644 index 000000000000..595954504cad --- /dev/null +++ b/.github/workflows/setup-build.yaml @@ -0,0 +1,64 @@ +name: setup-build-env +description: Setup Building Environment +inputs: + install_clang_tool: + description: 'install clang-tool' + required: false + default: false + type: boolean + install_tidy: + description: 'install clang-tidy' + required: false + default: false + type: boolean + +runs: + using: 'composite' + # use the development branch + env: + CLANG_VERSION: 19 + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - name: Add scylla-ppa repo + env: + scylla_ppa_key: 6B2BFD3660EF3F5B + # "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/ppa + 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 }} + 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 }} + run: | + sudo apt-get install -y clang-tools-$CLANG_VERSION + - name: Install clang-tidy + if: ${{ inputs.install_clang_tidy }} + run: | + sudo apt-get install -y clang-tidy-$CLANG_VERSION + - name: Install more build dependencies + 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,}