# Copyright 2020-2021 Peter Dimov # Copyright 2021 Andrey Semashev # Copyright 2021 Alexander Grund # Copyright 2022 James E. King III # # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) --- name: CI on: pull_request: push: branches: - master - develop - bugfix/** - feature/** - fix/** - pr/** #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 LCOV_BRANCH_COVERAGE: 0 CODECOV_NAME: Github Actions jobs: posix: defaults: run: shell: bash strategy: fail-fast: false matrix: include: # Linux, gcc # - { compiler: gcc-7, cxxstd: '03,11,14,17', os: ubuntu-20.04, install: 'g++-7' } # - { compiler: gcc-8, cxxstd: '03,11,14,17', os: ubuntu-20.04, install: 'g++-8' } # - { compiler: gcc-9, cxxstd: '03,11,14,17', os: ubuntu-20.04, install: 'g++-9' } # - { compiler: gcc-10, cxxstd: '03,11,14,17,20', os: ubuntu-22.04, install: 'g++-10' } # - { compiler: gcc-11, cxxstd: '03,11,14,17,20', os: ubuntu-22.04, install: 'g++-11' } # - { name: "gcc-12 w/ sanitizers (03,11,14)", sanitize: yes, # compiler: gcc-12, cxxstd: '03,11,14', os: ubuntu-22.04, ccache_key: "san1" } # - { name: "gcc-12 w/ sanitizers (17,20,2b)", sanitize: yes, # compiler: gcc-12, cxxstd: '17,20,2b', os: ubuntu-22.04, ccache_key: "san2" } # - { name: Collect coverage, coverage: yes, # compiler: gcc-8, cxxstd: '03,11', os: ubuntu-20.04, install: 'g++-8-multilib', address-model: '32,64', ccache_key: "cov" } - { name: "cfoa tsan (gcc)", cxxstd: '11,14,17,20,2b', os: ubuntu-22.04, compiler: gcc-12, targets: 'libs/unordered/test//cfoa_tests', thread-sanitize: yes, ccache_key: "tsan-gcc" } # Linux, clang, libc++ # - { compiler: clang-7, cxxstd: '03,11,14,17', os: ubuntu-20.04, stdlib: libc++, install: 'clang-7 libc++-7-dev libc++abi-7-dev' } # - { compiler: clang-10, cxxstd: '03,11,14,17,20', os: ubuntu-20.04, stdlib: libc++, install: 'clang-10 libc++-10-dev libc++abi-10-dev' } # - { compiler: clang-11, cxxstd: '03,11,14,17,20', os: ubuntu-22.04, stdlib: libc++, install: 'clang-11 libc++-11-dev libc++abi-11-dev' } # clang-12 doesn't work on ubuntu-22.04, the linker can't find -lunwind for some reason # - { name: "clang-12 w/ sanitizers (03,11,14)", sanitize: yes, # compiler: clang-12, cxxstd: '03,11,14', os: ubuntu-20.04, stdlib: libc++, install: 'clang-12 libc++-12-dev libc++abi-12-dev', ccache_key: "san1" } # - { name: "clang-12 w/ sanitizers (17,20,2b)", sanitize: yes, # compiler: clang-12, cxxstd: '17,20,2b', os: ubuntu-20.04, stdlib: libc++, install: 'clang-12 libc++-12-dev libc++abi-12-dev', ccache_key: "san2" } # - { compiler: clang-13, cxxstd: '03,11,14,17,20,2b', os: ubuntu-22.04, stdlib: libc++, install: 'clang-13 libc++-13-dev libc++abi-13-dev' } # - { compiler: clang-14, cxxstd: '03,11,14,17,20,2b', os: ubuntu-22.04, stdlib: libc++, install: 'clang-14 libc++-14-dev libc++abi-14-dev' } # not using libc++ because of https://github.com/llvm/llvm-project/issues/52771 # - { name: "clang-14 w/ sanitizers (03,11,14)", sanitize: yes, # compiler: clang-14, cxxstd: '03,11,14', os: ubuntu-22.04, ccache_key: "san1" } # - { name: "clang-14 w/ sanitizers (17,20,2b)", sanitize: yes, # compiler: clang-14, cxxstd: '17,20,2b', os: ubuntu-22.04, ccache_key: "san2" } - { name: "cfoa tsan (clang)", cxxstd: '11,14,17,20,2b', os: ubuntu-22.04, compiler: clang-14, targets: 'libs/unordered/test//cfoa_tests', thread-sanitize: yes, stdlib: libc++, install: 'clang-14 libc++-14-dev libc++abi-14-dev', ccache_key: "tsan-clang" } # OSX, clang - { compiler: clang, cxxstd: '11,14', os: macos-11, ccache_key: "11-14" } - { compiler: clang, cxxstd: '17,2a', os: macos-11, ccache_key: "17-2a" } - { compiler: clang, cxxstd: '11,14', os: macos-12, sanitize: yes, ccache_key: "11-14" } - { compiler: clang, cxxstd: '17,2a', os: macos-12, sanitize: yes, ccache_key: "17-2a" } - { compiler: clang, cxxstd: '11,14', os: macos-12, thread-sanitize: yes, targets: 'libs/unordered/test//cfoa_tests', ccache_key: "tsan-macos-1" } - { compiler: clang, cxxstd: '17,2a', os: macos-12, thread-sanitize: yes, targets: 'libs/unordered/test//cfoa_tests', ccache_key: "tsan-macos-2" } timeout-minutes: 240 runs-on: ${{matrix.os}} container: ${{matrix.container}} env: {B2_USE_CCACHE: 1} 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 # Need (newer) git, and the older Ubuntu container may require requesting the key manually using port 80 apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys E1DD270288B4E6030699E45FA1715D88E1DF1F24 for i in {1..${NET_RETRY_COUNT:-3}}; do sudo -E add-apt-repository -y ppa:git-core/ppa && break || sleep 10; done apt-get -o Acquire::Retries=$NET_RETRY_COUNT update apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y g++ python libpython-dev git fi # For jobs not compatible with ccache, use "ccache: no" in the matrix if [[ "${{ matrix.ccache }}" == "no" ]]; then echo "B2_USE_CCACHE=0" >> $GITHUB_ENV fi git config --global pack.threads 0 - uses: actions/checkout@v3 with: # For coverage builds fetch the whole history, else only 1 commit using a 'fake ternary' fetch-depth: ${{ matrix.coverage && '0' || '1' }} - name: Cache ccache uses: actions/cache@v3 if: env.B2_USE_CCACHE with: path: ~/.ccache key: ${{matrix.os}}-${{matrix.container}}-${{matrix.compiler}}-${{matrix.ccache_key}}-${{github.sha}} restore-keys: ${{matrix.os}}-${{matrix.container}}-${{matrix.compiler}}-${{matrix.ccache_key}}- - name: Fetch Boost.CI uses: actions/checkout@v3 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 10 done done for source in "${SOURCES[@]}"; do for i in {1..$NET_RETRY_COUNT}; do sudo add-apt-repository $source && break || sleep 10 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="${{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 multiarch if: matrix.multiarch run: | sudo apt-get install --no-install-recommends -y binfmt-support qemu-user-static sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes git clone https://github.com/jeking3/bdde.git echo "$(pwd)/bdde/bin/linux" >> ${GITHUB_PATH} echo "BDDE_DISTRO=${{ matrix.distro }}" >> ${GITHUB_ENV} echo "BDDE_EDITION=${{ matrix.edition }}" >> ${GITHUB_ENV} echo "BDDE_ARCH=${{ matrix.arch }}" >> ${GITHUB_ENV} echo "B2_WRAPPER=bdde" >> ${GITHUB_ENV} - name: Setup Boost env: B2_ADDRESS_MODEL: ${{matrix.address-model}} B2_COMPILER: ${{matrix.compiler}} B2_CXXSTD: ${{matrix.cxxstd}} B2_SANITIZE: ${{matrix.sanitize}} B2_TSAN: ${{matrix.thread-sanitize}} B2_TARGETS: ${{matrix.targets}} B2_STDLIB: ${{matrix.stdlib}} # More entries can be added in the same way, see the B2_ARGS assignment in ci/enforce.sh for the possible keys. # B2_DEFINES: ${{matrix.defines}} # Variables set here (to non-empty) will override the top-level environment variables, e.g. # B2_VARIANT: ${{matrix.variant}} run: source ci/github/install.sh - name: Setup coverage collection if: matrix.coverage run: ci/github/codecov.sh "setup" - name: Run tests if: '!matrix.coverity' run: B2_TARGETS=${{matrix.targets}} B2_FLAGS='-l 3600' ci/build.sh - name: Upload coverage if: matrix.coverage run: ci/codecov.sh "upload" - name: Run coverity if: matrix.coverity && github.event_name == 'push' && (github.ref_name == 'develop' || github.ref_name == 'master') run: ci/github/coverity.sh env: COVERITY_SCAN_NOTIFICATION_EMAIL: ${{ secrets.COVERITY_SCAN_NOTIFICATION_EMAIL }} COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}