name: CI on: [push, pull_request] jobs: build-image: 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 - name: Log in to registry run: | echo "${{ secrets.REGISTRY_TOKEN }}" \ | sudo docker login -u "${{ secrets.REGISTRY_USER }}" --password-stdin git.weaselab.dev - name: Build and push image if changed run: | image=git.weaselab.dev/weaselab/conflict-set-ci tag="$(sha256sum Dockerfile .pre-commit-config.yaml | sha256sum | cut -c 1-16)-${{ matrix.arch }}" latest=latest-${{ matrix.arch }} if sudo docker manifest inspect "$image:$tag" > /dev/null 2>&1; then if [ "$(sudo docker manifest inspect "$image:$tag")" = "$(sudo docker manifest inspect "$image:$latest" 2> /dev/null)" ]; then echo "$image:$latest is up to date" else sudo docker pull "$image:$tag" sudo docker tag "$image:$tag" "$image:$latest" sudo docker push "$image:$latest" fi else sudo docker build -t "$image:$tag" -t "$image:$latest" . sudo docker push "$image:$tag" sudo docker push "$image:$latest" fi pre-commit: needs: build-image runs-on: ubuntu-latest-amd64 container: image: git.weaselab.dev/weaselab/conflict-set-ci:latest-amd64 credentials: username: ${{ secrets.REGISTRY_USER }} password: ${{ secrets.REGISTRY_TOKEN }} steps: - uses: actions/checkout@v4 - name: Run pre-commit env: # use the hooks pre-installed in the image HOME: /tmp run: | git config --global --add safe.directory "$PWD" pre-commit run --all-files --show-diff-on-failure test: needs: build-image 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 container: image: git.weaselab.dev/weaselab/conflict-set-ci:latest-amd64 credentials: username: ${{ secrets.REGISTRY_USER }} password: ${{ secrets.REGISTRY_TOKEN }} steps: - uses: actions/checkout@v4 - uses: actions/cache@v4 with: path: .ccache key: ccache-${{ matrix.name }}-${{ gitea.sha }} restore-keys: | ccache-${{ matrix.name }}- - 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 }}/" release: needs: build-image strategy: fail-fast: false matrix: include: - runner: ubuntu-latest-amd64 arch: amd64 - runner: ubuntu-latest-arm64 arch: arm64 runs-on: ${{ matrix.runner }} container: image: git.weaselab.dev/weaselab/conflict-set-ci:latest-${{ matrix.arch }} credentials: username: ${{ secrets.REGISTRY_USER }} password: ${{ secrets.REGISTRY_TOKEN }} steps: - uses: actions/checkout@v4 - 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 ctest --no-compress-output --test-output-size-passed 100000 --test-output-size-failed 100000 -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() 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" mc cp build/*.deb build/*.rpm "$dest" if compgen -G "paper/*.pdf" > /dev/null; then mc cp paper/*.pdf "$dest" fi coverage: needs: build-image runs-on: ubuntu-latest-amd64 container: image: git.weaselab.dev/weaselab/conflict-set-ci:latest-amd64 credentials: username: ${{ secrets.REGISTRY_USER }} password: ${{ secrets.REGISTRY_TOKEN }} steps: - uses: actions/checkout@v4 - 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 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[@]}" 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