Skip to content

Commit

Permalink
ci: rehaul sanitizer builds
Browse files Browse the repository at this point in the history
- Based them on opensuse tumbleweed to get recent
  versions of their packages.
- Update clang/llvm to 17
- Add build-images-opensuse-tw script
  • Loading branch information
vicentebolea committed Dec 6, 2024
1 parent b94a620 commit 5524e5f
Show file tree
Hide file tree
Showing 14 changed files with 297 additions and 7 deletions.
6 changes: 1 addition & 5 deletions .gitlab/gitlab-ci-spack.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,6 @@ default:
- public
- x86_64

.common-sanitizer:
variables:
GITLAB_SITE: "UO CI (gitlab.spack.io)"
CI_BIN_DIR: "$CI_PROJECT_DIR/build"

# This file is used to define the GitLab CI/CD pipeline for the ADIOS2 project.
.common-sanitizer:
rules:
Expand Down Expand Up @@ -41,6 +36,7 @@ default:
- $CI_BIN_DIR/testing/
- $CI_BIN_DIR/source/**/*.h
- $CI_BIN_DIR/source/**/*.in
- $CI_BIN_DIR/adios2_reorganize_wrapper

# CTest and CMake install files.
- $CI_BIN_DIR/CMakeCache.txt
Expand Down
9 changes: 9 additions & 0 deletions scripts/ci/cmake/ci-uo-sanitizer-asan.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ set(ENV{LSAN_OPTIONS} "suppressions=$ENV{CI_SOURCE_DIR}/scripts/ci/cmake/adios-a
set(ENV{CFLAGS} "${ASAN_FLAGS}")
set(ENV{CXXFLAGS} "${ASAN_FLAGS}")

set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS "detect_odr_violation=0")

set(dashboard_cache "
BUILD_TESTING:BOOL=ON
ADIOS2_BUILD_EXAMPLES:BOOL=ON
Expand All @@ -23,6 +25,13 @@ set(dashboard_track "Analysis")
set(CTEST_CMAKE_GENERATOR "Ninja")
set(CTEST_MEMORYCHECK_TYPE "AddressSanitizer")

list(APPEND EXCLUDE_EXPRESSIONS
"Install.*"
"Unit.FileTransport.FailOnEOF.Serial"
)
list(JOIN EXCLUDE_EXPRESSIONS "|" TEST_EXCLUDE_STRING)
set(CTEST_MEMCHECK_ARGS EXCLUDE "${TEST_EXCLUDE_STRING}")

set(ADIOS_TEST_REPEAT 0)
list(APPEND CTEST_UPDATE_NOTES_FILES "${CMAKE_CURRENT_LIST_FILE}")
include(${CMAKE_CURRENT_LIST_DIR}/ci-common.cmake)
5 changes: 3 additions & 2 deletions scripts/ci/cmake/ci-uo-sanitizer-msan.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,9 @@ set(CTEST_CMAKE_GENERATOR "Ninja")
set(CTEST_MEMORYCHECK_TYPE "MemorySanitizer")

list(APPEND EXCLUDE_EXPRESSIONS
"Engine.BP.BPBufferSizeTest.SyncDeferredIdenticalUsage.BP3.Serial"
"Engine.BP.BPBufferSizeTest.SyncDeferredIdenticalUsage.BP4.Serial"
"Install.*"
"Unit.FileTransport.FailOnEOF.Serial"
"Engine.BP.BPBufferSizeTest.SyncDeferredIdenticalUsage.*.Serial"
)
list(JOIN EXCLUDE_EXPRESSIONS "|" TEST_EXCLUDE_STRING)
set(CTEST_MEMCHECK_ARGS EXCLUDE "${TEST_EXCLUDE_STRING}")
Expand Down
8 changes: 8 additions & 0 deletions scripts/ci/cmake/ci-uo-sanitizer-tsan.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@ set(dashboard_track "Analysis")
set(CTEST_CMAKE_GENERATOR "Ninja")
set(CTEST_MEMORYCHECK_TYPE "ThreadSanitizer")

list(APPEND EXCLUDE_EXPRESSIONS
"Install.*"
"Unit.FileTransport.FailOnEOF.Serial"
"Engine.BP.BPBufferSizeTest.SyncDeferredIdenticalUsage.*.Serial"
)
list(JOIN EXCLUDE_EXPRESSIONS "|" TEST_EXCLUDE_STRING)
set(CTEST_MEMCHECK_ARGS EXCLUDE "${TEST_EXCLUDE_STRING}")

set(ADIOS_TEST_REPEAT 0)
list(APPEND CTEST_UPDATE_NOTES_FILES "${CMAKE_CURRENT_LIST_FILE}")
include(${CMAKE_CURRENT_LIST_DIR}/ci-common.cmake)
8 changes: 8 additions & 0 deletions scripts/ci/cmake/ci-uo-sanitizer-ubsan.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ ADIOS2_BUILD_EXAMPLES:BOOL=ON
ADIOS2_USE_HDF5:STRING=ON
ADIOS2_USE_MPI:STRING=OFF
ADIOS2_USE_Python:STRING=OFF
HDF5_C_COMPILER_EXECUTABLE:FILEPATH=/usr/bin/h5cc
HDF5_DIFF_EXECUTABLE:FILEPATH=/usr/bin/h5diff
Expand All @@ -24,6 +25,13 @@ set(dashboard_track "Analysis")
set(CTEST_CMAKE_GENERATOR "Ninja")
set(CTEST_MEMORYCHECK_TYPE "UndefinedBehaviorSanitizer")

list(APPEND EXCLUDE_EXPRESSIONS
"Install.*"
"Unit.FileTransport.FailOnEOF.Serial"
)
list(JOIN EXCLUDE_EXPRESSIONS "|" TEST_EXCLUDE_STRING)
set(CTEST_MEMCHECK_ARGS EXCLUDE "${TEST_EXCLUDE_STRING}")

set(ADIOS_TEST_REPEAT 0)
list(APPEND CTEST_UPDATE_NOTES_FILES "${CMAKE_CURRENT_LIST_FILE}")
include(${CMAKE_CURRENT_LIST_DIR}/ci-common.cmake)
49 changes: 49 additions & 0 deletions scripts/ci/images/opensuse-tw/build-images-opensuse-tw
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#!/bin/bash

# This script is used to build the openSUSE Tumbleweed images

set -xeuo pipefail

declare -r DOCKER_REPOSITORY=ghcr.io/ornladios/adios2
declare -u ENABLE_PUSH=

#=============================================================================
# Functions

# Function to build a docker image
function docker_build() {
local docker_file=$1
local docker_tag=$2
local args=(--progress=plain --rm)

if [[ -n "${ENABLE_PUSH}" ]]; then
args+=("--push")
fi

sudo docker build "${args[@]}" \
--file "${docker_file}" \
--tag "${DOCKER_REPOSITORY}:${docker_tag}-$(date +"%Y%m%d")" \
.
}

function usage() {
echo "Usage: $0 [-p <PROJECT>] [-m <MILESTONE>]"
echo " -p Push to the docker registry"
exit 0
}

#=============================================================================
# Main
while getopts "p" o; do
case "${o}" in
p) ENABLE_PUSH=true ;;
*) usage ;;
esac
done

