Skip to content

leogildo10/desafio_devops

Repository files navigation

🧩 Desafio Técnico - DevOps Engineer

🎯 Objetivo

Este desafio tem como objetivo avaliar suas habilidades práticas em Docker, CI/CD (GitHub Actions), automação e boas práticas DevOps.

Qualquer dúvida pode ser encaminhada para o lider têcnico ou para o recrutador responsável que você estiver em contato!

Você deve preparar um ambiente containerizado para uma aplicação Laravel, configurar um pipeline CI/CD automatizado, e criar um script de backup de banco de dados.


⚙️ 1. Configuração e Containerização

A aplicação base é um projeto Laravel simples, você pode desenvolver ou reutilizar um projeto que atenda as necessidades do desafio. Contará como ponto positivo se o código tiver sido desenvolvido por você.

Sua tarefa é containerizar a aplicação e configurar um ambiente local funcional.

🔧 Requisitos obrigatórios

  1. Crie um arquivo Dockerfile contendo:

    • Base PHP 8.3+ com suporte ao Laravel;
    • Composer instalado;
    • Extensões necessárias (pdo, pdo_mysql, etc.);
    • Uso de usuário não-root;
    • Boas práticas (multi-stage build opcional, .dockerignore, cache otimizado).
  2. Crie um arquivo docker-compose.yml contendo:

    • Serviço laravel-app: aplicação Laravel.
    • Serviço app-db: banco de dados (MySQL 8 ou PostgreSQL, você escolhe).
    • Serviço nginx: para servir a aplicação php.
  3. O ambiente deve subir corretamente com:

    docker-compose up -d
  4. A aplicação deve responder em:

    http://localhost:8585
    
  5. O Laravel deve conseguir se conectar ao banco via variáveis de ambiente (.env).


🧱 2. Pipeline CI/CD (GitHub Actions)

Você deve criar uma pipeline automatizada que simule o fluxo de integração e deploy contínuo.

📂 Estrutura

O arquivo do workflow deve ser criado em:

.github/workflows/deploy.yml

🧩 Etapas obrigatórias do pipeline

  1. Checkout do repositório

    • Usar a action oficial actions/checkout@v4.
  2. Instalação do Composer

    • Executar composer install --no-interaction --prefer-dist.
  3. Build da imagem Docker

    • Construir a imagem com:

      docker build -t laravel-app .
  4. Testes simples

    • Executar um comando de teste, como:

      php artisan test || php artisan --version

      (pode ser apenas uma simulação, caso o projeto não tenha testes).

  5. Healthcheck da aplicação (usando rota /up)

    • O Laravel possui uma rota nativa de verificação de status:

      /up
      
    • Configure um healthcheck no docker-compose.yml para validar se a aplicação está online, por exemplo:

      healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost:8585/up"]
        interval: 30s
        timeout: 10s
        retries: 3
    • O container da aplicação deve atingir o estado healthy após o build.

  6. Deploy simulado

    • Criar um job com o nome deploy que apenas execute:

      echo "Deploy realizado com sucesso!"
  7. Disparo automático

    • A pipeline deve rodar em qualquer push ou pull_request para a branch main.

⚠️ Erro comum no GitHub Actions: “actions must be pinned to a full-length commit SHA”

Alguns repositórios/organizações possuem política de segurança que exige pinagem por SHA completo para todas as GitHub Actions. Nesses casos, o workflow pode falhar com: Error: The action actions/checkout@v4 is not allowed ... because all actions must be pinned to a full-length commit SHA.

💡 Como resolver

Opção A — (Admin do repo/org) Desativar a exigência

  1. No repositório: vá em Settings → Actions → General.
  2. Selecione Allow all actions and reusable workflows.
  3. Desmarque Require actions to be pinned to a full-length commit SHA.
  4. Clique Save.

Se a opção estiver cinza/forçada, a organização aplica essa política globalmente. Um admin da organização deve ajustar em Organization Settings → Actions → Policies.


🧰 3. Script de Backup do Banco de Dados

Você deve criar um script backup.sh que automatize o processo de backup do banco de dados em execução no container db.

🧩 Requisitos obrigatórios

  1. O script deve:

    • Gerar um dump completo do banco de dados;

    • Armazenar o arquivo no diretório backups/;

    • Nomear o arquivo com a data/hora no formato:

      backup-YYYYMMDD_HHMMSS.sql
      
    • Registrar logs de execução em um arquivo backup.log no diretório raiz.

  2. O script deve ser executável:

    ./backup.sh
  3. O backup deve funcionar enquanto o container do banco (db) estiver rodando via Docker Compose.

💡 Dica

Use o comando docker exec para acessar o container do banco e gerar o dump. Por exemplo, se estiver usando MySQL:

docker exec laravel_db mysqldump -u root -proot laravel > backups/backup-20251007_120000.sql

📦 4. Estrutura esperada do repositório

devops-challenge-schmah/
├── .github/
│   └── workflows/
│       └── deploy.yml
├── app/
│   └── ... (arquivos Laravel)
├── backup.sh
├── docker-compose.yml
├── Dockerfile
├── README.md
└── .env.example

✅ 5. Critérios de Avaliação

Critério Descrição
Organização e clareza Estrutura e documentação no README
Dockerização Uso de boas práticas, variáveis, multi-stage build
CI/CD Pipeline funcional e bem estruturado
Automação Script de backup correto e legível
Boas práticas Segurança, versionamento, clareza, usuário não-root

🧭 6. Entrega

Você deve entregar um repositório público no GitHub contendo todos os arquivos listados.

Exemplo de comando final esperado do pipeline:

Deploy realizado com sucesso!

Boa sorte! 🚀

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors