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.
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.
-
Crie um arquivo
Dockerfilecontendo:- 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).
-
Crie um arquivo
docker-compose.ymlcontendo:- 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.
- Serviço
-
O ambiente deve subir corretamente com:
docker-compose up -d
-
A aplicação deve responder em:
http://localhost:8585 -
O Laravel deve conseguir se conectar ao banco via variáveis de ambiente (
.env).
Você deve criar uma pipeline automatizada que simule o fluxo de integração e deploy contínuo.
O arquivo do workflow deve ser criado em:
.github/workflows/deploy.yml
-
Checkout do repositório
- Usar a action oficial
actions/checkout@v4.
- Usar a action oficial
-
Instalação do Composer
- Executar
composer install --no-interaction --prefer-dist.
- Executar
-
Build da imagem Docker
-
Construir a imagem com:
docker build -t laravel-app .
-
-
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).
-
-
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.ymlpara 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
healthyapós o build.
-
-
Deploy simulado
-
Criar um job com o nome
deployque apenas execute:echo "Deploy realizado com sucesso!"
-
-
Disparo automático
- A pipeline deve rodar em qualquer
pushoupull_requestpara a branchmain.
- A pipeline deve rodar em qualquer
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.
Opção A — (Admin do repo/org) Desativar a exigência
- No repositório: vá em Settings → Actions → General.
- Selecione Allow all actions and reusable workflows.
- Desmarque Require actions to be pinned to a full-length commit SHA.
- 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.
Você deve criar um script backup.sh que automatize o processo de
backup do banco de dados em execução no container db.
-
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.logno diretório raiz.
-
-
O script deve ser executável:
./backup.sh
-
O backup deve funcionar enquanto o container do banco (
db) estiver rodando via Docker Compose.
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.sqldevops-challenge-schmah/
├── .github/
│ └── workflows/
│ └── deploy.yml
├── app/
│ └── ... (arquivos Laravel)
├── backup.sh
├── docker-compose.yml
├── Dockerfile
├── README.md
└── .env.example
| 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 |
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! 🚀