docker_build opensuse-tw-sanitizer-base.dockerfile ci-opensuse-tw-sanitizer-base
docker_build opensuse-tw-full-stack-onbuild.dockerfile ci-opensuse-tw-full-stack-onbuild
docker_build opensuse-tw-asan.dockerfile ci-opensuse-tw-asan
docker_build opensuse-tw-msan.dockerfile ci-opensuse-tw-msan
docker_build opensuse-tw-tsan.dockerfile ci-opensuse-tw-tsan
docker_build opensuse-tw-ubsan.dockerfile ci-opensuse-tw-ubsan
20 changes: 20 additions & 0 deletions scripts/ci/images/opensuse-tw/opensuse-tw-asan.dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
FROM ghcr.io/ornladios/adios2:ci-opensuse-tw-sanitizer-base

# Install core dev packages
RUN zypper install -y --no-recommends libasan8 hdf5-devel && \
zypper clean --all

# Install ZFP
WORKDIR /opt/zfp
RUN curl -L https://github.com/LLNL/zfp/releases/download/0.5.5/zfp-0.5.5.tar.gz | tar -xvz && \
cmake -GNinja -S zfp-0.5.5 -B build \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/opt/zfp/0.5.5 \
&& \
cmake --build build && \
cmake --install build && \
rm -rf zfp-0.5.5 build
ENV PATH=/opt/zfp/0.5.5/bin:${PATH} \
LD_LIBRARY_PATH=/opt/zfp/0.5.5/lib64:${LD_LIBRARY_PATH} \
CMAKE_PREFIX_PATH=/opt/zfp/0.5.5:${CMAKE_PREFIX_PATH}
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
FROM ghcr.io/ornladios/adios2:ci-opensuse-tw-sanitizer-base

# Set up some arguments
ONBUILD ARG INSTALL_PREFIX
ONBUILD ARG TOOLCHAIN_FILE
ONBUILD ARG CFLAGS
ONBUILD ARG CXXFLAGS
ONBUILD ARG LLVM_USE_SANITIZER

ENV CC=clang
ENV CXX=clang++

