{"id":29090810,"url":"https://github.com/mulliru/challenge_2025_odontoprev_devops_backup","last_synced_at":"2025-07-06T20:07:48.300Z","repository":{"id":294811663,"uuid":"988147824","full_name":"mulliru/Challenge_2025_OdontoPrev_Devops_Backup","owner":"mulliru","description":null,"archived":false,"fork":false,"pushed_at":"2025-05-22T06:20:25.000Z","size":11806,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-28T07:55:40.256Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mulliru.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-22T06:01:41.000Z","updated_at":"2025-05-22T06:20:29.000Z","dependencies_parsed_at":"2025-05-22T07:39:02.035Z","dependency_job_id":null,"html_url":"https://github.com/mulliru/Challenge_2025_OdontoPrev_Devops_Backup","commit_stats":null,"previous_names":["mulliru/challenge_2025_odontoprev_devops_backup"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mulliru/Challenge_2025_OdontoPrev_Devops_Backup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mulliru%2FChallenge_2025_OdontoPrev_Devops_Backup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mulliru%2FChallenge_2025_OdontoPrev_Devops_Backup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mulliru%2FChallenge_2025_OdontoPrev_Devops_Backup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mulliru%2FChallenge_2025_OdontoPrev_Devops_Backup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mulliru","download_url":"https://codeload.github.com/mulliru/Challenge_2025_OdontoPrev_Devops_Backup/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mulliru%2FChallenge_2025_OdontoPrev_Devops_Backup/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263966169,"owners_count":23536814,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-28T05:37:51.099Z","updated_at":"2025-07-06T20:07:48.295Z","avatar_url":"https://github.com/mulliru.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Challenge DevOps - OdontoPrev\n\n## Integrantes\n\n- **Murilo Ferreira Ramos** - RM553315  \n- **Pedro Luiz Prado** - RM553874  \n- **William Kenzo Hayashi** - RM552659\n\n---\n\n## Distribuição de Atividades\n\nA divisão das atividades foi realizada conforme as disciplinas da grade curricular:\n\n- **Murilo**: DevOps Tools, Cloud Computing, Compliance, Quality Assurance, e Tests.\n- **Pedro**: Mobile Application Development, e Advanced Business Development With .NET, Disruptive Architectures IoT, IOB, Generative AI\n- **William**: Java Advanced, Mastering Relational e Non-Relational Database\n\n---\n\n\n## Link do Vídeo de Apresentação\n\n- [Link do Vídeo no YouTube](https://www.youtube.com/watch?v=60iEipKjBGI)\n\n---\n\n## Documentação Completa\n\nA documentação técnica detalhada do projeto, incluindo arquitetura, banco de dados, fluxos de requisição e prints está disponível na pasta [`docs`](docs/).\n\n---\n\n## 🌐 Aplicação em Produção (Azure Web App)\n\nA aplicação está publicada e acessível pelo link:  \n🔗 [`https://app-odontoprev-python-rm553315.azurewebsites.net/`](https://app-odontoprev-python-rm553315.azurewebsites.net/)\n\n---\n\n## 🚀 Pipeline CI/CD (Azure DevOps)\n\nUtilizamos o Azure DevOps com duas pipelines:\n\n- **CI (Continuous Integration)**: Executa testes com `pytest` a cada commit na `main`.\n- **CD (Continuous Deployment)**: Realiza o deploy automático no Azure App Service.\n\nArquivos usados:\n- `azure-pipelines.yml`: Pipeline completa de CI/CD. Faz build da imagem Docker, push no ACR, cria infraestrutura e publica a aplicação.\n- `azure-deploy.yml`: Pipeline de deploy manual. Cria infraestrutura e realiza o deploy de uma imagem Docker existente no ACR.\n\n\n## ☁️ Infraestrutura como Código (IaC)\n\nToda a infraestrutura necessária para a aplicação é provisionada automaticamente via pipeline de deploy (CD), utilizando comandos `Azure CLI` no próprio `azure-pipelines.yml`.\n\nA infraestrutura criada inclui:\n- Resource Group (`rg-appinfra-553315`)\n- Azure Container Registry (ACR) (`acrsqldbrm553315`)\n- Azure App Service Plan (`plan-odontoprev-python-553315`)\n- Web App Linux com Docker Container (`app-odontoprev-python-rm553315`)\n\nA imagem Docker é gerada, enviada ao ACR e referenciada automaticamente no App Service, conectando-se ao banco SQL já existente no resource group externo.\n\n## 🔐 Variáveis de Ambiente\n\nA aplicação é configurada com variáveis de ambiente no Azure App Service, como:\n\n- `WEBSITES_PORT=8000`  \n- `DB_HOST=servidor-sqldb-rm553315.database.windows.net`  \n- `DB_NAME=db-odontoprev-553315`  \n- `DB_USER=adm-sqldb-dimdim`  \n- `DB_PASS=[armazenada de forma segura na pipeline]`\n\nEssas variáveis são aplicadas automaticamente durante o processo de deploy.\n\n\n## 🛠️ Desenho da Pipeline\n\n![Desenho da pipeline](docs/Imagens/Sprint_4/DiagramaFinalNoturno.drawio.png)\n\n---\n\n## Como Rodar à pipeline\n\nPara rodar à pipeline de CI e de CD é necessário fazer um commit no repositório: [`Link do repositório no github`](https://github.com/mulliru/Challenge_2025_OdontoPrev_Devops) dentro da branch main e o GitHub Actions irá executar à pipeline. Para executar manualmente à pipeline é necessário acessar o portal do Azure e ir até à pipeline uma das pipelines criadas e clicar em \"Run\" e observar o processo.\n\nPipeline de CI sendo executada com sucesso ![Pipeline CI rodando](docs/Imagens/Sprint_4/pipelineCi.png)\n\nPipeline de CD sendo executada com sucesso ![Pipeline CD rodando](./docs/Imagens/Sprint_4/pipelineCD.png)\n\n\n## Como realizar os Testes \n\nPara realizar os testes, é possível utilizar as pipelines que executam o pytest, ou rodar os testes diretamente no terminal utilizando o comando pytest dentro da pasta de testes do projeto [`test`](DevOps_Entrega3/tests/) isso iniciará a execução dos testes e irá verificar se os testes estão passando ou não. Antes de executar os testes, certifique-se de que a API está em execução, utilizando o comando `python app.py` no terminal. Após isso, você pode rodar `pytest` para iniciar os testes automatizados.\n\n![Pytest](./docs/Imagens/Sprint_4/pytestSucesso.png)\n---\n\n## Scripts Json para teste da API\n\nFoi criado um repositório na pasta de testes contendo **scripts JSON** para realizar requisições de teste em todos os endpoints da API. Esses scripts estão localizados no diretório:\n\n\nCada arquivo JSON é nomeado de acordo com o endpoint que ele testa, facilitando a identificação e o uso.\n\n---\n\n## Como utilizar os scripts no Postman \n\n1. **Acesse** o arquivo JSON correspondente ao endpoint desejado.\n2. **Copie** o conteúdo do arquivo.\n3. **Abra** o Postman e **cole** o conteúdo no **Body** da requisição.\n4. **Defina** a URL do endpoint que deseja testar.\n5. **Selecione** o método HTTP correto (por exemplo: `POST`, `GET`, `PUT`, `DELETE`).\n\n---\n\n### Exemplo\n\nPara testar o endpoint de **clientes**, siga os passos abaixo:\n\n- Arquivo: [`post_cliente.json`](DevOps_Entrega3/tests/json/post_cliente.json)\n- URL no Postman: https://app-odontoprev-python-rm553315.azurewebsites.net/clientes\n\n- Método HTTP: `POST`\n- Body: conteúdo do arquivo `post_cliente.json`\n\n---\n\nCom esses scripts, é possível testar facilmente os endpoints da API de forma padronizada e eficiente.\n\n## Lista de endpoints:\n1. https://app-odontoprev-python-rm553315.azurewebsites.net/atendimentos\n2. https://app-odontoprev-python-rm553315.azurewebsites.net/clientes\n3. https://app-odontoprev-python-rm553315.azurewebsites.net/pagamentos\n4. https://app-odontoprev-python-rm553315.azurewebsites.net/profissionais\n5. https://app-odontoprev-python-rm553315.azurewebsites.net/sinistros\n\n\nEste projeto foi desenvolvido como parte do **Challenge DevOps Tools e Cloud Computing**, aplicando práticas de integração e entrega contínua em um sistema real para gestão odontológica com Azure e SQL Server.\n\nAgradecimentos ao **Professor** e ao **Desenvolvedor** pela orientação e suporte durante o desenvolvimento da aplicação. OI","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmulliru%2Fchallenge_2025_odontoprev_devops_backup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmulliru%2Fchallenge_2025_odontoprev_devops_backup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmulliru%2Fchallenge_2025_odontoprev_devops_backup/lists"}