DevOps & CI/CD Nathan Geeksman

GitHub Actions do zero: CI/CD para projetos PHP e Node.js

GitHub Actions do zero: CI/CD para projetos PHP e Node.js

GitHub Actions do zero: CI/CD para projetos PHP e Node.js

Introdução

O desenvolvimento de software evoluiu ao longo dos anos, trazendo melhorias significativas na produtividade e no alcance das aplicações. Entre essas inovações, destaca-se a integração contínua (CI) e entrega contínua (CD), tecnologias que permitem automação de processos de desenvolvimento, testes e implantação, aumentando a eficiência e reduzindo o risco associado à liberação de novas funcionalidades.

Nesse contexto, GitHub Actions surgiu como uma ferramenta poderosa para implementar CI/CD em projetos. Desenvolvida pela Microsoft, é uma extensão do GitHub, permitindo que os usuários criem fluxos de trabalho personalizados para automatizar tarefas, desde a execução de testes até a implantação na produção.

Este artigo visa guiar você por esse mundo de CI/CD utilizando GitHub Actions. Abordaremos as principais características da ferramenta e como ela pode ser integrada aos projetos PHP e Node.js para implementar processos de automação eficientes. Ao final, você estará capacitado a criar seu próprio pipeline de CI/CD em seus projetos utilizando GitHub Actions.

O que é e por que importa

O conceito de Integração Contínua (CI) e Entrega Contínua (CD) refere-se à automatização dos processos de desenvolvimento, testes e implantação de software, visando melhorar a eficiência e reduzir o risco associado à liberação de novas funcionalidades. A CI/CD envolve várias etapas, como:

  • Build: compilação do código-fonte em artefatos executáveis;
  • Testes: execução de testes unitários, integração e de aceite para validar a qualidade do software;
  • Implantação: desdobramento dos artefatos compilados na produção.

GitHub Actions é uma ferramenta que permite implementar essas etapas de forma automatizada. Ela se integra ao repositório Git no GitHub, permitindo que os usuários criem fluxos de trabalho personalizados para automatizar tarefas e implantação dos projetos. A motivação por trás da utilização da CI/CD é simples: aumentar a produtividade e melhorar a qualidade do software através da automação das etapas repetitivas, reduzindo ao mesmo tempo o risco associado à liberação de novas funcionalidades.

Ao implementar a CI/CD com GitHub Actions nos projetos PHP e Node.js, é possível garantir que as alterações no código sejam verificadas automaticamente antes de serem liberadas para a produção. Isso ajuda a prevenir bugs mais avançados, facilita a identificação dos problemas na fase inicial do desenvolvimento e permite que os times de desenvolvimento trabalhem de forma ágil e eficaz.

Como funciona na prática

GitHub Actions permite que os usuários definam fluxos de trabalho para automatizar as etapas de CI/CD. Aqui estão os passos envolvidos no funcionamento interno do GitHub Actions:

  • Trigger: o fluxo de trabalho é ativado quando ocorre um evento específico, como a criação de uma nova branch ou a submissão de alterações.
  • Etapas: o fluxo de trabalho é composto por etapas individuais que são executadas sequencialmente. Cada etapa pode ser uma tarefa simples, como execução de comandos no terminal, ou complexa, envolvendo a execução de scripts em linguagens de programação.
  • Execução: o GitHub Actions utiliza containers para execução das etapas do fluxo de trabalho. Isso permite que os usuários execute diferentes ambientes e configurações sem afetar a estabilidade da plataforma.
  • Dependências: as etapas do fluxo de trabalho podem ter dependências, como requisitos ou bibliotecas necessárias para execução. O GitHub Actions cuida das dependências automaticamente, garantindo que elas sejam baixadas e configuradas corretamente antes de serem utilizadas.
  • Logs: o GitHub Actions fornece logs detalhados sobre a execução do fluxo de trabalho. Isso permite aos usuários monitorar os resultados dos testes e identificar problemas rapidamente.

Com essas características, o GitHub Actions proporciona uma experiência robusta para implementação da CI/CD nos projetos PHP e Node.js, facilitando a automação das etapas repetitivas e reduzindo ao mesmo tempo o risco associado à liberação de novas funcionalidades.

Exemplo real

Vamos criar um exemplo real de como configurar o GitHub Actions para projetos PHP e Node.js.

Exemplo 1: CI/CD para projeto PHP

name: Build e Testar Projeto PHP