# Build and install libc++
ONBUILD WORKDIR /root/llvm
ONBUILD RUN git clone --branch llvmorg-17.0.6 --depth 1 \
https://github.com/llvm/llvm-project.git source
ONBUILD RUN cmake -GNinja -B build -S source/runtimes \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} \
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \
-DLLVM_USE_SANITIZER=${LLVM_USE_SANITIZER} \
&& \
cmake --build build --target install-cxxabi install-cxx

# Copy in the toolchain
ONBUILD COPY \
${TOOLCHAIN_FILE} \
${INSTALL_PREFIX}/toolchain.cmake

# Build and install zlib
ONBUILD WORKDIR /root/zlib
ONBUILD RUN git clone --branch v1.2.11 --depth 1 \
https://github.com/madler/zlib.git source && \
cmake -GNinja -S source -B build \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=${INSTALL_PREFIX}/toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} \
&& \
cmake --build build && \
cmake --install build

# Build and install bzip2
ONBUILD WORKDIR /root/bzip2
ONBUILD RUN git clone --branch bzip2-1.0.8 --depth 1 \
https://sourceware.org/git/bzip2.git source && \
cd source && \
sed -e "s_^CC=.*\$_CC=/usr/bin/clang_" \
-e "s_^CFLAGS=.*\$_CFLAGS=-fpic -fPIC -Wall -Winline -O2 ${CFLAGS} \$(BIGFILES)_" \
-i Makefile-libbz2_so && \
make -f Makefile-libbz2_so && \
sed -e "s_^CC=.*\$_CC=/usr/bin/clang_" \
-e "s_^PREFIX=.*\$_PREFIX=${INSTALL_PREFIX}_" \
-e "s_^CFLAGS=.*\$_CFLAGS=-Wall -Winline -O2 ${CFLAGS} \$(BIGFILES)_" \
-i Makefile && \
make install && \
install libbz2.so.1.0.8 ${INSTALL_PREFIX}/lib && \
ln -s -T libbz2.so.1.0.8 ${INSTALL_PREFIX}/lib/libbz2.so.1.0 && \
ln -s -T libbz2.so.1.0 ${INSTALL_PREFIX}/lib/libbz2.so

# Build and install zeromq
ONBUILD WORKDIR /root/zeromq
ONBUILD RUN git clone --branch v4.3.2 --depth 1 \
https://github.com/zeromq/libzmq.git source && \
cmake -GNinja -S source -B build \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=${INSTALL_PREFIX}/toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} \
&& \
cmake --build build && \
cmake --install build


# Build and install libpng
ONBUILD WORKDIR /root/libpng
ONBUILD RUN git clone --branch v1.6.9 --depth 1 \
https://git.code.sf.net/p/libpng/code.git source && \
cmake -GNinja -S source -B build \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=${INSTALL_PREFIX}/toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} \
&& \
cmake --build build && \
cmake --install build

# Build and install hdf5
ONBUILD WORKDIR /root/hdf5
ONBUILD RUN git clone --branch hdf5-1_14_3 --depth=1 \
https://github.com/HDFGroup/hdf5.git source && \
cmake -GNinja -S source -B build \
-DBUILD_TESTING=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=${INSTALL_PREFIX}/toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} \
&& \
cmake --build build && \
cmake --install build

# Build and install libfabric
ONBUILD WORKDIR /root/libfabric
ONBUILD RUN mkdir -p source build && \
curl -L \
https://github.com/ofiwg/libfabric/releases/download/v1.18.1/libfabric-1.18.1.tar.bz2 | \
tar -C source -xj --strip-components=1 && \
cd build && \
../source/configure \
--prefix=${INSTALL_PREFIX} \
--disable-efa \
--disable-shm \
--disable-verbs \
CC="/usr/bin/clang ${CFLAGS} -L${INSTALL_PREFIX}/lib -Wl,-rpath,${INSTALL_PREFIX}/lib -Wno-unused-command-line-argument" \
CXX="/usr/bin/clang++ ${CXXFLAGS} -L${INSTALL_PREFIX}/lib -Wl,-rpath,${INSTALL_PREFIX}/lib -Wno-unused-command-line-argument -nostdinc++ -isystem ${INSTALL_PREFIX}/include/c++/v1 -stdlib=libc++" && \
make -j4 install

