CI/CD para projetos PHP: GitHub Actions
O desenvolvimento web moderno é impensável sem automação. Executar testes manualmente, verificar o estilo do código e fazer deploy no servidor consomem tempo e são propensos a erros. A solução é CI/CD (Continuous Integration / Continuous Deployment). Neste artigo, vamos analisar como configurar um pipeline completo para projetos PHP usando GitHub Actions. Você aprenderá como testar código automaticamente, verificar sua qualidade e implantar no servidor de produção a cada push no repositório.
O que é CI/CD e por que um desenvolvedor PHP precisa disso?
Continuous Integration (CI) é a prática onde cada commit é verificado automaticamente: testes unitários, linters, verificações de segurança são executados. Continuous Deployment (CD) é o próximo passo, onde o código que passou com sucesso pelo CI é automaticamente implantado no servidor (staging ou production).
Para PHP isso é especialmente relevante: a linguagem é dinâmica, erros de tipagem e sintaxe frequentemente são descobertos apenas em tempo de execução. O GitHub Actions permite configurar um pipeline que:
- Executa testes PHPUnit em diferentes versões do PHP (7.4, 8.0, 8.1, 8.2).
- Verifica o código com PHP_CodeSniffer ou PHPStan.
- Realiza deploy no servidor via SSH ou Docker.
Criando um workflow no GitHub Actions
Para começar, crie no diretório raiz do seu projeto PHP a pasta .github/workflows. Dentro dela, crie um arquivo, por exemplo ci.yml. Este será o seu pipeline.
Vamos considerar um exemplo básico para CI. Ele será executado a cada push no branch main ou ao criar um Pull Request.
name: PHP CI
on: push: branches: [ "main" ] pull_request: branches: [ "main" ]
jobs: build: runs-on: ubuntu-latest
strategy: matrix: php-versions: ['7.4', '8.0', '8.1', '8.2']
steps: - uses: actions/checkout@v3
- name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-versions }} tools: composer, phpunit
- name: Validate composer.json and composer.lock run: composer validate --strict
- name: Cache Composer packages id: composer-cache uses: actions/cache@v3 with: path: vendor key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} restore-keys: | ${{ runner.os }}-php-
- name: Install dependencies run: composer install --prefer-dist --no-progress
- name: Run PHPUnit tests run: phpunit --configuration phpunit.xmlAnálise dos pontos-chave:
- Matrix strategy — permite executar testes em várias versões do PHP simultaneamente. Isso garante a compatibilidade do código.
- shivammathur/setup-php — action popular para configurar o ambiente PHP. Ele instala a versão necessária, Composer e PHPUnit.
- Cache do vendor — acelera execuções subsequentes, evitando baixar as dependências novamente.
- composer validate — verifica a correção do composer.json.
Adicionando análise estática e linting
Testes são bons, mas não podemos prescindir do controle de qualidade do código. Vamos adicionar ao mesmo workflow (ou criar um job separado) a verificação com PHPStan e PHP_CodeSniffer.
- name: Run PHPStan run: vendor/bin/phpstan analyse src tests --level=max
- name: Run PHP_CodeSniffer run: vendor/bin/phpcs --standard=PSR2 src testsEsses passos podem ser adicionados após a instalação das dependências. O PHPStan com nível max encontrará potenciais erros de tipo, e o PHP_CodeSniffer com o padrão PSR-2 (ou PSR-12) garantirá um estilo de código uniforme. Se pelo menos um passo falhar,