Sobes.tech
Senior

Como organizar um ciclo completo de CI/CD para três equipas?

sobes.tech IA

Resposta da IA

Para organizar um ciclo completo de CI/CD para três equipas, podem ser utilizados os seguintes abordagens e ferramentas:

  1. Plataforma unificada de CI/CD: Utilização de uma plataforma centralizada, como Jenkins, GitLab CI/CD, GitHub Actions, Azure DevOps ou CircleCI. Isto permite padronizar processos, garantir transparência e gerir todos os pipelines a partir de um único local.

  2. Monorepo ou Polirepos:

    • Monorepo: Todas as equipas trabalham num mesmo repositório. Requer uma configuração mais complexa de branches e triggers para executar pipelines apenas em alterações em partes específicas do código. Facilita a gestão de dependências e versões.
    • Polirepo: Cada equipa tem os seus próprios repositórios. Facilita o isolamento, mas complica a gestão de dependências entre equipas e a padronização de processos.
  3. Padronização de processos:

    • Formato unificado de pipelines: Utilização de pipelines declarativos (Jenkinsfile, .gitlab-ci.yml, .github/workflows/*.yml) para descrever passos de CI/CD no código.
    • Bibliotecas/modelos partilhados: Criação de passos ou modelos reutilizáveis para tarefas comuns (build, testes, deploy), para reduzir duplicações e garantir coerência.
    • Sistema de controlo de versões (VCS): Uso de um VCS único (Git) com políticas claras de branching (Gitflow, Trunk-based Development).
  4. Pipeline de CI/CD:

    • CI (Integração Contínua):
      • Trigger em push para a branch de desenvolvimento (por exemplo, develop ou branches de feature).
      • Obter código fonte.
      • Compilar a aplicação (build, packaging).
      • Testes automatizados (unitários, de integração).
      • Análise de código (análise estática, revisão de padrões).
      • Criar artefacto (imagem Docker, JAR, WAR, etc.) e publicá-lo num repositório de artefactos (Nexus, Artifactory, Docker Registry).
      • Notificação de sucesso ou falha.
    • CD (Entrega/Deploy Contínuo):
      • Trigger após sucesso do CI e/ou na fusão para a branch principal (por exemplo, main/master).
      • Obter artefacto do repositório.
      • Desployar em ambiente de teste (dev/staging).
      • Testes mais aprofundados (funcionais, smoke, performance).
      • Em Entrega Contínua: parar e aguardar confirmação manual para deploy em produção.
      • Em Deploy Contínuo: deploy automático em produção após testes bem-sucedidos.
      • Uso de ferramentas de gestão de configuração e deploy (Ansible, Chef, Puppet) ou de orquestração (Kubernetes com Helm/Argo CD/Flux).
      • Verificação do estado da aplicação após deploy.
      • Rollback em caso de problemas.
  5. Ferramentas:

    • VCS: Git (GitHub, GitLab, Bitbucket).
    • Plataformas CI/CD: Jenkins, GitLab CI/CD, GitHub Actions, Azure DevOps, CircleCI.
    • Ferramentas de build: Maven, Gradle, npm, yarn, pip, Go Modules, Docker build.
    • Frameworks de teste: JUnit, TestNG, Pytest, Mocha, Jest.
    • Análise estática: SonarQube, Linters (ESLint, Pylint).
    • Repositório de artefactos: Nexus, Artifactory, Docker Registry.
    • Gestão de configuração: Ansible, Chef, Puppet.
    • Contenerização: Docker.
    • Orquestração: Kubernetes, Docker Swarm.
    • Estratégias de deploy: Blue/Green, Canary, Rolling Update.
    • Monitorização & Logging: Prometheus, Grafana, ELK Stack (Elasticsearch, Logstash, Kibana).
    • Notificações: Slack, Email, Microsoft Teams.
  6. Divisão de responsabilidades e acesso:

    • Definição clara de papéis e permissões para ferramentas e ambientes para cada equipa.
    • Uso de segredos e variáveis de ambiente para armazenamento seguro de credenciais.
  7. Feedback:

    • Integração de pipelines com sistemas de notificações e ferramentas de monitorização para que as equipas sejam rapidamente informadas de problemas.

Exemplo de estrutura de pipeline para uma equipa (com GitLab CI/CD):

# .gitlab-ci.yml
stages:
  - build
  - test
  - deploy

variables:
  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
  TEST_IMAGE: $CI_REGISTRY_IMAGE/testrunner:$CI_COMMIT_SHORT_SHA

build_job:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    # Construção da aplicação (exemplo para Java com Maven)
    # ./mvnw clean package -DskipTests
    # Construção de imagem Docker
    docker build -t $DOCKER_IMAGE .
    # Login no Docker Registry do GitLab
    docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    # Publicação da imagem Docker
    docker push $DOCKER_IMAGE
  artifacts:
    paths:
      - target/*.jar # Ou outros artefactos

test_job:
  stage: test
  image: $DOCKER_IMAGE # Usando a imagem construída ou uma de testes
  script:
    # Executar testes unitários e de integração
    # Por exemplo, para Java:
    # java -jar target/my-app.jar --run-tests
    # Para Node.js:
    # npm test
    echo "A executar testes..."
    sleep 10 # Placeholder
  needs:
    - build_job

deploy_staging_job:
  stage: deploy
  image: alpine/curl # Ou uma imagem com ferramentas de deploy
  script:
    # Deploy em ambiente de staging
    # Por exemplo, curl para API de deploy ou comando kubectl
    echo "A fazer deploy de $DOCKER_IMAGE em staging..."
    # kubectl apply -f k8s/staging.yaml --namespace <namespace-equipa>
    sleep 10 # Placeholder
  environment:
    name: staging
    url: https://staging.a-sua-aplicacao.com
  only:
    - main # Trigger em merge para main

deploy_production_job:
  stage: deploy
  image: alpine/curl # Ou uma imagem com ferramentas de deploy
  script:
    # Deploy em ambiente de produção
    echo "A fazer deploy de $DOCKER_IMAGE em produção..."
    # kubectl apply -f k8s/production.yaml --namespace <namespace-equipa>
    sleep 10 # Placeholder
  environment:
    name: produção
    url: https://a-sua-aplicacao.com
  when: manual # Confirmação manual para produção (Entrega Contínua)
  only:
    - main
  needs:
    - deploy_staging_job

Para três equipas, isto pode ser escalado criando pipelines separados (ou secções/diretórios no monorepo), possivelmente usando modelos ou bibliotecas comuns para passos repetitivos, como construção de containers ou deploy em Kubernetes. Cada equipa gere o seu código e pipelines, mas dentro de uma plataforma e padrões comuns.