Skip to content

Commit

Permalink
Use Boost.CI for testing on GHA
Browse files Browse the repository at this point in the history
  • Loading branch information
Flamefire committed Nov 17, 2021
1 parent 3f16ee6 commit 20f0bf7
Show file tree
Hide file tree
Showing 11 changed files with 378 additions and 242 deletions.
2 changes: 1 addition & 1 deletion .appveyor.yml
Expand Up @@ -167,7 +167,7 @@ for:
# Build consumer example test
- cmake --build . --config %configuration% --target install
- del /F /S /Q *
- cmake ../test/exampleProject -G "%GENERATOR%" -DCMAKE_PREFIX_PATH=%APPVEYOR_BUILD_FOLDER%\installed
- cmake -DBOOST_NOWIDE_INSTALL_TEST=ON -G "%GENERATOR%" -DCMAKE_PREFIX_PATH=%APPVEYOR_BUILD_FOLDER%\installed ../test/cmake_test
- cmake --build . --config %configuration%
- ctest --output-on-failure -C %configuration% --parallel 4
# Superproject CMake build
Expand Down
15 changes: 8 additions & 7 deletions .github/codecov.sh
Expand Up @@ -8,19 +8,20 @@
# Bash script to run on Github Actions to perform codecov.io integration
#

# assumes an environment variable $LIBRARY set to the boost project name
# assumes an environment variable $SELF set to the boost project name
# and BOOST_ROOT to be set

set -eux

if [[ "$1" == "setup" ]]; then
echo "B2_VARIANT=debug" >> "$GITHUB_ENV"
echo 'B2_FLAGS=cxxflags="-fkeep-inline-functions -fkeep-static-functions --coverage" linkflags=--coverage' >> "$GITHUB_ENV"
echo "B2_CXXFLAGS=${B2_CXXFLAGS:+$B2_CXXFLAGS }-fkeep-inline-functions -fkeep-static-functions --coverage" >> "$GITHUB_ENV"
echo "B2_LINKFLAGS=${B2_LINKFLAGS:+$B2_LINKFLAGS }--coverage" >> "$GITHUB_ENV"
else
ver=7 # default
if [ "${B2_COMPILER%%-*}" == "g++" ]; then
if [[ "$B2_COMPILER" =~ g\+\+- ]]; then
ver="${B2_COMPILER##*g++-}"
if [ "${B2_TOOLSET%%-*}" == "gcc" ]; then
if [[ "$B2_TOOLSET" =~ gcc- ]]; then
ver="${B2_TOOLSET##*gcc-}"
fi
fi
GCOV=gcov-${ver}
Expand All @@ -38,7 +39,7 @@ else
cd "$GITHUB_WORKSPACE"
: "${LCOV_BRANCH_COVERAGE:=1}" # Set default

lcov --gcov-tool="$GCOV" --rc lcov_branch_coverage=${LCOV_BRANCH_COVERAGE} --base-directory "$BOOST_ROOT/libs/$LIBRARY" --directory "$BOOST_ROOT" --capture --output-file all.info
lcov --gcov-tool="$GCOV" --rc lcov_branch_coverage=${LCOV_BRANCH_COVERAGE} --base-directory "$BOOST_ROOT/libs/$SELF" --directory "$BOOST_ROOT" --capture --output-file all.info
# dump a summary on the console
lcov --gcov-tool="$GCOV" --rc lcov_branch_coverage=${LCOV_BRANCH_COVERAGE} --list all.info

