Skip to content

Draft - Add clang-tidy support in GHA #329

Draft - Add clang-tidy support in GHA

Draft - Add clang-tidy support in GHA #329

Workflow file for this run

name: Builds
on:
push:
branches: ["main"]
paths:
- src/**
- include/**
- examples/**
- bridge/**
- client-sdk-rust/**
- CMakeLists.txt
- build.sh
- build.cmd
- vcpkg.json
- CMakePresets.json
- docker/Dockerfile
- .github/workflows/**
pull_request:
branches: ["main"]
paths:
- src/**
- include/**
- examples/**
- bridge/**
- client-sdk-rust/**
- CMakeLists.txt
- build.sh
- build.cmd
- vcpkg.json
- CMakePresets.json
- docker/Dockerfile
- .github/workflows/**
workflow_dispatch:
permissions:
contents: read
actions: read
packages: read
env:
CARGO_TERM_COLOR: always
# vcpkg binary caching for Windows
VCPKG_DEFAULT_TRIPLET: x64-windows-static-md
VCPKG_DEFAULT_HOST_TRIPLET: x64-windows-static-md
VCPKG_TARGET_TRIPLET: x64-windows-static-md
jobs:
build:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
name: linux-x64
build_cmd: ./build.sh release-examples
build_dir: build-release
# - os: ubuntu-24.04-arm
# name: linux-arm64
# build_cmd: ./build.sh release-examples
# build_dir: build-release
# - os: macos-latest
# name: macos-arm64
# build_cmd: ./build.sh release-examples
# build_dir: build-release
# - os: macos-latest
# name: macos-x64
# build_cmd: ./build.sh release-examples --macos-arch x86_64
# build_dir: build-release
# - os: windows-latest
# name: windows-x64
# build_cmd: .\build.cmd release-examples
# build_dir: build-release
name: Build (${{ matrix.name }})
runs-on: ${{ matrix.os }}
steps:
- name: Checkout (with submodules)
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
# ---------- vcpkg caching for Windows ----------
- name: Export GitHub Actions cache environment variables
if: runner.os == 'Windows'
uses: actions/github-script@v7
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
- name: Setup vcpkg (Windows only)
if: runner.os == 'Windows'
uses: lukka/run-vcpkg@v11
with:
vcpkgGitCommitId: 'fb87e2bb3fe69e16c224989acb5a61349166c782'
# ---------- OS-specific deps ----------
- name: Install deps (Ubuntu)
if: runner.os == 'Linux'
run: |
set -eux
sudo apt-get update
sudo apt-get install -y \
build-essential cmake ninja-build pkg-config \
llvm-dev libclang-dev clang \
libva-dev libdrm-dev libgbm-dev libx11-dev libgl1-mesa-dev \
libxext-dev libxcomposite-dev libxdamage-dev libxfixes-dev \
libxrandr-dev libxi-dev libxkbcommon-dev \
libasound2-dev libpulse-dev \
libssl-dev \
libprotobuf-dev protobuf-compiler \
libabsl-dev \
libwayland-dev libdecor-0-dev \
libspdlog-dev
- name: Install deps (macOS)
if: runner.os == 'macOS'
run: |
set -eux
brew update
brew install cmake ninja protobuf abseil spdlog
# ---------- Rust toolchain ----------
- name: Install Rust (stable)
uses: dtolnay/rust-toolchain@stable
- name: Install Rust cross-compilation target
if: matrix.name == 'macos-x64'
run: rustup target add x86_64-apple-darwin
# ---------- Cache Cargo ----------
- name: Cache Cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-${{ matrix.name }}-cargo-reg-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-${{ matrix.name }}-cargo-reg-
- name: Cache Cargo target
uses: actions/cache@v4
with:
path: client-sdk-rust/target
key: ${{ runner.os }}-${{ matrix.name }}-cargo-target-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-${{ matrix.name }}-cargo-target-
# ---------- Build environment setup ----------
- name: Set Linux build environment
if: runner.os == 'Linux'
run: |
echo "CXXFLAGS=-Wno-deprecated-declarations" >> $GITHUB_ENV
echo "CFLAGS=-Wno-deprecated-declarations" >> $GITHUB_ENV
LLVM_VERSION=$(llvm-config --version | cut -d. -f1)
echo "LIBCLANG_PATH=/usr/lib/llvm-${LLVM_VERSION}/lib" >> $GITHUB_ENV
# ---------- Build ----------
- name: Build (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
chmod +x build.sh
${{ matrix.build_cmd }}
- name: Build (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: ${{ matrix.build_cmd }}
# ---------- Smoke test examples ----------
- name: Smoke test examples (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
set -x
failed=false
for exe in SimpleRoom SimpleRpc SimpleDataStream; do
exe_path="${{ matrix.build_dir }}/bin/${exe}"
if [[ -x "${exe_path}" ]]; then
echo "Testing ${exe}..."
output=$("${exe_path}" --help 2>&1) || true
if [[ -z "${output}" ]]; then
echo "ERROR: ${exe} produced no output"
failed=true
else
echo "${output}"
echo "${exe} ran successfully"
fi
else
echo "ERROR: ${exe_path} not found or not executable"
failed=true
fi
done
if [[ "$failed" == "true" ]]; then exit 1; fi
- name: Smoke test examples (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
$ErrorActionPreference = 'Continue'
$examples = @('SimpleRoom', 'SimpleRpc', 'SimpleDataStream')
$failed = $false
foreach ($exe in $examples) {
$exePath = "${{ matrix.build_dir }}/bin/${exe}.exe"
if (Test-Path $exePath) {
Write-Host "Testing ${exe}..."
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = $exePath
$pinfo.Arguments = "--help"
$pinfo.RedirectStandardOutput = $true
$pinfo.RedirectStandardError = $true
$pinfo.UseShellExecute = $false
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$stdout = $p.StandardOutput.ReadToEnd()
$stderr = $p.StandardError.ReadToEnd()
$p.WaitForExit()
$output = $stdout + $stderr
if ([string]::IsNullOrWhiteSpace($output)) {
Write-Host "ERROR: ${exe} produced no output"
$failed = $true
} else {
Write-Host $output
Write-Host "${exe} ran successfully"
}
} else {
Write-Host "ERROR: ${exePath} not found"
$failed = $true
}
}
if ($failed) { exit 1 } else { exit 0 }
# ---------- Upload artifacts ----------
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: livekit-sdk-${{ matrix.name }}
path: |
${{ matrix.build_dir }}/lib/
${{ matrix.build_dir }}/include/
${{ matrix.build_dir }}/bin/
retention-days: 7
- name: Upload compile database (for clang-tidy)
if: matrix.name == 'linux-x64'
uses: actions/upload-artifact@v4
with:
name: compile-database
path: |
${{ matrix.build_dir }}/compile_commands.json
${{ matrix.build_dir }}/generated/
retention-days: 1
# ---------- Cleanup ----------
- name: Clean after build (best-effort)
if: always()
shell: bash
run: |
if [[ "$RUNNER_OS" == "Windows" ]]; then
rm -rf build-release build-debug || true
else
./build.sh clean-all || true
fi
docker-build-x64:
name: Build (docker-linux-x64)
runs-on: ubuntu-latest
steps:
- name: Checkout (with submodules)
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Docker image
run: |
docker buildx build \
--platform linux/amd64 \
--load \
-t livekit-cpp-sdk-x64:${{ github.sha }} \
. \
-f docker/Dockerfile
- name: Verify installed SDK inside image
run: |
docker run --rm livekit-cpp-sdk-x64:${{ github.sha }} bash -c \
'test -f /opt/livekit-sdk/lib/cmake/LiveKit/LiveKitConfig.cmake'
- name: Save Docker image artifact
run: |
docker save livekit-cpp-sdk-x64:${{ github.sha }} | gzip > livekit-cpp-sdk-x64-docker.tar.gz
- name: Upload Docker image artifact
uses: actions/upload-artifact@v4
with:
name: livekit-cpp-sdk-docker-x64
path: livekit-cpp-sdk-x64-docker.tar.gz
retention-days: 7
docker-build-linux-arm64:
name: Build (docker-linux-arm64)
runs-on: ubuntu-24.04-arm
steps:
- name: Checkout (with submodules)
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Docker image
run: |
docker buildx build \
--platform linux/arm64 \
--load \
-t livekit-cpp-sdk:${{ github.sha }} \
. \
-f docker/Dockerfile
- name: Verify installed SDK inside image
run: |
docker run --rm livekit-cpp-sdk:${{ github.sha }} bash -c \
'test -f /opt/livekit-sdk/lib/cmake/LiveKit/LiveKitConfig.cmake'
- name: Save Docker image artifact
run: |
docker save livekit-cpp-sdk:${{ github.sha }} | gzip > livekit-cpp-sdk-arm64-docker.tar.gz
- name: Upload Docker image artifact
uses: actions/upload-artifact@v4
with:
name: livekit-cpp-sdk-docker-arm64
path: livekit-cpp-sdk-arm64-docker.tar.gz
retention-days: 7
build-collections-linux-arm64:
name: Build (cpp-example-collection-linux-arm64)
runs-on: ubuntu-24.04-arm
needs: docker-build-linux-arm64
steps:
- name: Download Docker image artifact
uses: actions/download-artifact@v4
with:
name: livekit-cpp-sdk-docker-arm64
- name: Load Docker image
run: gzip -dc livekit-cpp-sdk-arm64-docker.tar.gz | docker load
- name: Build cpp-example-collection against installed SDK
run: |
docker run --rm livekit-cpp-sdk:${{ github.sha }} bash -lc '
set -euxo pipefail
git clone https://github.com/livekit-examples/cpp-example-collection.git /tmp/cpp-example-collection
cd /tmp/cpp-example-collection
git checkout sderosa/examples-migration
cmake -S . -B build -DLIVEKIT_LOCAL_SDK_DIR=/opt/livekit-sdk
cmake --build build --parallel
'
build-collections-x64:
name: Build (cpp-example-collection-x64)
runs-on: ubuntu-latest
needs: docker-build-x64
steps:
- name: Download Docker image artifact
uses: actions/download-artifact@v4
with:
name: livekit-cpp-sdk-docker-x64
- name: Load Docker image
run: gzip -dc livekit-cpp-sdk-x64-docker.tar.gz | docker load
- name: Build cpp-example-collection against installed SDK
run: |
docker run --rm livekit-cpp-sdk-x64:${{ github.sha }} bash -lc '
set -euxo pipefail
git clone https://github.com/livekit-examples/cpp-example-collection.git /tmp/cpp-example-collection
cd /tmp/cpp-example-collection
git checkout sderosa/examples-migration
cmake -S . -B build -DLIVEKIT_LOCAL_SDK_DIR=/opt/livekit-sdk
cmake --build build --parallel
'
clang-tidy:
name: clang-tidy
needs: build
runs-on: ubuntu-latest
continue-on-error: true
if: ${{ !cancelled() }}
permissions:
contents: read
pull-requests: write
steps:
- name: Checkout (with submodules)
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Install dependencies
run: |
set -eux
sudo apt-get update
sudo apt-get install -y \
clang-tidy \
llvm-dev libclang-dev clang \
libssl-dev \
libprotobuf-dev protobuf-compiler \
libabsl-dev \
libspdlog-dev \
libva-dev libdrm-dev libgbm-dev libx11-dev libgl1-mesa-dev \
libxext-dev libxcomposite-dev libxdamage-dev libxfixes-dev \
libxrandr-dev libxi-dev libxkbcommon-dev \
libasound2-dev libpulse-dev \
libwayland-dev libdecor-0-dev
- name: Download compile database
uses: actions/download-artifact@v4
with:
name: compile-database
path: build-release/
- name: Run clang-tidy
uses: cpp-linter/cpp-linter-action@v2
id: linter
with:
style: ''
tidy-checks: ''
database: build-release
files-changed-only: true
lines-changed-only: false
ignore: 'build-*|client-sdk-rust|vcpkg_installed'
file-annotations: true
thread-comments: update
step-summary: true
tidy-review: true
passive-reviews: true
no-lgtm: true
- name: Check warning thresholds
env:
TIDY_FINDINGS: ${{ steps.linter.outputs.clang-tidy-checks-failed }}
MAX_TIDY_FINDINGS: '0'
run: |
echo "clang-tidy findings: ${TIDY_FINDINGS}"
if [ "${TIDY_FINDINGS}" -gt "${MAX_TIDY_FINDINGS}" ]; then
echo "::warning::clang-tidy found ${TIDY_FINDINGS} issue(s), threshold is ${MAX_TIDY_FINDINGS}"
exit 1
fi
echo "clang-tidy findings within threshold"