# Build and install libffi
ONBUILD WORKDIR /root/libffi
ONBUILD RUN mkdir -p source build && \
curl -L \
https://github.com/libffi/libffi/releases/download/v3.3/libffi-3.3.tar.gz | \
tar -C source -xz --strip-components=1 && \
cd build && \
../source/configure \
--prefix=${INSTALL_PREFIX} \
CC="/usr/bin/clang ${CFLAGS} -L${INSTALL_PREFIX}/lib -Wl,-rpath,${INSTALL_PREFIX}/lib -Wno-unused-command-line-argument" \
CXX="/usr/bin/clang++ ${CXXFLAGS} -L${INSTALL_PREFIX}/lib -Wl,-rpath,${INSTALL_PREFIX}/lib -Wno-unused-command-line-argument -nostdinc++ -isystem ${INSTALL_PREFIX}/include/c++/v1 -stdlib=libc++" && \
make -j4 install
9 changes: 9 additions & 0 deletions scripts/ci/images/opensuse-tw/opensuse-tw-msan.dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
ARG INSTALL_PREFIX=/opt/msan
ARG TOOLCHAIN_FILE=toolchain-msan.cmake
ARG CFLAGS="-fsanitize=memory -fsanitize-memory-track-origins"
ARG CXXFLAGS="-fsanitize=memory -fsanitize-memory-track-origins"
ARG LLVM_USE_SANITIZER=MemoryWithOrigins

FROM ghcr.io/ornladios/adios2:ci-opensuse-tw-full-stack-onbuild AS tmp-stage
FROM ghcr.io/ornladios/adios2:ci-opensuse-tw-sanitizer-base
COPY --from=tmp-stage /opt/msan/ /opt/msan/
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
FROM opensuse/tumbleweed
LABEL maintainer "Vicente Adolfo Bolea Sanchez<vicente.bolea@kitware.com>"

# Base dependencies for building ADIOS2 projects
RUN zypper refresh && \
zypper update -y && \
zypper install -y --no-recommends \
awk \
bzip2 \
gzip \
bzip3-devel \
clang17 \
cmake \
curl \
file \
gcc \
gcc-c++ \
git \
git-lfs \
hdf5-devel \
libffi-devel \
libpng16-devel \
libunwind-devel \
llvm17 \
ninja \
patch \
python3-devel \
python3-numpy \
tar \
zeromq-devel \
zlib-devel \
&& \
zypper clean --all
9 changes: 9 additions & 0 deletions scripts/ci/images/opensuse-tw/opensuse-tw-tsan.dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
ARG INSTALL_PREFIX=/opt/tsan
ARG TOOLCHAIN_FILE=toolchain-tsan.cmake
ARG CFLAGS="-fsanitize=thread"
ARG CXXFLAGS="-fsanitize=thread"
ARG LLVM_USE_SANITIZER=Thread

FROM ghcr.io/ornladios/adios2:ci-opensuse-tw-full-stack-onbuild AS tmp-stage
FROM ghcr.io/ornladios/adios2:ci-opensuse-tw-sanitizer-base
COPY --from=tmp-stage /opt/tsan/ /opt/tsan/
5 changes: 5 additions & 0 deletions scripts/ci/images/opensuse-tw/opensuse-tw-ubsan.dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
FROM ghcr.io/ornladios/adios2:ci-opensuse-tw-sanitizer-base

# Install core dev packages
RUN zypper install -y --no-recommends libubsan1 libasan8 hdf5-devel zfp-devel && \
zypper clean --all
9 changes: 9 additions & 0 deletions scripts/ci/images/opensuse-tw/toolchain-msan.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
set(_link_flags "-stdlib=libc++ -L /opt/msan/lib -lc++abi -Wl,-rpath,/opt/msan/lib -Wno-unused-command-line-argument")
set(_compile_flags "-nostdinc++ -isystem /opt/msan/include -isystem /opt/msan/include/c++/v1 -fsanitize=memory -fsanitize-memory-track-origins")
set(CMAKE_EXE_LINKER_FLAGS_INIT ${_link_flags})
set(CMAKE_SHARED_LINKER_FLAGS_INIT ${_link_flags})
set(CMAKE_C_FLAGS_INIT ${_compile_flags})
set(CMAKE_CXX_FLAGS_INIT ${_compile_flags})
set(CMAKE_PREFIX_PATH /opt/msan)
9 changes: 9 additions & 0 deletions scripts/ci/images/opensuse-tw/toolchain-tsan.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
set(_link_flags "-stdlib=libc++ -L /opt/tsan/lib -Wl,-rpath,/opt/tsan/lib -Wno-unused-command-line-argument")
set(_compile_flags "-nostdinc++ -isystem /opt/tsan/include/c++/v1 -fsanitize=thread")
set(CMAKE_EXE_LINKER_FLAGS_INIT ${_link_flags})
set(CMAKE_SHARED_LINKER_FLAGS_INIT ${_link_flags})
set(CMAKE_C_FLAGS_INIT ${_compile_flags})
set(CMAKE_CXX_FLAGS_INIT ${_compile_flags})
set(CMAKE_PREFIX_PATH /opt/tsan)

0 comments on commit 5524e5f

Please sign in to comment.