Expand All @@ -47,7 +48,7 @@ else
for f in $(for f2 in include/boost/*; do echo "$f2"; done | cut -f2- -d/); do echo "*/$f*"; done > /tmp/interesting
echo headers that matter:
cat /tmp/interesting
xargs -L 999999 -a /tmp/interesting lcov --gcov-tool="$GCOV" --rc lcov_branch_coverage=${LCOV_BRANCH_COVERAGE} --extract all.info {} "*/libs/$LIBRARY/*" --output-file coverage.info
xargs -L 999999 -a /tmp/interesting lcov --gcov-tool="$GCOV" --rc lcov_branch_coverage=${LCOV_BRANCH_COVERAGE} --extract all.info {} "*/libs/$SELF/*" --output-file coverage.info

# dump a summary on the console - helps us identify problems in pathing
lcov --gcov-tool="$GCOV" --rc lcov_branch_coverage=${LCOV_BRANCH_COVERAGE} --list coverage.info
Expand Down
39 changes: 39 additions & 0 deletions .github/install.sh
@@ -0,0 +1,39 @@
#! /bin/bash
#
# Copyright 2021 Alexander Grund
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
#
# Executes the install phase for GHA

set -ex

export SELF="${GITHUB_REPOSITORY#*/}"
export BOOST_CI_TARGET_BRANCH="${GITHUB_BASE_REF:-$GITHUB_REF}"
export BOOST_CI_SRC_FOLDER="$GITHUB_WORKSPACE"

echo "SELF=$SELF" >> $GITHUB_ENV
echo "BOOST_CI_TARGET_BRANCH=$BOOST_CI_TARGET_BRANCH" >> $GITHUB_ENV
echo "BOOST_CI_SRC_FOLDER=BOOST_CI_SRC_FOLDER" >> $GITHUB_ENV

if [[ "$B2_TOOLSET" == clang-* ]]; then
llvmPath="/usr/lib/llvm-${B2_TOOLSET#*-}/bin"
echo "$llvmPath" >> $GITHUB_PATH
fi

. ci/common_install.sh
echo "BOOST_ROOT=$BOOST_ROOT" >> $GITHUB_ENV

$B2_TOOLSET --version
echo "B2_TOOLSET=$B2_TOOLSET" >> $GITHUB_ENV
echo "B2_CXXSTD=$B2_CXXSTD" >> $GITHUB_ENV
echo "B2_LINKFLAGS=$B2_LINKFLAGS" >> $GITHUB_ENV
if [[ "$B2_SANITIZE" == "yes" ]]; then
echo "B2_ASAN=1" >> $GITHUB_ENV
echo "B2_UBSAN=1" >> $GITHUB_ENV
if [[ -f $BOOST_CI_SRC_FOLDER/ubsan-blacklist ]]; then
echo "B2_CXXFLAGS=-fsanitize-blacklist=libs/$SELF/ubsan-blacklist" >> $GITHUB_ENV
fi
fi

246 changes: 246 additions & 0 deletions .github/workflows/ci.yml
@@ -0,0 +1,246 @@
# Copyright 2019 - 2021 Alexander Grund
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE or copy at http://boost.org/LICENSE_1_0.txt)

name: CI

on:
pull_request:
push:
branches:
- master
- develop
- feature/**

concurrency:
group: ${{format('{0}:{1}', github.repository, github.ref)}}
cancel-in-progress: true

env:
GIT_FETCH_JOBS: 8
NET_RETRY_COUNT: 5
B2_CI_VERSION: 1
B2_VARIANT: debug,release
B2_LINK: shared,static
LCOV_BRANCH_COVERAGE: 0

jobs:
posix:
defaults:
run:
shell: bash

strategy:
fail-fast: false
matrix:
include:
# Linux, gcc
- { compiler: gcc-4.4, cxxstd: '98,0x', os: ubuntu-20.04, container: 'ubuntu:16.04' }
- { compiler: gcc-4.6, cxxstd: '03,0x', os: ubuntu-20.04, container: 'ubuntu:16.04' }
- { compiler: gcc-4.7, cxxstd: '03,11', os: ubuntu-20.04, container: 'ubuntu:16.04' }
- { compiler: gcc-4.8, cxxstd: '03,11', os: ubuntu-18.04 }
- { compiler: gcc-4.9, cxxstd: '03,11', os: ubuntu-20.04, container: 'ubuntu:16.04' }
- { compiler: gcc-5, cxxstd: '03,11,14,1z', os: ubuntu-18.04 }
- { compiler: gcc-6, cxxstd: '03,11,14,17', os: ubuntu-18.04 }
- { compiler: gcc-7, cxxstd: '03,11,14,17', os: ubuntu-18.04 }
- { compiler: gcc-8, cxxstd: '03,11,14,17,2a', os: ubuntu-18.04 }
- { compiler: gcc-9, cxxstd: '03,11,14,17,2a', os: ubuntu-18.04 }
- { compiler: gcc-10, cxxstd: '03,11,14,17,20', os: ubuntu-20.04 }
- { compiler: gcc-11, cxxstd: '03,11,14,17,20', os: ubuntu-20.04 }
- { name: GCC w/ sanitizers, sanitize: yes,
compiler: gcc-11, cxxstd: '03,11,14,17,20', os: ubuntu-20.04 }
- { name: Collect coverage, coverage: yes,
compiler: gcc-8, cxxstd: '03,11', os: ubuntu-20.04 }

# Linux, clang
- { compiler: clang-3.5, cxxstd: '03,11', os: ubuntu-20.04, container: 'ubuntu:16.04' }
- { compiler: clang-3.6, cxxstd: '03,11,14', os: ubuntu-20.04, container: 'ubuntu:16.04' }
- { compiler: clang-3.7, cxxstd: '03,11,14', os: ubuntu-20.04, container: 'ubuntu:16.04' }
- { compiler: clang-3.8, cxxstd: '03,11,14', os: ubuntu-20.04, container: 'ubuntu:16.04' }
- { compiler: clang-3.9, cxxstd: '03,11,14', os: ubuntu-18.04 }
- { compiler: clang-4.0, cxxstd: '03,11,14', os: ubuntu-18.04 }
- { compiler: clang-5.0, cxxstd: '03,11,14,1z', os: ubuntu-18.04 }
- { compiler: clang-6.0, cxxstd: '03,11,14,17', os: ubuntu-18.04 }
- { compiler: clang-7, cxxstd: '03,11,14,17', os: ubuntu-18.04 }
# Note: clang-8 does not fully support C++20, so it is not compatible with some libstdc++ versions in this mode
- { compiler: clang-8, cxxstd: '03,11,14,17,2a', os: ubuntu-18.04, install: [ clang-8, g++-7 ], gcc_toolchain: 7 }
- { compiler: clang-9, cxxstd: '03,11,14,17,2a', os: ubuntu-20.04 }
- { compiler: clang-10, cxxstd: '03,11,14,17,20', os: ubuntu-20.04 }
- { compiler: clang-11, cxxstd: '03,11,14,17,20', os: ubuntu-20.04 }
- { compiler: clang-12, cxxstd: '03,11,14,17,20', os: ubuntu-20.04 }
# libc++
- { compiler: clang-6.0, cxxstd: '03,11,14', os: ubuntu-18.04, install: [clang-6.0 libc++-dev libc++-helpers], env: {B2_STDLIB: libc++} }
- { compiler: clang-12, cxxstd: '03,11,14,17,20', os: ubuntu-20.04, install: [clang-12, libc++-12-dev, libc++abi-12-dev], env: {B2_STDLIB: libc++ } }
- { name: Clang w/ sanitizers, sanitize: yes,
compiler: clang-12, cxxstd: '03,11,14,17,20', os: ubuntu-20.04, install: [clang-12, libc++-12-dev, libc++abi-12-dev], env: {B2_STDLIB: libc++ } }

# OSX, clang
- { compiler: clang, cxxstd: '03,11,14,17,2a', os: macos-10.15, sanitize: yes }

timeout-minutes: 120
runs-on: ${{matrix.os}}
container: ${{matrix.container}}

steps:
- name: Setup environment
run: |
if [ -f "/etc/debian_version" ]; then
echo "DEBIAN_FRONTEND=noninteractive" >> $GITHUB_ENV
export DEBIAN_FRONTEND=noninteractive
fi
if [ -n "${{matrix.container}}" ] && [ -f "/etc/debian_version" ]; then
apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y sudo software-properties-common build-essential g++ python libpython-dev
# Need newer git
add-apt-repository ppa:git-core/ppa
apt-get -o Acquire::Retries=$NET_RETRY_COUNT update && apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y git
fi
git config --global pack.threads 0
- uses: actions/checkout@v2
if: '!matrix.coverage'
- uses: actions/checkout@v2
if: 'matrix.coverage'
with:
fetch-depth: 0

- name: Fetch Boost.CI
uses: actions/checkout@v2
with:
repository: boostorg/boost-ci
ref: master
path: boost-ci-cloned
- name: Get CI scripts folder
run: |
# Copy ci folder if not testing Boost.CI
[[ "$GITHUB_REPOSITORY" =~ "boost-ci" ]] || cp -r boost-ci-cloned/ci .
rm -rf boost-ci-cloned
- name: Install packages
if: startsWith(matrix.os, 'ubuntu')
run: |
SOURCE_KEYS=(${{join(matrix.source_keys, ' ')}})
SOURCES=(${{join(matrix.sources, ' ')}})
# Add this by default
SOURCES+=(ppa:ubuntu-toolchain-r/test)
for key in "${SOURCE_KEYS[@]}"; do
for i in {1..$NET_RETRY_COUNT}; do
wget -O - "$key" | sudo apt-key add - && break || sleep 2
done
done
for source in "${SOURCES[@]}"; do
for i in {1..$NET_RETRY_COUNT}; do
sudo add-apt-repository $source && break || sleep 2
done
done
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
if [[ -z "${{matrix.install}}" ]]; then
pkgs="${{matrix.compiler}}"
pkgs="${pkgs/gcc-/g++-}"
else
pkgs="${{join(matrix.install, ' ')}}"
fi
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y $pkgs
- name: Setup GCC Toolchain
if: matrix.gcc_toolchain
run: |
GCC_TOOLCHAIN_ROOT="$HOME/gcc-toolchain"
echo "GCC_TOOLCHAIN_ROOT=$GCC_TOOLCHAIN_ROOT" >> $GITHUB_ENV
MULTIARCH_TRIPLET="$(dpkg-architecture -qDEB_HOST_MULTIARCH)"
mkdir -p "$GCC_TOOLCHAIN_ROOT"
ln -s /usr/include "$GCC_TOOLCHAIN_ROOT/include"
ln -s /usr/bin "$GCC_TOOLCHAIN_ROOT/bin"
mkdir -p "$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET"
ln -s "/usr/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}" "$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}"
- name: Setup Boost
env:
B2_COMPILER: ${{matrix.compiler}}
B2_CXXSTD: ${{matrix.cxxstd}}
B2_SANITIZE: ${{matrix.sanitize}}
run: source ci/github/install.sh

- name: Setup coverage collection
if: matrix.coverage
run: ci/github/codecov.sh "setup"

- name: Run tests
run: ci/build.sh

- name: Run tests with simulated no LFS support
env:
B2_DEFINES: BOOST_NOWIDE_NO_LFS
run: ci/build.sh

- name: Upload coverage
if: matrix.coverage
run: ci/codecov.sh "upload"

CMake:
defaults:
run:
shell: bash

strategy:
fail-fast: false
matrix:
include:
- { os: ubuntu-20.04, build_shared: ON, build_type: Debug, generator: 'Unix Makefiles' }
- { os: ubuntu-20.04, build_shared: OFF, build_type: Debug, generator: 'Unix Makefiles' }
- { os: windows-2019, build_shared: ON, build_type: Debug, generator: 'Visual Studio 16 2019' }
- { os: windows-2019, build_shared: OFF, build_type: Debug, generator: 'Visual Studio 16 2019' }

timeout-minutes: 120
runs-on: ${{matrix.os}}

steps:
- uses: actions/checkout@v2
- name: Fetch Boost.CI
uses: actions/checkout@v2
with:
repository: boostorg/boost-ci
ref: master
path: boost-ci-cloned
- name: Get CI scripts folder
run: |
# Copy ci folder if not testing Boost.CI
[[ "$GITHUB_REPOSITORY" =~ "boost-ci" ]] || cp -r boost-ci-cloned/ci .
rm -rf boost-ci-cloned
- name: Setup Boost
env: {B2_DONT_BOOTSTRAP: 1}
run: source ci/github/install.sh

- name: Run CMake tests
working-directory: ${{env.BOOST_ROOT}}
run: |
mkdir __build_cmake_test__ && cd __build_cmake_test__
cmake -G "${matrix.generator}" -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DBUILD_TESTING=ON -DBoost_VERBOSE=ON ..
cmake --build . --target tests --config ${{matrix.build_type}}
ctest --output-on-failure --build-config ${{matrix.build_type}}
- name: Run CMake subdir tests
run: |
cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_test" # New unified folder
[ -d "$cmake_test_folder" ] || cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_subdir_test"
cd "$cmake_test_folder"
mkdir __build_cmake_subdir_test__ && cd __build_cmake_subdir_test__
cmake -G "${matrix.generator}" -DBOOST_CI_INSTALL_TEST=OFF -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} ..
cmake --build . --config ${{matrix.build_type}}
ctest --output-on-failure --build-config ${{matrix.build_type}}
- name: Install Library
working-directory: ${{env.BOOST_ROOT}}
run: |
mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__
cmake -G "${matrix.generator}" -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_INSTALL_PREFIX=~/.local -DBoost_VERBOSE=ON -DBoost_DEBUG=ON ..
cmake --build . --target install --config ${{matrix.build_type}}
- name: Run CMake install tests
run: |
cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_test" # New unified folder
[ -d "$cmake_test_folder" ] || cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_install_test"
cd "$cmake_test_folder"
mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__
cmake -G "${matrix.generator}" -DBOOST_CI_INSTALL_TEST=ON -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_PREFIX_PATH=~/.local ..
cmake --build . --config ${{matrix.build_type}}
ctest --output-on-failure --build-config ${{matrix.build_type}}

0 comments on commit 20f0bf7

Please sign in to comment.