Skip to content

fix(cache): remove direct nlohmann_json dependency and use vix::json #6

fix(cache): remove direct nlohmann_json dependency and use vix::json

fix(cache): remove direct nlohmann_json dependency and use vix::json #6

name: Cache Strict CI
on:
push:
branches: [main, master, dev]
paths:
- ".github/workflows/cache-strict-ci.yml"
- "CMakeLists.txt"
- "include/**"
- "src/**"
- "tests/**"
- "README.md"
- "LICENSE"
- "vix.json"
pull_request:
branches: [main, master, dev]
paths:
- ".github/workflows/cache-strict-ci.yml"
- "CMakeLists.txt"
- "include/**"
- "src/**"
- "tests/**"
- "README.md"
- "LICENSE"
- "vix.json"
workflow_dispatch:
permissions:
contents: read
env:
DEPS: >
build-essential
cmake
ninja-build
clang
llvm
lld
g++
cppcheck
clang-tidy
valgrind
pkg-config
git
nlohmann-json3-dev
BUILD_JOBS: 2
VIX_GIT_BRANCH: dev
jobs:
build-test:
name: Build and Tests (${{ matrix.compiler }}, fetch_net=${{ matrix.fetch_net }}, fetch_json=${{ matrix.fetch_json }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
compiler: [clang, gcc]
fetch_net: [OFF]
fetch_json: [OFF]
steps:
- name: Checkout cache repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
run: |
sudo apt-get update -y
sudo apt-get install -y $DEPS
- name: Fetch sibling net
run: |
rm -rf ../net
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/net.git ../net
test -f ../net/CMakeLists.txt || (echo "::error::../net/CMakeLists.txt is missing"; exit 1)
- name: Select compiler
run: |
if [ "${{ matrix.compiler }}" = "clang" ]; then
echo "CC=clang" >> "$GITHUB_ENV"
echo "CXX=clang++" >> "$GITHUB_ENV"
else
echo "CC=gcc" >> "$GITHUB_ENV"
echo "CXX=g++" >> "$GITHUB_ENV"
fi
- name: Configure
run: |
cmake -G Ninja -S . -B build \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DVIX_CACHE_BUILD_TESTS=ON \
-DVIX_CACHE_FETCH_NET=${{ matrix.fetch_net }} \
-DVIX_CACHE_FETCH_NLOHMANN=${{ matrix.fetch_json }}
- name: Build
run: |
cmake --build build -j"${BUILD_JOBS}"
- name: Print executables
run: |
echo "---- executables ----"
find build -type f -executable | sort || true
- name: Run ctest
run: |
set -e
cd build
if ctest --output-on-failure --timeout 90; then
echo "All discovered tests passed."
else
echo "::warning::Some tests failed or no tests were discovered."
test -f Testing/Temporary/LastTest.log && cat Testing/Temporary/LastTest.log || true
exit 0
fi
runtime-smoke:
name: Runtime Smoke Checks
runs-on: ubuntu-latest
steps:
- name: Checkout cache repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
run: |
sudo apt-get update -y
sudo apt-get install -y $DEPS
- name: Fetch sibling net
run: |
rm -rf ../net
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/net.git ../net
test -f ../net/CMakeLists.txt || (echo "::error::../net/CMakeLists.txt is missing"; exit 1)
- name: Configure runtime build
run: |
cmake -G Ninja -S . -B build-runtime \
-DCMAKE_BUILD_TYPE=Debug \
-DVIX_CACHE_BUILD_TESTS=ON \
-DVIX_CACHE_FETCH_NET=OFF \
-DVIX_CACHE_FETCH_NLOHMANN=OFF
- name: Build runtime artifacts
run: |
cmake --build build-runtime -j"${BUILD_JOBS}"
- name: List candidate executables
run: |
echo "---- runtime candidates ----"
find build-runtime -type f -executable | sort || true
- name: Run smoke tests on executables
shell: bash
run: |
set +e
FAIL=0
mapfile -t CANDIDATES < <(
find build-runtime -type f -executable | while read -r exe; do
base="$(basename "$exe")"
if [[ ! "$exe" =~ /CMakeFiles/ ]] && [[ ! "$base" =~ (cmake|ctest) ]]; then
echo "$exe"
fi
done | sort -u
)
if [ ${#CANDIDATES[@]} -eq 0 ]; then
echo "No executable candidates found."
exit 0
fi
for exe in "${CANDIDATES[@]}"; do
echo "==> Smoke run: $exe"
timeout 5s "$exe" >/tmp/cache_smoke.log 2>&1
STATUS=$?
cat /tmp/cache_smoke.log || true
if [ $STATUS -ne 0 ] && [ $STATUS -ne 124 ]; then
echo "::warning::Non-zero exit status from $exe (status=$STATUS)"
FAIL=1
fi
done
if [ $FAIL -ne 0 ]; then
echo "::warning::Some smoke runs reported issues."
else
echo "Smoke runs completed."
fi
exit 0
static-analysis:
name: Static Analysis
runs-on: ubuntu-latest
steps:
- name: Checkout cache repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
run: |
sudo apt-get update -y
sudo apt-get install -y $DEPS
- name: Fetch sibling net
run: |
rm -rf ../net
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/net.git ../net || true
- name: Configure for analysis
run: |
cmake -G Ninja -S . -B build-analyze \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DVIX_CACHE_BUILD_TESTS=ON \
-DVIX_CACHE_FETCH_NET=OFF \
-DVIX_CACHE_FETCH_NLOHMANN=OFF
- name: Run clang-tidy on source files
run: |
set +e
find src tests -name '*.cpp' -print0 | xargs -0 -n1 -P2 clang-tidy -p build-analyze
STATUS=$?
if [ $STATUS -ne 0 ]; then
echo "::warning::clang-tidy reported issues."
else
echo "clang-tidy completed successfully."
fi
exit 0
- name: Run cppcheck on headers and sources
run: |
set +e
cppcheck \
--enable=all \
--std=c++20 \
--inconclusive \
--quiet \
--suppress=missingIncludeSystem \
include/ src/ tests/
STATUS=$?
if [ $STATUS -ne 0 ]; then
echo "::warning::cppcheck reported issues."
else
echo "cppcheck completed successfully."
fi
exit 0
valgrind:
name: Valgrind Checks
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout cache repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
run: |
sudo apt-get update -y
sudo apt-get install -y $DEPS
- name: Fetch sibling net
run: |
rm -rf ../net
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/net.git ../net
test -f ../net/CMakeLists.txt || (echo "::error::../net/CMakeLists.txt is missing"; exit 1)
- name: Configure valgrind build
run: |
cmake -G Ninja -S . -B build-valgrind \
-DCMAKE_BUILD_TYPE=Debug \
-DVIX_CACHE_BUILD_TESTS=ON \
-DVIX_CACHE_FETCH_NET=OFF \
-DVIX_CACHE_FETCH_NLOHMANN=OFF
- name: Build
run: |
cmake --build build-valgrind -j"${BUILD_JOBS}"
- name: Run valgrind on executables
shell: bash
run: |
set +e
FAIL=0
mapfile -t CANDIDATES < <(
find build-valgrind -type f -executable | while read -r exe; do
base="$(basename "$exe")"
if [[ ! "$exe" =~ /CMakeFiles/ ]] && [[ ! "$base" =~ (cmake|ctest) ]]; then
echo "$exe"
fi
done | sort -u
)
if [ ${#CANDIDATES[@]} -eq 0 ]; then
echo "No executable candidates found."
exit 0
fi
for exe in "${CANDIDATES[@]}"; do
echo "==> Valgrind: $exe"
timeout 20s valgrind \
--leak-check=full \
--show-leak-kinds=all \
--track-origins=yes \
"$exe" >/tmp/cache_valgrind.log 2>&1
STATUS=$?
cat /tmp/cache_valgrind.log || true
if [ $STATUS -ne 0 ] && [ $STATUS -ne 124 ]; then
echo "::warning::Valgrind reported issues for $exe"
FAIL=1
fi
done
if [ $FAIL -ne 0 ]; then
echo "::warning::Valgrind detected potential issues."
else
echo "Valgrind checks completed."
fi
exit 0
standalone-package-check:
name: Standalone Package Export Check
runs-on: ubuntu-latest
steps:
- name: Checkout cache repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
run: |
sudo apt-get update -y
sudo apt-get install -y $DEPS
- name: Fetch sibling net
run: |
rm -rf ../net
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/net.git ../net
test -f ../net/CMakeLists.txt || (echo "::error::../net/CMakeLists.txt is missing"; exit 1)
- name: Configure installable standalone build
run: |
cmake -G Ninja -S . -B build-install \
-DCMAKE_BUILD_TYPE=Release \
-DVIX_CACHE_BUILD_TESTS=OFF \
-DVIX_CACHE_FETCH_NET=OFF \
-DVIX_CACHE_FETCH_NLOHMANN=OFF \
-DCMAKE_INSTALL_PREFIX="${PWD}/.ci-install"
- name: Build standalone package
run: |
cmake --build build-install -j"${BUILD_JOBS}"
- name: Install standalone package
run: |
cmake --install build-install
- name: Verify installed package files
run: |
echo "---- install tree ----"
find .ci-install -maxdepth 8 -type f | sort || true
test -f .ci-install/include/vix/cache/Cache.hpp || (echo "::error::cache headers not found"; exit 1)
test -f .ci-install/include/vix/cache/FileStore.hpp || (echo "::error::cache FileStore header not found"; exit 1)
if [ -f .ci-install/lib/libvix_cache.a ]; then
echo "Static cache library detected."
elif [ -f .ci-install/lib/libvix_cache.so ]; then
echo "Shared cache library detected."
else
echo "::error::installed cache library not found"
exit 1
fi
config-coverage:
name: Configuration Coverage
runs-on: ubuntu-latest
steps:
- name: Checkout cache repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
run: |
sudo apt-get update -y
sudo apt-get install -y $DEPS
- name: Fetch sibling net
run: |
rm -rf ../net
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/net.git ../net
test -f ../net/CMakeLists.txt || (echo "::error::../net/CMakeLists.txt is missing"; exit 1)
- name: Configure release mode
run: |
cmake -G Ninja -S . -B build-release \
-DCMAKE_BUILD_TYPE=Release \
-DVIX_CACHE_BUILD_TESTS=OFF \
-DVIX_CACHE_FETCH_NET=OFF \
-DVIX_CACHE_FETCH_NLOHMANN=OFF
- name: Build release mode
run: |
cmake --build build-release -j"${BUILD_JOBS}"
- name: Configure debug mode
run: |
cmake -G Ninja -S . -B build-debug \
-DCMAKE_BUILD_TYPE=Debug \
-DVIX_CACHE_BUILD_TESTS=ON \
-DVIX_CACHE_FETCH_NET=OFF \
-DVIX_CACHE_FETCH_NLOHMANN=OFF
- name: Build debug mode
run: |
cmake --build build-debug -j"${BUILD_JOBS}"
summary:
name: Cache Strict CI Summary
needs:
[
build-test,
runtime-smoke,
static-analysis,
valgrind,
standalone-package-check,
config-coverage,
]
runs-on: ubuntu-latest
steps:
- name: Print summary
run: |
echo "Cache strict CI completed."
echo "This workflow validates:"
echo "- build with clang and gcc"
echo "- standalone net dependency wiring"
echo "- nlohmann_json availability"
echo "- runtime smoke checks"
echo "- static analysis"
echo "- valgrind"
echo "- standalone package export"
echo "- debug and release configuration coverage"