on:
  push:
    branches:
      - main

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout código
        uses: actions/checkout@v2
        
      - name: Instalar dependências
        run: |
          composer install
        
      - name: Executar testes
        run: |
          vendor/bin/phpunit --coverage-clover=php://stdout
            
      - name: Build e upload da aplicação
        env:
          CHOKIDAR_SKIP_VERSION_CHECK: true
        run: |
          npm install --production
          npm run build
          cd public
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
          git config --global user.name "GitHub Actions"
          git add .
          git commit -m "build da aplicação"
          git push origin master

Exemplo 2: CI/CD para projeto Node.js

name: Build e Testar Projeto Node.js

on:
  push:
    branches:
      - main

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout código
        uses: actions/checkout@v2
        
      - name: Instalar dependências
        run: |
          npm install --production
        
      - name: Executar testes
        run: |
          npm run test
            
      - name: Build e upload da aplicação
        env:
          CHOKIDAR_SKIP_VERSION_CHECK: true
        run: |
          npm install --production
          npm run build
          cd public
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
          git config --global user.name "GitHub Actions"
          git add .
          git commit -m "build da aplicação"
          git push origin master

Esses exemplos demonstram como criar fluxos de trabalho para projetos PHP e Node.js utilizando GitHub Actions. As etapas incluem a instalação de dependências, execução de testes, build da aplicação e upload para o repositório remoto.

Boas práticas

Instalar dependências corretamente

  • Sempre utilize --production ao executar npm install para garantir que as dependências sejam instaladas na configuração de produção.
  • Para evitar problemas com versões, defina a variável de ambiente CHOKIDAR_SKIP_VERSION_CHECK como verdadeira (true) antes da execução de npm install.

Executar testes adequadamente

  • Certifique-se de que os testes estão configurados para serem executados corretamente utilizando o comando npm run test.
  • Utilize ferramentas como Jest ou Mocha para escrever e executar testes unitários.
  • Considere a utilização de um proxy HTTP para acelerar a execução dos testes.

Armadilhas comuns

Problemas de autenticação

  • Ao configurar o Git no fluxo de trabalho, certifique-se de que o endereço de e-mail e nome do usuário estão corretamente definidos.
  • Utilize variáveis de ambiente para armazenar credenciais sensíveis, como chaves SSH ou tokens de acesso.

Problemas de build

  • Ao realizar a build da aplicação, certifique-se de que as dependências sejam instaladas na configuração de produção.
  • Considere utilizar uma ferramenta de build como Webpack para otimizar e minimizar o tamanho do código.

Outros problemas comuns

  • Ajuste da cache para evitar recompilações desnecessárias durante a execução dos fluxos de trabalho
  • Tratamento de erros em tempo real, evitando a interrupção da build

Conclusão

Essa abordagem de CI/CD utilizando GitHub Actions oferece uma solução escalável e eficiente para projetos PHP e Node.js, garantindo que as dependências estejam corretas, os testes sejam executados corretamente e a aplicação seja buildada e implantada no repositório remoto. Além disso, essa abordagem flexível permite ajustar o fluxo de trabalho às necessidades específicas do projeto.

Para prosseguir e aumentar ainda mais a eficiência da execução dos fluxos de trabalho, considera-se a implementação de ferramentas como um proxy HTTP para acelerar os testes ou a utilização de uma ferramenta de build como Webpack para otimizar o código.

Além disso, é recomendável que sejam estudadas outras áreas relacionadas, como:

  • Armazenamento e tratamento de dados: A implementação de uma solução de armazenamento escalável e eficiente para lidar com os dados gerados durante a execução dos fluxos de trabalho.
  • Segurança: A implementação de mecanismos de segurança para proteger o acesso aos repositórios remotos, bem como os dados gerados pelos fluxos de trabalho.

Referências

  • GitHub Actions - Como funciona? Disponível em: <https://docs.github.com/pt/actions>. Acesso: 2024.
  • CI/CD para PHP. Martin Fowler. Disponível em: <https://martinfowler.com/articles/cd-for-php.html>. Acesso: 2024.
  • Segurança em Aplicativos - OWASP. OWASP. Disponível em: <https://owasp.org/>. Acesso: 2024.
  • Best Practices for CI/CD with GitHub Actions. Thoughtworks. Disponível em: <https://www.thoughtworks.com/en-us/articles/best-practices-for-ci-cd-with-github-actions>. Acesso: 2024.
  • 12 Fatores para Desenvolvimento de Aplicativos. 12factor.net. Disponível em: <https://12factor.net/>. Acesso: 2024.