GitHub Actions
Nenhuma extensão é necessária no runner: o Sonda vem com o composer install, e coverage: none
deixa o Xdebug e o PCOV fora do caminho.
O workflow
name: coverage
on:
pull_request:
jobs:
coverage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # the whole history, so Sonda finds the merge-base with the base branch
- uses: shivammathur/setup-php@v2
with:
php-version: '8.4'
coverage: none # no Xdebug, no PCOV: Sonda instruments the source
- run: composer install --prefer-dist --no-progress --no-interaction
- run: vendor/bin/sonda test --changed=origin/${{ github.base_ref }} --html=coverage/html
- uses: actions/upload-artifact@v4
if: always()
with:
name: coverage-html
path: coverage/html
O que cada peça faz:
fetch-depth: 0busca a história inteira, para--changed=origin/<branch base>achar omerge-baseentre o PR e a base dele e fazer o diff a partir dali: arquivos do<source>commitados, modificados e novos. Com o checkout raso padrão não há história em comum; aí passe o próprio commit da base (--changed=${{ github.event.pull_request.base.sha }}) depois de buscá-lo.coverage: nonenosetup-phpdeixa o Xdebug e o PCOV desligados. O Sonda não precisa deles, e um Xdebug carregado em modo de cobertura só deixaria a suíte mais lenta.--changedmede só os arquivos que o PR mudou e reprova o job quando uma linha alterada ou um método tocado fica descoberto; arquivo novo é cobrado inteiro. A saída lista o que falta. Veja Só o que mudou.--htmlgrava o relatório;if: always()o envia também quando o job falhou, que é quando ele importa.
Para um piso no projeto inteiro, acrescente --min-lines=<n> --min-branches=<n>; para rodar só os
testes que executam o que mudou, acrescente --affected --map=.sonda/tests.map e guarde o
.sonda/tests.map com actions/cache entre as rodadas. Veja
Só os testes afetados.
Clover para outras ferramentas
Serviços que leem Clover (Codecov, Coveralls e afins) recebem --clover=coverage/clover.xml da
mesma rodada; --cov=<arquivo> grava o formato próprio do php-code-coverage, que serve a qualquer
outro.