name: CI on: push: pull_request: types: [opened, reopened] defaults: run: shell: bash concurrency: ci-${{ github.ref }} jobs: CI: runs-on: ${{ matrix.os }} continue-on-error: ${{ matrix.update-api != '' }} # the current upstream API definitions are expected to fail the test strategy: fail-fast: false max-parallel: 1 matrix: os: [ ubuntu-20.04, macos-10.15 ] compiler: [ GCC, Clang ] qt-version: [ '5.12.12' ] # Not using binary values here, to make the job captions more readable e2ee: [ '', e2ee ] update-api: [ '', update-api ] sonar: [ '' ] platform: [ '' ] qt-arch: [ '' ] exclude: - os: macos-10.15 compiler: GCC - os: windows-2019 e2ee: e2ee # Not supported by the current CI script - os: macos-10.15 e2ee: e2ee # Missing OpenSSL include: - os: ubuntu-latest compiler: GCC qt-version: '5.12.12' e2ee: e2ee sonar: sonar - os: windows-2019 compiler: MSVC platform: x64 qt-version: '5.12.12' qt-arch: win64_msvc2017_64 - os: windows-2019 compiler: MSVC platform: x64 qt-version: '5.12.12' qt-arch: win64_msvc2017_64 update-api: update-api env: SONAR_SERVER_URL: 'https://sonarcloud.io' steps: - uses: actions/checkout@v2 with: fetch-depth: 0 - name: Cache Qt id: cache-qt uses: actions/cache@v2 with: path: ${{ runner.workspace }}/Qt key: ${{ runner.os }}${{ matrix.platform }}-Qt${{ matrix.qt-version }}-cache - name: Install Qt uses: jurplel/install-qt-action@v2.11.1 with: version: ${{ matrix.qt-version }} arch: ${{ matrix.qt-arch }} cached: ${{ steps.cache-qt.outputs.cache-hit }} - name: Install Ninja (macOS/Windows) if: ${{ !startsWith(matrix.os, 'ubuntu') }} uses: seanmiddleditch/gha-setup-ninja@v3 - name: Install Ninja and Valgrind (Linux) if: startsWith(matrix.os, 'ubuntu') run: | sudo apt-get -qq install ninja-build valgrind echo "VALGRIND=valgrind --tool=memcheck --leak-check=yes --gen-suppressions=all --suppressions=$GITHUB_WORKSPACE/quotest/.valgrind.supp" >>$GITHUB_ENV - name: Setup build environment run: | if [ "${{ matrix.compiler }}" == "GCC" ]; then CXX_VERSION_POSTFIX='-10' echo "CC=gcc$CXX_VERSION_POSTFIX" >>$GITHUB_ENV echo "CXX=g++$CXX_VERSION_POSTFIX" >>$GITHUB_ENV elif [[ '${{ matrix.compiler }}' == 'Clang' ]]; then if [[ '${{ runner.os }}' == 'Linux' ]]; then CXX_VERSION_POSTFIX='-11' # Do CodeQL analysis on one of Linux branches echo "CODEQL_ANALYSIS=true" >>$GITHUB_ENV fi echo "CC=clang$CXX_VERSION_POSTFIX" >>$GITHUB_ENV echo "CXX=clang++$CXX_VERSION_POSTFIX" >>$GITHUB_ENV fi if grep -q 'refs/tags' <<<'${{ github.ref }}'; then VERSION="$(git describe --tags)" elif [ '${{ github.ref }}' == 'refs/heads/master' ]; then VERSION="ci${{ github.run_number }}-$(git rev-parse --short HEAD)" else VERSION="$(git describe --all --contains)-ci${{ github.run_number }}-$(git rev-parse --short HEAD)" fi echo "QUOTEST_ORIGIN=$VERSION @ ${{ runner.os }}/${{ matrix.compiler }}" >>$GITHUB_ENV # Build libQuotient as a shared library across platforms but also # check the static configuration somewhere CMAKE_ARGS="-G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DBUILD_SHARED_LIBS=${{ runner.os == 'Linux' }} \ -DCMAKE_INSTALL_PREFIX=~/.local \ -DCMAKE_PREFIX_PATH=~/.local \ -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON" if [ -n "${{ matrix.sonar }}" ]; then mkdir -p $HOME/.sonar CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_FLAGS=--coverage" echo "COV=gcov$CXX_VERSION_POSTFIX" >>$GITHUB_ENV fi echo "CMAKE_ARGS=$CMAKE_ARGS" >>$GITHUB_ENV if [[ '${{ runner.os }}' != 'Windows' ]]; then BIN_DIR=/bin echo "LIB_PATH=$HOME/.local/lib" >>$GITHUB_ENV fi echo "BIN_DIR=$BIN_DIR" >>$GITHUB_ENV echo "~/.local$BIN_DIR" >>$GITHUB_PATH cmake -E make_directory ${{ runner.workspace }}/build echo "BUILD_PATH=${{ runner.workspace }}/build/libQuotient" >>$GITHUB_ENV - name: Setup MSVC environment uses: ilammy/msvc-dev-cmd@v1 if: matrix.compiler == 'MSVC' with: arch: ${{ matrix.platform }} - name: Download and set up Sonar Cloud tools if: matrix.sonar != '' env: SONAR_SCANNER_VERSION: 4.6.2.2472 run: | pushd $HOME/.sonar curl -sSL --remote-name-all \ $SONAR_SERVER_URL/static/cpp/build-wrapper-linux-x86.zip \ https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_VERSION-linux.zip unzip -o build-wrapper*.zip echo "BUILD_WRAPPER=$HOME/.sonar/build-wrapper-linux-x86/build-wrapper-linux* --out-dir $BUILD_PATH/sonar" >>$GITHUB_ENV unzip -o sonar-scanner-cli*.zip popd - name: Install OpenSSL if: ${{ contains(matrix.os, 'ubuntu') && matrix.e2ee }} run: | sudo apt-get install libssl-dev - name: Build and install olm if: matrix.e2ee working-directory: ${{ runner.workspace }} run: | git clone https://gitlab.matrix.org/matrix-org/olm.git cmake -S olm -B build/olm $CMAKE_ARGS cmake --build build/olm --target install echo "QUOTEST_ORIGIN=$QUOTEST_ORIGIN with E2EE" >>$GITHUB_ENV - name: Build and install QtKeychain run: | cd .. git clone https://github.com/frankosterfeld/qtkeychain.git cmake -S qtkeychain -B qtkeychain/build $CMAKE_ARGS cmake --build qtkeychain/build --target install - name: Pull CS API and build GTAD if: matrix.update-api working-directory: ${{ runner.workspace }} run: | git clone https://github.com/quotient-im/matrix-spec.git pushd matrix-spec git checkout fixcompilation popd git clone --recursive https://github.com/KitsuneRal/gtad.git cmake -S gtad -B build/gtad $CMAKE_ARGS -DBUILD_SHARED_LIBS=OFF cmake --build build/gtad echo "CMAKE_ARGS=$CMAKE_ARGS -DMATRIX_SPEC_PATH=${{ runner.workspace }}/matrix-spec \ -DGTAD_PATH=${{ runner.workspace }}/build/gtad/gtad" \ >>$GITHUB_ENV echo "QUOTEST_ORIGIN=$QUOTEST_ORIGIN with API files regeneration" >>$GITHUB_ENV - name: Initialize CodeQL tools if: env.CODEQL_ANALYSIS uses: github/codeql-action/init@v1 with: languages: cpp # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # queries: ./path/to/local/query, your-org/your-repo/queries@main - name: Configure libQuotient run: | cmake -S $GITHUB_WORKSPACE -B $BUILD_PATH $CMAKE_ARGS \ -DQuotient_ENABLE_E2EE=${{ matrix.e2ee }} -DQuotient_INSTALL_TESTS=ON - name: Regenerate API code if: matrix.update-api run: cmake --build ../build/libQuotient --target update-api - name: Build and install libQuotient run: | $BUILD_WRAPPER cmake --build $BUILD_PATH --target all cmake --build $BUILD_PATH --target install ls ~/.local$BIN_DIR/quotest - name: Run tests env: TEST_USER: ${{ secrets.TEST_USER }} TEST_PWD: ${{ secrets.TEST_PWD }} QT_LOGGING_RULES: 'quotient.main.debug=true;quotient.jobs.debug=true;quotient.events.debug=true' QT_MESSAGE_PATTERN: '%{time h:mm:ss.zzz}|%{category}|%{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}|%{message}' run: | CTEST_ARGS="--test-dir $BUILD_PATH --output-on-failure" if [[ -z '${{ matrix.e2ee }}' || '${{ runner.os }}' != 'Linux' ]]; then ctest $CTEST_ARGS -E testolmaccount else autotests/run-tests.sh $CTEST_ARGS fi [[ -z "$TEST_USER" ]] || \ LD_LIBRARY_PATH=$LIB_PATH \ $VALGRIND quotest "$TEST_USER" "$TEST_PWD" quotest-gha '#quotest:matrix.org' "$QUOTEST_ORIGIN" timeout-minutes: 4 # quotest is supposed to finish within 3 minutes, actually - name: Perform CodeQL analysis if: env.CODEQL_ANALYSIS uses: github/codeql-action/analyze@v1 - name: Run sonar-scanner if: matrix.sonar != '' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} run: | mkdir .coverage && pushd .coverage find $BUILD_PATH -name '*.gcda' -print0 \ | xargs -0 $COV -s $GITHUB_WORKSPACE -pr # Coverage of the test source code is not tracked, as it is always 100% # (if not, some tests failed and broke the build at an earlier stage) rm -f quotest* autotests* popd $HOME/.sonar/sonar-scanner*/bin/sonar-scanner \ -Dsonar.host.url="$SONAR_SERVER_URL" \ -Dsonar.cfamily.build-wrapper-output="$BUILD_PATH/sonar" \ -Dsonar.cfamily.threads=2 \ -Dsonar.cfamily.gcov.reportsPath=.coverage