Added flow for the sanitizers build

Signed-off-by: Pratik Mankawde <pmankawde@ripple.com>
This commit is contained in:
Pratik Mankawde
2025-11-04 15:59:07 +00:00
parent f3a2ec1fb2
commit c38b5aa2d4
10 changed files with 50 additions and 5 deletions

View File

@@ -21,6 +21,11 @@ inputs:
description: "The logging verbosity."
required: false
default: "verbose"
sanitizers:
description: "The sanitizers to enable ('None', 'Address', 'Thread')."
required: true
type: string
default: "None"
runs:
using: composite
@@ -33,11 +38,13 @@ runs:
BUILD_OPTION: ${{ inputs.force_build == 'true' && '*' || 'missing' }}
BUILD_TYPE: ${{ inputs.build_type }}
LOG_VERBOSITY: ${{ inputs.log_verbosity }}
CMAKE_SANITIZERS: ${{ inputs.sanitizers }}
run: |
echo 'Installing dependencies.'
mkdir -p "${BUILD_DIR}"
cd "${BUILD_DIR}"
conan install \
--profile ci \
--output-folder . \
--build="${BUILD_OPTION}" \
--options:host='&:tests=True' \

View File

@@ -28,7 +28,7 @@ runs:
shell: bash
run: |
echo 'Installing profile.'
conan config install conan/profiles/default -tf $(conan config home)/profiles/
conan config install conan/profiles/ -tf $(conan config home)/profiles/
echo 'Conan profile:'
conan profile show

View File

@@ -30,7 +30,7 @@ We will further set additional CMake arguments as follows:
'''
def generate_strategy_matrix(all: bool, config: Config) -> list:
configurations = []
for architecture, os, build_type, cmake_args in itertools.product(config.architecture, config.os, config.build_type, config.cmake_args):
for architecture, os, build_type, cmake_args, sanitizers in itertools.product(config.architecture, config.os, config.build_type, config.cmake_args, config.sanitizers):
# The default CMake target is 'all' for Linux and MacOS and 'install'
# for Windows, but it can get overridden for certain configurations.
cmake_target = 'install' if os["distro_name"] == 'windows' else 'all'
@@ -125,6 +125,11 @@ def generate_strategy_matrix(all: bool, config: Config) -> list:
if build_type == 'Release':
cmake_args = f'{cmake_args} -Dassert=ON'
if sanitizers == 'Address':
cmake_args = f'{cmake_args} -fsanitize=address,undefined,float-divide-by-zero,unsigned-integer-overflow'
elif sanitizers == 'Thread':
cmake_args = f'{cmake_args} -fsanitize=thread,undefined,float-divide-by-zero,unsigned-integer-overflow'
# We skip all RHEL on arm64 due to a build failure that needs further
# investigation.
if os['distro_name'] == 'rhel' and architecture['platform'] == 'linux/arm64':
@@ -166,6 +171,7 @@ def generate_strategy_matrix(all: bool, config: Config) -> list:
'build_type': build_type,
'os': os,
'architecture': architecture,
'sanitizers': sanitizers
})
return configurations

View File

@@ -180,5 +180,6 @@
}
],
"build_type": ["Debug", "Release"],
"cmake_args": ["-Dunity=OFF", "-Dunity=ON"]
"cmake_args": ["-Dunity=OFF", "-Dunity=ON"],
"sanitizers": ["None", "Address", "Thread"]
}

View File

@@ -18,5 +18,6 @@
"cmake_args": [
"-Dunity=OFF -DCMAKE_POLICY_VERSION_MINIMUM=3.5",
"-Dunity=ON -DCMAKE_POLICY_VERSION_MINIMUM=3.5"
]
],
"sanitizers": ["None", "Address", "Thread"]
}

View File

@@ -15,5 +15,6 @@
}
],
"build_type": ["Debug", "Release"],
"cmake_args": ["-Dunity=OFF", "-Dunity=ON"]
"cmake_args": ["-Dunity=OFF", "-Dunity=ON"],
"sanitizers": ["None", "Address", "Thread"]
}

View File

@@ -24,6 +24,11 @@ on:
description: "The CMake target to build."
type: string
required: true
sanitizers:
description: "The sanitizers to enable ('None', 'Address', 'Thread')."
required: true
type: string
default: "None"
runs_on:
description: Runner to run the job on as a JSON string
@@ -61,6 +66,7 @@ jobs:
runs_on: ${{ inputs.runs_on }}
image: ${{ inputs.image }}
config_name: ${{ inputs.config_name }}
sanitizers: ${{ inputs.sanitizers }}
nproc_subtract: ${{ inputs.nproc_subtract }}
secrets:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

View File

@@ -23,6 +23,11 @@ on:
required: false
type: string
default: "minimal"
sanitizers:
description: "The sanitizers to enable ('None', 'Address', 'Thread')."
required: true
type: string
default: "None"
secrets:
CODECOV_TOKEN:
description: "The Codecov token to use for uploading coverage reports."
@@ -54,5 +59,6 @@ jobs:
runs_on: ${{ toJSON(matrix.architecture.runner) }}
image: ${{ contains(matrix.architecture.platform, 'linux') && format('ghcr.io/xrplf/ci/{0}-{1}:{2}-{3}-sha-{4}', matrix.os.distro_name, matrix.os.distro_version, matrix.os.compiler_name, matrix.os.compiler_version, matrix.os.image_sha) || '' }}
config_name: ${{ matrix.config_name }}
sanitizers: ${{ inputs.sanitizers }}
secrets:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

View File

@@ -19,6 +19,11 @@ on:
description: "The CMake target to build."
required: true
type: string
sanitizers:
description: "The sanitizers to enable ('None', 'Address', 'Thread')."
required: true
type: string
default: "None"
runs_on:
description: Runner to run the job on as a JSON string
@@ -85,6 +90,7 @@ jobs:
build_dir: ${{ inputs.build_dir }}
build_nproc: ${{ steps.nproc.outputs.nproc }}
build_type: ${{ inputs.build_type }}
sanitizers: ${{ inputs.sanitizers }}
# Set the verbosity to "quiet" for Windows to avoid an excessive
# amount of logs. For other OSes, the "verbose" logs are more useful.
log_verbosity: ${{ runner.os == 'Windows' && 'quiet' || 'verbose' }}

11
conan/profiles/ci Normal file
View File

@@ -0,0 +1,11 @@
include(./default)
[settings]
{% set sanitizers = os.getenv("CMAKE_SANITIZERS") %}
[conf]
{% if sanitizers == "Address" %}
tools.build:cxxflags+=['-fsanitize=address,undefined,float-divide-by-zero,unsigned-integer-overflow']
{% elif sanitizers == "Thread" %}
tools.build:cxxflags+=['-fsanitize=thread,undefined,float-divide-by-zero,unsigned-integer-overflow']
{% endif %}