Skip to content

Add valgrind in CI #315

Add valgrind in CI

Add valgrind in CI #315

Workflow file for this run

name: CI
on:
push:
branches: [ main ]
pull_request:
branches: ["**"]
jobs:
build:
name: Build up-cpp and dependencies
runs-on: ubuntu-latest
steps:
- name: Install Conan
id: conan
uses: turtlebrowser/get-conan@main
with:
version: 2.3.2
- name: Fetch up-cpp
uses: actions/checkout@v4
with:
path: up-cpp
- name: Install conan CI profile
shell: bash
run: |
conan profile detect
cp up-cpp/.github/workflows/ci_conan_profile "$(conan profile path default)"
conan profile show
- name: Fetch up-core-api conan recipe
uses: actions/checkout@v4
with:
path: up-conan-recipes
repository: gregmedd/up-conan-recipes
- name: Build up-core-api conan package
shell: bash
run: |
conan create --version 1.5.8 up-conan-recipes/up-core-api/developer
- name: Build up-cpp with tests
shell: bash
run: |
cd up-cpp
conan install . --build=missing
cd build
cmake -S .. -DCMAKE_TOOLCHAIN_FILE=Release/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=yes
cmake --build . -- -j
- name: Save conan cache to archive
shell: bash
run: |
conan cache save --file ./conan-cache.tgz '*'
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: build-artifacts
path: up-cpp/build
- name: Upload compile commands
uses: actions/upload-artifact@v4
with:
name: compile-commands
path: up-cpp/build/compile_commands.json
- name: Upload conan cache for linting
uses: actions/upload-artifact@v4
with:
name: conan-cache
path: ./conan-cache.tgz
test:
name: Run up-cpp tests
runs-on: ubuntu-latest
needs: build
steps:
- name: Get build artifacts
uses: actions/download-artifact@v4
with:
name: build-artifacts
path: up-cpp/build
- name: Run all tests
shell: bash
run: |
cd up-cpp/build
chmod +x bin/*
ctest
- name: Upload test results
uses: actions/upload-artifact@v4
if: success() || failure()
with:
name: test-results
path: 'up-cpp/build/test/results/*.xml'
# NOTE: Run dynamic analysis in unit tests
valgrind:
name: Run up-cpp tests with Valgrind
runs-on: ubuntu-latest
needs: build
steps:
- name: Get build artifacts
uses: actions/download-artifact@v4
with:
name: build-artifacts
path: up-cpp/build
- name: Install Valgrind
run: sudo apt-get install -y valgrind
- name: Run Valgrind on tests
run: |
cd up-cpp/build
chmod +x bin/*
valgrind --leak-check=full \
--show-leak-kinds=all \
--track-origins=yes \
--verbose \
--log-file=valgrind.log \
ctest -V
- name: Upload Valgrind log
uses: actions/upload-artifact@v4
if: success() || failure()
with:
name: valgrind-log
path: up-cpp/build/valgrind.log
lint:
name: Lint C++ sources
runs-on: ubuntu-latest
needs: build
steps:
- name: Get build commands
uses: actions/download-artifact@v4
with:
name: compile-commands
- name: Install Conan
id: conan
uses: turtlebrowser/get-conan@main
with:
version: 2.3.2
- name: Create default Conan profile
run: conan profile detect
- name: Get conan cache
uses: actions/download-artifact@v4
with:
name: conan-cache
- name: Restore conan cache from archive
shell: bash
run: |
conan cache restore conan-cache.tgz
- name: Fetch up-cpp
uses: actions/checkout@v4
with:
path: up-cpp
- name: Run linters on source
id: source-linter
uses: cpp-linter/cpp-linter-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
repo-root: up-cpp
ignore: 'test'
style: 'file' # read .clang-format for configuration
tidy-checks: '' # Read .clang-tidy for configuration
database: compile_commands.json
- name: Run linters on tests
id: test-linter
uses: cpp-linter/cpp-linter-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
repo-root: up-cpp
ignore: 'src|include'
style: 'file' # read .clang-format for configuration
tidy-checks: '' # Read .clang-tidy for configuration
database: compile_commands.json
- name: Report lint failure
if: steps.source-linter.outputs.checks-failed > 0 || steps.test-linter.outputs.checks-failed > 0
run: |
exit 1
# NOTE: In GitHub repository settings, the "Require status checks to pass
# before merging" branch protection rule ensures that commits are only merged
# from branches where specific status checks have passed. These checks are
# specified manually as a list of workflow job names. Thus we use this extra
# job to signal whether all CI checks have passed.
ci:
name: CI status checks
runs-on: ubuntu-latest
needs: [build, test]
if: always()
steps:
- name: Check whether all jobs pass
run: echo '${{ toJson(needs) }}' | jq -e 'all(.result == "success")'