name: Coverage (Ubuntu) concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} cancel-in-progress: true # Coverage duplicates the Ubuntu suite to measure it rather than protect a # distinct PR failure mode. Keep that cost scheduled and available on demand. on: schedule: - cron: '42 9 * * 1' workflow_dispatch: permissions: contents: read jobs: coverage: runs-on: ubuntu-latest timeout-minutes: 45 name: gcov coverage steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: prep run: | sudo apt-get update sudo apt-get install -y acl libacl1-dev attr libattr1-dev liblz4-dev libzstd-dev libxxhash-dev python3-cmarkgfm openssl gcovr echo "/usr/local/bin" >>"$GITHUB_PATH" - name: configure run: ./configure --enable-coverage --with-rrsync - name: make run: make - name: info run: rsync --version # Two coverage runs: the default pipe transport, then a second pass over a # real loopback rsyncd (--use-tcp) which also exercises the require_tcp-only # tests. gcovr's --print-summary line/branch/decision totals go to the step # log (and the job summary below), so the numbers are visible in CI. # `make coverage` exits with the suite's status, so a regression fails CI. - name: coverage (pipe transport) run: | set -o pipefail sudo make coverage 2>&1 | tee cov-pipe.log - name: coverage (TCP transport) run: | set -o pipefail sudo make coverage-tcp 2>&1 | tee cov-tcp.log - name: coverage summary if: always() run: | { echo "## gcov coverage" echo "### Pipe transport (\`make coverage\`)" echo '```' grep -E '^(lines|functions|branches|decisions):' cov-pipe.log || echo '(no summary -- see step log)' echo '```' echo "### TCP transport (\`make coverage-tcp\`)" echo '```' grep -E '^(lines|functions|branches|decisions):' cov-tcp.log || echo '(no summary -- see step log)' echo '```' } >> "$GITHUB_STEP_SUMMARY" - name: upload HTML reports if: always() uses: actions/upload-artifact@v4 with: retention-days: 45 name: coverage-html path: | coverage coverage-tcp