CI / pre-commit (pull_request) Successful in 1m59s
CI / test (-DCMAKE_BUILD_TYPE=Debug, debug) (pull_request) Successful in 3m16s
CI / test (-DCMAKE_CXX_FLAGS=-DUSE_64_BIT=1, 64-bit-versions) (pull_request) Successful in 3m10s
CI / test (-DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++, gcc) (pull_request) Successful in 3m6s
CI / test (-DUSE_SIMD_FALLBACK=ON, simd-fallback) (pull_request) Successful in 3m10s
CI / release (amd64, ubuntu-latest-amd64) (pull_request) Successful in 5m5s
CI / release (arm64, ubuntu-latest-arm64) (pull_request) Successful in 2m15s
CI / coverage (pull_request) Successful in 3m42s
CI / msan (pull_request) Failing after 3m38s
The msan job uploads test results to MinIO with `mc cp`, but unlike the test/release/coverage jobs it never installed the mc binary. When MinIO credentials are configured (i.e. after merge) the upload step would fail. Install mc to match the other jobs.
390 lines
15 KiB
YAML
390 lines
15 KiB
YAML
name: CI
|
|
|
|
on: [push, pull_request]
|
|
|
|
env:
|
|
CC: clang
|
|
CXX: clang++
|
|
|
|
jobs:
|
|
pre-commit:
|
|
runs-on: ubuntu-latest-amd64
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/cache@v4
|
|
with:
|
|
path: /var/cache/apt/archives
|
|
key: apt-amd64-${{ hashFiles('.gitea/workflows/ci.yml') }}
|
|
|
|
- name: Install dependencies
|
|
run: |
|
|
sudo apt-get update -qq
|
|
sudo apt-get install -y git nodejs pre-commit
|
|
|
|
- uses: actions/cache@v4
|
|
with:
|
|
path: ~/.cache/pre-commit
|
|
key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
|
|
|
|
- name: Run pre-commit
|
|
run: |
|
|
git config --global --add safe.directory "$PWD"
|
|
pre-commit run --all-files --show-diff-on-failure
|
|
|
|
test:
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- name: 64-bit-versions
|
|
cmake_args: -DCMAKE_CXX_FLAGS=-DUSE_64_BIT=1
|
|
- name: debug
|
|
cmake_args: -DCMAKE_BUILD_TYPE=Debug
|
|
- name: simd-fallback
|
|
cmake_args: -DUSE_SIMD_FALLBACK=ON
|
|
- name: gcc
|
|
cmake_args: -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++
|
|
runs-on: ubuntu-latest-amd64
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/cache@v4
|
|
with:
|
|
path: /var/cache/apt/archives
|
|
key: apt-amd64-${{ hashFiles('.gitea/workflows/ci.yml') }}
|
|
|
|
- name: Install common dependencies
|
|
run: |
|
|
sudo apt-get update -qq
|
|
sudo apt-get install -y \
|
|
build-essential ccache cmake gcc g++ libc6-dbg \
|
|
ninja-build python3 valgrind zstd
|
|
sudo curl -Ls "https://minio.weaselab.dev/public/$(uname -m)/mc.RELEASE.2025-08-13T08-35-41Z" \
|
|
-o /usr/local/bin/mc && sudo chmod +x /usr/local/bin/mc
|
|
|
|
- name: Install LLVM toolchain
|
|
if: matrix.name != 'gcc'
|
|
run: |
|
|
. /etc/os-release
|
|
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
|
|
echo "deb http://apt.llvm.org/${VERSION_CODENAME}/ llvm-toolchain-${VERSION_CODENAME}-21 main" | sudo tee /etc/apt/sources.list.d/llvm.list
|
|
sudo apt-get update -qq
|
|
sudo apt-get install -y \
|
|
clang-21 llvm-21 lld-21 mold
|
|
for tool in clang clang++ llvm-ar llvm-nm llvm-ranlib llvm-objcopy llvm-cov llvm-symbolizer lld ld.lld; do
|
|
sudo update-alternatives --install /usr/bin/${tool} ${tool} /usr/bin/${tool}-21 100
|
|
done
|
|
|
|
- name: Build
|
|
run: |
|
|
export CCACHE_DIR="$GITHUB_WORKSPACE/.ccache"
|
|
rm -rf build
|
|
cmake -S . -B build -G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ${{ matrix.cmake_args }}
|
|
ninja -C build
|
|
ccache -s
|
|
|
|
- name: Test
|
|
run: |
|
|
cd build
|
|
ctest --no-compress-output --test-output-size-passed 100000 --test-output-size-failed 100000 -T Test -j "$(nproc)" --timeout 90 > /dev/null
|
|
|
|
- name: Upload test results to MinIO
|
|
if: always()
|
|
env:
|
|
MINIO_ACCESS_KEY: ${{ secrets.MINIO_ACCESS_KEY }}
|
|
MC_HOST_minio: https://${{ secrets.MINIO_ACCESS_KEY }}:${{ secrets.MINIO_SECRET_KEY }}@minio.weaselab.dev
|
|
run: |
|
|
if [ -z "$MINIO_ACCESS_KEY" ]; then
|
|
echo "MinIO credentials not configured; skipping upload"
|
|
exit 0
|
|
fi
|
|
zstd build/Testing/*/Test.xml
|
|
mc cp build/Testing/*/Test.xml.zst "minio/jenkins/conflict-set/${{ gitea.run_number }}/${{ matrix.name }}/"
|
|
|
|
- name: Test summary
|
|
if: always()
|
|
run: |
|
|
python3 ctest_summary.py build/Testing/*/Test.xml \
|
|
--link "https://minio.weaselab.dev/jenkins/conflict-set/${{ gitea.run_number }}/${{ matrix.name }}/Test.xml.zst" \
|
|
| tee -a "$GITHUB_STEP_SUMMARY"
|
|
|
|
release:
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- runner: ubuntu-latest-amd64
|
|
arch: amd64
|
|
- runner: ubuntu-latest-arm64
|
|
arch: arm64
|
|
runs-on: ${{ matrix.runner }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/cache@v4
|
|
with:
|
|
path: /var/cache/apt/archives
|
|
key: apt-${{ matrix.arch }}-${{ hashFiles('.gitea/workflows/ci.yml') }}
|
|
|
|
- name: Install dependencies
|
|
run: |
|
|
. /etc/os-release
|
|
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
|
|
echo "deb http://apt.llvm.org/${VERSION_CODENAME}/ llvm-toolchain-${VERSION_CODENAME}-21 main" | sudo tee /etc/apt/sources.list.d/llvm.list
|
|
sudo apt-get update -qq
|
|
sudo apt-get install -y \
|
|
build-essential ccache clang-21 cmake devscripts \
|
|
libc6-dbg llvm-21 lld-21 mold ninja-build rpm \
|
|
valgrind zstd
|
|
sudo curl -Ls "https://minio.weaselab.dev/public/$(uname -m)/mc.RELEASE.2025-08-13T08-35-41Z" \
|
|
-o /usr/local/bin/mc && sudo chmod +x /usr/local/bin/mc
|
|
for tool in clang clang++ llvm-ar llvm-nm llvm-ranlib llvm-objcopy llvm-cov llvm-symbolizer lld ld.lld; do
|
|
sudo update-alternatives --install /usr/bin/${tool} ${tool} /usr/bin/${tool}-21 100
|
|
done
|
|
|
|
- name: Install paper build dependencies
|
|
if: matrix.arch == 'amd64'
|
|
run: |
|
|
sudo apt-get install -y \
|
|
biber latexmk \
|
|
texlive-bibtex-extra texlive-fonts-recommended \
|
|
texlive-latex-extra texlive-pictures
|
|
|
|
- uses: actions/cache@v4
|
|
with:
|
|
path: .ccache
|
|
key: ccache-release-${{ matrix.arch }}-${{ gitea.sha }}
|
|
restore-keys: |
|
|
ccache-release-${{ matrix.arch }}-
|
|
|
|
- name: Build
|
|
run: |
|
|
export CCACHE_DIR="$GITHUB_WORKSPACE/.ccache"
|
|
rm -rf build
|
|
cmake -S . -B build -G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_FLAGS=-DNVALGRIND
|
|
ninja -C build
|
|
ccache -s
|
|
|
|
- name: Test
|
|
run: |
|
|
cd build
|
|
# On arm64, valgrind needs the MAKE_MEM_DEFINED client requests for
|
|
# https://git.weaselab.dev/weaselab/conflict-set/issues/39, but this
|
|
# build has -DNVALGRIND, which compiles them out. Skip valgrind
|
|
# tests here; they run annotated in the test job.
|
|
ctest --no-compress-output --test-output-size-passed 100000 --test-output-size-failed 100000 ${{ matrix.arch == 'arm64' && '-E valgrind' || '' }} -T Test -j "$(nproc)" --timeout 90 > /dev/null
|
|
|
|
- name: Package
|
|
run: |
|
|
cd build
|
|
cpack -G DEB
|
|
cpack -G RPM
|
|
|
|
- name: Build paper
|
|
if: matrix.arch == 'amd64'
|
|
run: |
|
|
cd paper
|
|
make
|
|
|
|
- name: Upload artifacts to MinIO
|
|
if: always()
|
|
shell: bash
|
|
env:
|
|
MINIO_ACCESS_KEY: ${{ secrets.MINIO_ACCESS_KEY }}
|
|
MC_HOST_minio: https://${{ secrets.MINIO_ACCESS_KEY }}:${{ secrets.MINIO_SECRET_KEY }}@minio.weaselab.dev
|
|
run: |
|
|
if [ -z "$MINIO_ACCESS_KEY" ]; then
|
|
echo "MinIO credentials not configured; skipping upload"
|
|
exit 0
|
|
fi
|
|
dest="minio/jenkins/conflict-set/${{ gitea.run_number }}/release-${{ matrix.arch }}/"
|
|
zstd build/Testing/*/Test.xml
|
|
mc cp build/Testing/*/Test.xml.zst "$dest"
|
|
if compgen -G "build/*.deb" > /dev/null; then
|
|
mc cp build/*.deb "$dest"
|
|
fi
|
|
if compgen -G "build/*.rpm" > /dev/null; then
|
|
mc cp build/*.rpm "$dest"
|
|
fi
|
|
if compgen -G "paper/*.pdf" > /dev/null; then
|
|
mc cp paper/*.pdf "$dest"
|
|
fi
|
|
|
|
- name: Test summary
|
|
if: always()
|
|
run: |
|
|
python3 ctest_summary.py build/Testing/*/Test.xml \
|
|
--link "https://minio.weaselab.dev/jenkins/conflict-set/${{ gitea.run_number }}/release-${{ matrix.arch }}/Test.xml.zst" \
|
|
| tee -a "$GITHUB_STEP_SUMMARY"
|
|
|
|
msan:
|
|
runs-on: ubuntu-latest-amd64
|
|
env:
|
|
MSAN_VERSION: "21.1.8"
|
|
MSAN_URL: "https://minio.weaselab.dev/public/x86_64/msan-toolchain-21.1.8.tar.zst"
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/cache@v4
|
|
with:
|
|
path: /var/cache/apt/archives
|
|
key: apt-amd64-${{ hashFiles('.gitea/workflows/ci.yml') }}
|
|
|
|
- name: Install dependencies
|
|
run: |
|
|
. /etc/os-release
|
|
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
|
|
echo "deb http://apt.llvm.org/${VERSION_CODENAME}/ llvm-toolchain-${VERSION_CODENAME}-21 main" | sudo tee /etc/apt/sources.list.d/llvm.list
|
|
sudo apt-get update -qq
|
|
sudo apt-get install -y \
|
|
build-essential ccache clang-21 cmake libc6-dbg \
|
|
llvm-21 lld-21 mold ninja-build python3 zstd
|
|
sudo curl -Ls "https://minio.weaselab.dev/public/$(uname -m)/mc.RELEASE.2025-08-13T08-35-41Z" \
|
|
-o /usr/local/bin/mc && sudo chmod +x /usr/local/bin/mc
|
|
for tool in clang clang++ llvm-ar llvm-nm llvm-ranlib llvm-objcopy llvm-cov llvm-symbolizer lld ld.lld; do
|
|
sudo update-alternatives --install /usr/bin/${tool} ${tool} /usr/bin/${tool}-21 100
|
|
done
|
|
|
|
- name: Download MSan toolchain
|
|
run: |
|
|
curl -Ls "${MSAN_URL}" -o /tmp/msan-toolchain.tar.zst
|
|
sudo mkdir -p /opt/msan
|
|
sudo tar --zstd -xf /tmp/msan-toolchain.tar.zst -C /opt/msan
|
|
|
|
- uses: actions/cache@v4
|
|
with:
|
|
path: .ccache
|
|
key: ccache-msan-${{ gitea.sha }}
|
|
restore-keys: |
|
|
ccache-msan-
|
|
|
|
- name: Build
|
|
run: |
|
|
export CCACHE_DIR="$GITHUB_WORKSPACE/.ccache"
|
|
rm -rf build
|
|
cmake -S . -B build -G Ninja \
|
|
-DCMAKE_C_COMPILER=clang \
|
|
-DCMAKE_CXX_COMPILER=clang++ \
|
|
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
|
-DCMAKE_BUILD_TYPE=Debug \
|
|
-DDISABLE_TSAN=ON \
|
|
-DUSE_MSAN=ON \
|
|
-DCMAKE_CXX_FLAGS="-fsanitize=memory -stdlib=libc++ -I/opt/msan/include/c++/v1 -L/opt/msan/lib -UNDEBUG" \
|
|
-DCMAKE_EXE_LINKER_FLAGS="-stdlib=libc++ -Wl,-rpath,/opt/msan/lib" \
|
|
-DCMAKE_SHARED_LINKER_FLAGS="-stdlib=libc++ -Wl,-rpath,/opt/msan/lib"
|
|
ninja -C build
|
|
ccache -s
|
|
|
|
- name: Test
|
|
run: |
|
|
cd build
|
|
ctest --no-compress-output --test-output-size-passed 100000 --test-output-size-failed 100000 -T Test -j "$(nproc)" --timeout 300 > /dev/null
|
|
|
|
- name: Upload test results to MinIO
|
|
if: always()
|
|
env:
|
|
MINIO_ACCESS_KEY: ${{ secrets.MINIO_ACCESS_KEY }}
|
|
MC_HOST_minio: https://${{ secrets.MINIO_ACCESS_KEY }}:${{ secrets.MINIO_SECRET_KEY }}@minio.weaselab.dev
|
|
run: |
|
|
if [ -z "$MINIO_ACCESS_KEY" ]; then
|
|
echo "MinIO credentials not configured; skipping upload"
|
|
exit 0
|
|
fi
|
|
zstd build/Testing/*/Test.xml
|
|
mc cp build/Testing/*/Test.xml.zst "minio/jenkins/conflict-set/${{ gitea.run_number }}/msan/"
|
|
|
|
- name: Test summary
|
|
if: always()
|
|
run: |
|
|
python3 ctest_summary.py build/Testing/*/Test.xml \
|
|
--link "https://minio.weaselab.dev/jenkins/conflict-set/${{ gitea.run_number }}/msan/Test.xml.zst" \
|
|
| tee -a "$GITHUB_STEP_SUMMARY"
|
|
|
|
coverage:
|
|
runs-on: ubuntu-latest-amd64
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/cache@v4
|
|
with:
|
|
path: /var/cache/apt/archives
|
|
key: apt-amd64-${{ hashFiles('.gitea/workflows/ci.yml') }}
|
|
|
|
- name: Install dependencies
|
|
run: |
|
|
. /etc/os-release
|
|
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
|
|
echo "deb http://apt.llvm.org/${VERSION_CODENAME}/ llvm-toolchain-${VERSION_CODENAME}-21 main" | sudo tee /etc/apt/sources.list.d/llvm.list
|
|
sudo apt-get update -qq
|
|
sudo apt-get install -y \
|
|
build-essential ccache clang-21 cmake gcovr \
|
|
libc6-dbg llvm-21 lld-21 mold ninja-build python3 valgrind zstd
|
|
sudo curl -Ls "https://minio.weaselab.dev/public/$(uname -m)/mc.RELEASE.2025-08-13T08-35-41Z" \
|
|
-o /usr/local/bin/mc && sudo chmod +x /usr/local/bin/mc
|
|
for tool in clang clang++ llvm-ar llvm-nm llvm-ranlib llvm-objcopy llvm-cov llvm-symbolizer lld ld.lld; do
|
|
sudo update-alternatives --install /usr/bin/${tool} ${tool} /usr/bin/${tool}-21 100
|
|
done
|
|
|
|
- uses: actions/cache@v4
|
|
with:
|
|
path: .ccache
|
|
key: ccache-coverage-${{ gitea.sha }}
|
|
restore-keys: |
|
|
ccache-coverage-
|
|
|
|
- name: Build
|
|
run: |
|
|
export CCACHE_DIR="$GITHUB_WORKSPACE/.ccache"
|
|
rm -rf build
|
|
cmake -S . -B build -G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
|
-DCMAKE_C_FLAGS=--coverage -DCMAKE_CXX_FLAGS=--coverage \
|
|
-DCMAKE_BUILD_TYPE=Debug -DDISABLE_TSAN=ON
|
|
ninja -C build
|
|
ccache -s
|
|
|
|
- name: Test
|
|
run: |
|
|
cd build
|
|
ctest --no-compress-output --test-output-size-passed 100000 --test-output-size-failed 100000 -T Test -j "$(nproc)" --timeout 90 > /dev/null
|
|
|
|
- name: Coverage report
|
|
shell: bash
|
|
run: |
|
|
gcov_args=(-f ConflictSet.cpp -f LongestCommonPrefix.h -f Metrics.h
|
|
--gcov-executable "llvm-cov gcov" --exclude-noncode-lines)
|
|
gcovr "${gcov_args[@]}" --cobertura > build/coverage.xml
|
|
gcovr "${gcov_args[@]}"
|
|
mkdir -p build/coverage_html
|
|
gcovr "${gcov_args[@]}" --html-details build/coverage_html/index.html
|
|
gcovr "${gcov_args[@]}" --fail-under-line 100 > /dev/null
|
|
|
|
- name: Upload results to MinIO
|
|
if: always()
|
|
env:
|
|
MINIO_ACCESS_KEY: ${{ secrets.MINIO_ACCESS_KEY }}
|
|
MC_HOST_minio: https://${{ secrets.MINIO_ACCESS_KEY }}:${{ secrets.MINIO_SECRET_KEY }}@minio.weaselab.dev
|
|
run: |
|
|
if [ -z "$MINIO_ACCESS_KEY" ]; then
|
|
echo "MinIO credentials not configured; skipping upload"
|
|
exit 0
|
|
fi
|
|
dest="minio/jenkins/conflict-set/${{ gitea.run_number }}/coverage/"
|
|
zstd build/Testing/*/Test.xml
|
|
mc cp build/Testing/*/Test.xml.zst "$dest"
|
|
if [ -e build/coverage.xml ]; then
|
|
mc cp build/coverage.xml "$dest"
|
|
fi
|
|
if [ -d build/coverage_html ]; then
|
|
mc cp -r build/coverage_html "$dest"
|
|
fi
|
|
|
|
- name: Test summary
|
|
if: always()
|
|
run: |
|
|
python3 ctest_summary.py build/Testing/*/Test.xml \
|
|
--link "https://minio.weaselab.dev/jenkins/conflict-set/${{ gitea.run_number }}/coverage/Test.xml.zst" \
|
|
| tee -a "$GITHUB_STEP_SUMMARY"
|
|
echo "" | tee -a "$GITHUB_STEP_SUMMARY"
|
|
echo "📊 [Coverage report](https://minio.weaselab.dev/jenkins/conflict-set/${{ gitea.run_number }}/coverage/coverage_html/index.html)" | tee -a "$GITHUB_STEP_SUMMARY"
|