[{"data":1,"prerenderedAt":1088},["ShallowReactive",2],{"navigation_docs":3,"-atividades-atv-16-pipelines-cicd":252,"-atividades-atv-16-pipelines-cicd-surround":1083},[4,96,189],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"⚙️ Engenharia de Software","i-lucide-book-open","\u002Fengenharia-software","1.engenharia-software",[10,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92],{"title":5,"path":7,"stem":11},"1.engenharia-software\u002Findex",{"title":13,"path":14,"stem":15},"📋 Plano de Ensino e Aplicações","\u002Fengenharia-software\u002Fengenharia-software-aplicacoes","1.engenharia-software\u002F01.engenharia-software-aplicacoes",{"title":17,"path":18,"stem":19},"Cap 01: Introdução e Natureza do Software","\u002Fengenharia-software\u002Fcap-01","1.engenharia-software\u002F02.cap-01",{"title":21,"path":22,"stem":23},"Cap 02: Modelos de Processo de Software","\u002Fengenharia-software\u002Fcap-02","1.engenharia-software\u002F03.cap-02",{"title":25,"path":26,"stem":27},"Cap 03: As Atividades do Processo","\u002Fengenharia-software\u002Fcap-03","1.engenharia-software\u002F04.cap-03",{"title":29,"path":30,"stem":31},"Cap 04: Metodologias Ágeis","\u002Fengenharia-software\u002Fcap-04","1.engenharia-software\u002F05.cap-04",{"title":33,"path":34,"stem":35},"Cap 05: Fundamentos de Requisitos","\u002Fengenharia-software\u002Fcap-05","1.engenharia-software\u002F06.cap-05",{"title":37,"path":38,"stem":39},"Cap 06: Elicitação e Levantamento","\u002Fengenharia-software\u002Fcap-06","1.engenharia-software\u002F07.cap-06",{"title":41,"path":42,"stem":43},"Cap 07: Especificação de Requisitos (ERS)","\u002Fengenharia-software\u002Fcap-07","1.engenharia-software\u002F08.cap-07",{"title":45,"path":46,"stem":47},"Cap 08: Validação e Gestão","\u002Fengenharia-software\u002Fcap-08","1.engenharia-software\u002F09.cap-08",{"title":49,"path":50,"stem":51},"Cap 09: Fundamentos da Modelagem","\u002Fengenharia-software\u002Fcap-09","1.engenharia-software\u002F10.cap-09",{"title":53,"path":54,"stem":55},"Cap 10: Diagrama de Casos de Uso (Conceitos)","\u002Fengenharia-software\u002Fcap-10","1.engenharia-software\u002F11.cap-10",{"title":57,"path":58,"stem":59},"Cap 11: Casos de Uso (Prática e Relações)","\u002Fengenharia-software\u002Fcap-11","1.engenharia-software\u002F12.cap-11",{"title":61,"path":62,"stem":63},"Cap 12: Diagrama de Classes (Conceitos)","\u002Fengenharia-software\u002Fcap-12","1.engenharia-software\u002F13.cap-12",{"title":65,"path":66,"stem":67},"Cap 13: Herança e Polimorfismo","\u002Fengenharia-software\u002Fcap-13","1.engenharia-software\u002F14.cap-13",{"title":69,"path":70,"stem":71},"Cap 14: Diagrama de Sequência","\u002Fengenharia-software\u002Fcap-14","1.engenharia-software\u002F15.cap-14",{"title":73,"path":74,"stem":75},"Cap 15: Diagramas Dinâmicos (Estados e Atividades)","\u002Fengenharia-software\u002Fcap-15","1.engenharia-software\u002F16.cap-15",{"title":77,"path":78,"stem":79},"Cap 16: Qualidade de Software (SQA)","\u002Fengenharia-software\u002Fcap-16","1.engenharia-software\u002F17.cap-16",{"title":81,"path":82,"stem":83},"Cap 17: Estratégias de Teste","\u002Fengenharia-software\u002Fcap-17","1.engenharia-software\u002F18.cap-17",{"title":85,"path":86,"stem":87},"Cap 18: Manutenção e Evolução","\u002Fengenharia-software\u002Fcap-18","1.engenharia-software\u002F19.cap-18",{"title":89,"path":90,"stem":91},"Cap 19: Gerência de Configuração (SCM)","\u002Fengenharia-software\u002Fcap-19","1.engenharia-software\u002F20.cap-19",{"title":93,"path":94,"stem":95},"Cap 20: Conclusão e Próximos Passos","\u002Fengenharia-software\u002Fcap-20","1.engenharia-software\u002F21.cap-20",{"title":97,"icon":98,"path":99,"stem":100,"children":101},"🛠️ Atividades","i-lucide-wrench","\u002Fatividades","2.atividades",[102,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161,165,169,173,177,181,185],{"title":103,"path":99,"stem":104},"📋 Orientações Gerais","2.atividades\u002Findex",{"title":106,"path":107,"stem":108},"📅 Cronograma","\u002Fatividades\u002Fcronograma","2.atividades\u002F01.cronograma",{"title":110,"path":111,"stem":112},"✏️ Atividade 01: Escopo e Personas","\u002Fatividades\u002Fatv-01-escopo","2.atividades\u002F02.atv-01-escopo",{"title":114,"path":115,"stem":116},"⚙️ Atividade 02: Processos de Software","\u002Fatividades\u002Fatv-02-processos","2.atividades\u002F03.atv-02-processos",{"title":118,"path":119,"stem":120},"📋 Atividade 03: Engenharia de Requisitos","\u002Fatividades\u002Fatv-03-requisitos","2.atividades\u002F04.atv-03-requisitos",{"title":122,"path":123,"stem":124},"📝 Atividade 04: User Stories e Backlog","\u002Fatividades\u002Fatv-04-backlog","2.atividades\u002F05.atv-04-backlog",{"title":126,"path":127,"stem":128},"🎭 Atividade 05: Casos de Uso (UML)","\u002Fatividades\u002Fatv-05-casos-uso","2.atividades\u002F06.atv-05-casos-uso",{"title":130,"path":131,"stem":132},"🖼️ Atividade 06: Prototipagem e Wireframes","\u002Fatividades\u002Fatv-06-prototipagem","2.atividades\u002F07.atv-06-prototipagem",{"title":134,"path":135,"stem":136},"🏛️ Atividade 07: Diagrama de Classes (UML)","\u002Fatividades\u002Fatv-07-classes","2.atividades\u002F08.atv-07-classes",{"title":138,"path":139,"stem":140},"🔀 Atividade 08: Diagrama de Sequência (UML)","\u002Fatividades\u002Fatv-08-sequencia","2.atividades\u002F09.atv-08-sequencia",{"title":142,"path":143,"stem":144},"🧪 Atividade 09: Qualidade e Testes","\u002Fatividades\u002Fatv-09-testes","2.atividades\u002F10.atv-09-testes",{"title":146,"path":147,"stem":148},"🏁 Atividade 10: Projeto Integrador Final","\u002Fatividades\u002Fatv-10-projeto-final","2.atividades\u002F11.atv-10-projeto-final",{"title":150,"path":151,"stem":152},"📊 Atividade 11: Diagrama de Atividades (UML)","\u002Fatividades\u002Fatv-11-atividades","2.atividades\u002F12.atv-11-atividades",{"title":154,"path":155,"stem":156},"🔄 Atividade 12: Diagrama de Transição de Estados (UML)","\u002Fatividades\u002Fatv-12-estados","2.atividades\u002F13.atv-12-estados",{"title":158,"path":159,"stem":160},"🏗️ Atividade 13: Arquitetura de Software e Padrões","\u002Fatividades\u002Fatv-13-arquitetura","2.atividades\u002F14.atv-13-arquitetura",{"title":162,"path":163,"stem":164},"🌐 Atividade 14: Modelagem de APIs REST e Swagger","\u002Fatividades\u002Fatv-14-apis-swagger","2.atividades\u002F15.atv-14-apis-swagger",{"title":166,"path":167,"stem":168},"🌿 Atividade 15: GitFlow e Trabalho Colaborativo","\u002Fatividades\u002Fatv-15-gitflow-colaboracao","2.atividades\u002F16.atv-15-gitflow-colaboracao",{"title":170,"path":171,"stem":172},"🚀 Atividade 16: Pipelines de CI\u002FCD com GitHub Actions","\u002Fatividades\u002Fatv-16-pipelines-cicd","2.atividades\u002F17.atv-16-pipelines-cicd",{"title":174,"path":175,"stem":176},"🐳 Atividade 17: Containerização de Ambientes com Docker","\u002Fatividades\u002Fatv-17-conteineres-docker","2.atividades\u002F18.atv-17-conteineres-docker",{"title":178,"path":179,"stem":180},"🔒 Atividade 18: Segurança no Desenvolvimento e OWASP","\u002Fatividades\u002Fatv-18-seguranca-devsecops","2.atividades\u002F19.atv-18-seguranca-devsecops",{"title":182,"path":183,"stem":184},"📈 Atividade 19: Métricas de Software, Estimativas e DORA","\u002Fatividades\u002Fatv-19-metricas-estimativas","2.atividades\u002F20.atv-19-metricas-estimativas",{"title":186,"path":187,"stem":188},"🏆 Atividade 20: Projeto Final Avançado (Fase 2)","\u002Fatividades\u002Fatv-20-projeto-final-avancado","2.atividades\u002F21.atv-20-projeto-final-avancado",{"title":190,"icon":191,"path":192,"stem":193,"children":194},"🖼️ Galeria de Projetos Integradores","i-lucide-image","\u002Fprojetos-integradores","3.projetos-integradores",[195,197,207,216,225,234,243],{"title":190,"path":192,"stem":196},"3.projetos-integradores\u002Findex",{"title":198,"path":199,"stem":200,"children":201},"🅿️ Projeto 01: Gestão de Estacionamentos","\u002Fprojetos-integradores\u002Fpi-01-gestao-estacionamentos","3.projetos-integradores\u002F01.pi-01-gestao-estacionamentos\u002Findex",[202,203],{"title":198,"path":199,"stem":200},{"title":204,"path":205,"stem":206},"README","\u002Fprojetos-integradores\u002Fpi-01-gestao-estacionamentos\u002Freadme","3.projetos-integradores\u002F01.pi-01-gestao-estacionamentos\u002F2.readme",{"title":208,"path":209,"stem":210,"children":211},"🔐 Projeto 02: Gerador de Senhas","\u002Fprojetos-integradores\u002Fpi-02-gerador-senhas","3.projetos-integradores\u002F02.pi-02-gerador-senhas\u002Findex",[212,213],{"title":208,"path":209,"stem":210},{"title":204,"path":214,"stem":215},"\u002Fprojetos-integradores\u002Fpi-02-gerador-senhas\u002Freadme","3.projetos-integradores\u002F02.pi-02-gerador-senhas\u002F2.readme",{"title":217,"path":218,"stem":219,"children":220},"🍣 Projeto 03: Pedidos Restaurante","\u002Fprojetos-integradores\u002Fpi-03-pedidos-restaurante","3.projetos-integradores\u002F03.pi-03-pedidos-restaurante\u002Findex",[221,222],{"title":217,"path":218,"stem":219},{"title":204,"path":223,"stem":224},"\u002Fprojetos-integradores\u002Fpi-03-pedidos-restaurante\u002Freadme","3.projetos-integradores\u002F03.pi-03-pedidos-restaurante\u002F2.readme",{"title":226,"path":227,"stem":228,"children":229},"📱 Projeto 04: Empréstimos Dispositivos","\u002Fprojetos-integradores\u002Fpi-04-emprestimos-dispositivos","3.projetos-integradores\u002F04.pi-04-emprestimos-dispositivos\u002Findex",[230,231],{"title":226,"path":227,"stem":228},{"title":204,"path":232,"stem":233},"\u002Fprojetos-integradores\u002Fpi-04-emprestimos-dispositivos\u002Freadme","3.projetos-integradores\u002F04.pi-04-emprestimos-dispositivos\u002F2.readme",{"title":235,"path":236,"stem":237,"children":238},"📦 Projeto 05: Gestão de Estoque","\u002Fprojetos-integradores\u002Fpi-05-gestao-estoque","3.projetos-integradores\u002F05.pi-05-gestao-estoque\u002Findex",[239,240],{"title":235,"path":236,"stem":237},{"title":204,"path":241,"stem":242},"\u002Fprojetos-integradores\u002Fpi-05-gestao-estoque\u002Freadme","3.projetos-integradores\u002F05.pi-05-gestao-estoque\u002F2.readme",{"title":244,"path":245,"stem":246,"children":247},"🛵 Projeto 06: Aplicativo de Delivery","\u002Fprojetos-integradores\u002Fpi-06-delivery","3.projetos-integradores\u002F06.pi-06-delivery\u002Findex",[248,249],{"title":244,"path":245,"stem":246},{"title":204,"path":250,"stem":251},"\u002Fprojetos-integradores\u002Fpi-06-delivery\u002Freadme","3.projetos-integradores\u002F06.pi-06-delivery\u002F2.readme",{"id":253,"title":170,"body":254,"description":1077,"extension":1078,"links":1079,"meta":1080,"navigation":452,"path":171,"seo":1081,"stem":172,"__hash__":1082},"docs\u002F2.atividades\u002F17.atv-16-pipelines-cicd.md",{"type":255,"value":256,"toc":1056},"minimark",[257,260,265,269,306,308,312,319,322,332,334,338,348,353,395,400,404,406,410,419,423,430,553,561,564,850,852,856,862,875,879,882,884,888,893,908,910,914,917,936,938,942,964,966,970,1052],[258,259],"hr",{},[261,262,264],"h2",{"id":263},"objetivo-da-aula","🎯 Objetivo da Aula",[266,267,268],"p",{},"Ao final desta atividade, você será capaz de:",[270,271,272,281,284,291],"ul",{},[273,274,275,276,280],"li",{},"Compreender os conceitos fundamentais de ",[277,278,279],"strong",{},"CI\u002FCD"," (Integração Contínua e Entrega Contínua).",[273,282,283],{},"Projetar e mapear pipelines lógicos e suas sequências de execução.",[273,285,286,287,290],{},"Configurar um arquivo YAML de automação corporativa real com ",[277,288,289],{},"GitHub Actions",".",[273,292,293,294,297,298,301,302,305],{},"Integrar testes unitários ",[277,295,296],{},"JUnit"," em aplicações ",[277,299,300],{},"Spring Boot 3.5.x"," e ",[277,303,304],{},"Java 17"," no fluxo de CI.",[258,307],{},[261,309,311],{"id":310},"o-cenário-prático-seu-desafio","🏢 O Cenário Prático (Seu Desafio)",[266,313,314,315,318],{},"Na ",[277,316,317],{},"TecProExpress",", a gerência estava cansada: toda vez que um desenvolvedor subia uma nova alteração de código, ele jurava de pés juntos que o sistema estava \"funcionando perfeitamente\". Porém, ao publicar na nuvem, o aplicativo do motorista quebrava porque alguém esqueceu de testar a alteração localmente!",[266,320,321],{},"Os testes manuais demoravam horas de digitação improdutiva e, frequentemente, bugs passavam para produção.",[323,324,325],"blockquote",{},[266,326,327,328,331],{},"\"Seu desafio como ",[277,329,330],{},"Analista de DevOps"," é criar o primeiro Pipeline de Integração Contínua (CI) para a TecProExpress. Você configurará um arquivo do GitHub Actions que, de forma 100% automática, baixa o código do repositório, instala o Java 17, compila a aplicação Spring Boot e executa todos os testes unitários do JUnit toda vez que um programador enviar um Push ou Pull Request.\"",[258,333],{},[261,335,337],{"id":336},"fundamentos-a-teoria-traduzida","🧠 Fundamentos: A Teoria Traduzida",[266,339,340,343,344,347],{},[277,341,342],{},"CI (Continuous Integration):"," É a prática de integrar alterações de código com frequência e validá-las de forma automática.\n",[277,345,346],{},"CD (Continuous Delivery):"," É a publicação automatizada do código validado no servidor web (produção).",[349,350,352],"h3",{"id":351},"anatomia-de-um-workflow-do-github-actions","Anatomia de um Workflow do GitHub Actions:",[270,354,355,366,380,389],{},[273,356,357,360,361,365],{},[277,358,359],{},"Workflow:"," O arquivo YAML que define a automação (salvo na pasta ",[362,363,364],"code",{},".github\u002Fworkflows\u002F",").",[273,367,368,371,372,375,376,379],{},[277,369,370],{},"Trigger (on):"," O evento que aciona o pipeline (Ex: ",[362,373,374],{},"push"," ou ",[362,377,378],{},"pull_request"," na branch develop\u002Fmain).",[273,381,382,385,386,365],{},[277,383,384],{},"Jobs (Trabalhos):"," As seções do pipeline (Ex: ",[362,387,388],{},"build-and-test",[273,390,391,394],{},[277,392,393],{},"Steps (Passos):"," A sequência de comandos que roda dentro de uma máquina virtual dedicada na nuvem (Runner).",[396,397,399],"h4",{"id":398},"visualizando-a-sequência-de-automação","📊 Visualizando a Sequência de Automação",[401,402],"mermaid",{"code":403},"flowchart LR\n    Push[\"1. Git Push \u002F PR\"] --> Trigger{\"2. Trigger do GitHub\"}\n    Trigger -->|Dispara Runner| VM[\"Máquina Virtual Ubuntu\"]\n    subgraph VM [VM na Nuvem do GitHub]\n        direction TB\n        S1[\"Step 1: Baixar Código (Checkout)\"] --> S2[\"Step 2: Instalar Java 17 (JDK)\"]\n        S2 --> S3[\"Step 3: Compilar & Testar (Maven + JUnit)\"]\n    end\n    VM -->|Falha no Teste| Block[\"Pipeline Vermelho: Bloquear Deploy!\"]\n    VM -->|Sucesso total| Pass[\"Pipeline Verde: Liberar Mesclagem!\"]\n\n    style VM fill:#f9f9f9,stroke:#333\n    style Block fill:#ffebee,stroke:#c62828,stroke-width:2px\n    style Pass fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px\n",[258,405],{},[261,407,409],{"id":408},"exemplo-guiado-roteiro-e-configuração-do-pipeline","📖 Exemplo Guiado: Roteiro e Configuração do Pipeline",[266,411,412,413,415,416,365],{},"Para configurar a automação, precisaremos de duas coisas no nosso repositório Java Spring Boot: o teste unitário de negócio (",[277,414,296],{},") e o arquivo do pipeline (",[277,417,418],{},"Actions",[349,420,422],{"id":421},"_1-️-o-teste-unitário-junit-em-java-17-cálculo-de-frete","1. 🛠️ O Teste Unitário JUnit em Java 17 (Cálculo de Frete):",[266,424,425,426,429],{},"Dentro da pasta ",[362,427,428],{},"src\u002Ftest\u002Fjava\u002Fcom\u002Ftecproexpress\u002F"," do seu projeto Spring Boot, nós escrevemos o teste de validade da regra de negócio:",[431,432,437],"pre",{"className":433,"code":434,"language":435,"meta":436,"style":436},"language-java shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package com.tecproexpress.service;\n\nimport org.junit.jupiter.api.Test;\nimport static org.junit.jupiter.api.Assertions.*;\n\npublic class DeliveryServiceTest {\n\n    @Test\n    public void deveCalcularFreteComSucesso() {\n        double pesoCarga = 10.0; \u002F\u002F 10kg\n        double valorBase = 50.0;\n        \n        \u002F\u002F Regra da TecProExpress: R$ 2.00 por Kg excedente\n        double freteFinal = valorBase + (pesoCarga * 2.0);\n\n        \u002F\u002F Asserção JUnit de Sucesso\n        assertEquals(70.0, freteFinal, \"O cálculo de frete da TecProExpress falhou!\");\n    }\n}\n","java","",[362,438,439,447,454,460,466,471,477,482,488,494,500,506,512,518,524,529,535,541,547],{"__ignoreMap":436},[440,441,444],"span",{"class":442,"line":443},"line",1,[440,445,446],{},"package com.tecproexpress.service;\n",[440,448,450],{"class":442,"line":449},2,[440,451,453],{"emptyLinePlaceholder":452},true,"\n",[440,455,457],{"class":442,"line":456},3,[440,458,459],{},"import org.junit.jupiter.api.Test;\n",[440,461,463],{"class":442,"line":462},4,[440,464,465],{},"import static org.junit.jupiter.api.Assertions.*;\n",[440,467,469],{"class":442,"line":468},5,[440,470,453],{"emptyLinePlaceholder":452},[440,472,474],{"class":442,"line":473},6,[440,475,476],{},"public class DeliveryServiceTest {\n",[440,478,480],{"class":442,"line":479},7,[440,481,453],{"emptyLinePlaceholder":452},[440,483,485],{"class":442,"line":484},8,[440,486,487],{},"    @Test\n",[440,489,491],{"class":442,"line":490},9,[440,492,493],{},"    public void deveCalcularFreteComSucesso() {\n",[440,495,497],{"class":442,"line":496},10,[440,498,499],{},"        double pesoCarga = 10.0; \u002F\u002F 10kg\n",[440,501,503],{"class":442,"line":502},11,[440,504,505],{},"        double valorBase = 50.0;\n",[440,507,509],{"class":442,"line":508},12,[440,510,511],{},"        \n",[440,513,515],{"class":442,"line":514},13,[440,516,517],{},"        \u002F\u002F Regra da TecProExpress: R$ 2.00 por Kg excedente\n",[440,519,521],{"class":442,"line":520},14,[440,522,523],{},"        double freteFinal = valorBase + (pesoCarga * 2.0);\n",[440,525,527],{"class":442,"line":526},15,[440,528,453],{"emptyLinePlaceholder":452},[440,530,532],{"class":442,"line":531},16,[440,533,534],{},"        \u002F\u002F Asserção JUnit de Sucesso\n",[440,536,538],{"class":442,"line":537},17,[440,539,540],{},"        assertEquals(70.0, freteFinal, \"O cálculo de frete da TecProExpress falhou!\");\n",[440,542,544],{"class":442,"line":543},18,[440,545,546],{},"    }\n",[440,548,550],{"class":442,"line":549},19,[440,551,552],{},"}\n",[349,554,556,557,560],{"id":555},"_2-o-arquivo-do-pipeline-githubworkflowsciyml","2. 📄 O Arquivo do Pipeline ",[362,558,559],{},".github\u002Fworkflows\u002Fci.yml",":",[266,562,563],{},"Este é o arquivo YAML que o GitHub interpreta para automatizar a verificação:",[431,565,569],{"className":566,"code":567,"language":568,"meta":436,"style":436},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: Java CI com Maven e Spring Boot\n\non:\n  push:\n    branches: [ \"main\", \"develop\" ]\n  pull_request:\n    branches: [ \"main\", \"develop\" ]\n\njobs:\n  build-and-test:\n    runs-on: ubuntu-latest\n\n    steps:\n    # 1. Faz o download do código do repositório\n    - name: Checkout do Código\n      uses: actions\u002Fcheckout@v4\n\n    # 2. Configura a versão do Java no ambiente de execução\n    - name: Instalar JDK 17\n      uses: actions\u002Fsetup-java@v4\n      with:\n        java-version: '17'\n        distribution: 'temurin'\n        cache: maven\n\n    # 3. Compila a aplicação Spring Boot e roda os testes do JUnit\n    - name: Executar Build e Testes JUnit com Maven\n      run: mvn -B clean test\n","yaml",[362,570,571,584,588,597,604,636,643,667,671,678,685,695,699,706,712,725,735,739,744,755,765,773,790,805,816,821,827,839],{"__ignoreMap":436},[440,572,573,577,580],{"class":442,"line":443},[440,574,576],{"class":575},"swJcz","name",[440,578,560],{"class":579},"sMK4o",[440,581,583],{"class":582},"sfazB"," Java CI com Maven e Spring Boot\n",[440,585,586],{"class":442,"line":449},[440,587,453],{"emptyLinePlaceholder":452},[440,589,590,594],{"class":442,"line":456},[440,591,593],{"class":592},"sfNiH","on",[440,595,596],{"class":579},":\n",[440,598,599,602],{"class":442,"line":462},[440,600,601],{"class":575},"  push",[440,603,596],{"class":579},[440,605,606,609,611,614,617,620,623,626,628,631,633],{"class":442,"line":468},[440,607,608],{"class":575},"    branches",[440,610,560],{"class":579},[440,612,613],{"class":579}," [",[440,615,616],{"class":579}," \"",[440,618,619],{"class":582},"main",[440,621,622],{"class":579},"\"",[440,624,625],{"class":579},",",[440,627,616],{"class":579},[440,629,630],{"class":582},"develop",[440,632,622],{"class":579},[440,634,635],{"class":579}," ]\n",[440,637,638,641],{"class":442,"line":473},[440,639,640],{"class":575},"  pull_request",[440,642,596],{"class":579},[440,644,645,647,649,651,653,655,657,659,661,663,665],{"class":442,"line":479},[440,646,608],{"class":575},[440,648,560],{"class":579},[440,650,613],{"class":579},[440,652,616],{"class":579},[440,654,619],{"class":582},[440,656,622],{"class":579},[440,658,625],{"class":579},[440,660,616],{"class":579},[440,662,630],{"class":582},[440,664,622],{"class":579},[440,666,635],{"class":579},[440,668,669],{"class":442,"line":484},[440,670,453],{"emptyLinePlaceholder":452},[440,672,673,676],{"class":442,"line":490},[440,674,675],{"class":575},"jobs",[440,677,596],{"class":579},[440,679,680,683],{"class":442,"line":496},[440,681,682],{"class":575},"  build-and-test",[440,684,596],{"class":579},[440,686,687,690,692],{"class":442,"line":502},[440,688,689],{"class":575},"    runs-on",[440,691,560],{"class":579},[440,693,694],{"class":582}," ubuntu-latest\n",[440,696,697],{"class":442,"line":508},[440,698,453],{"emptyLinePlaceholder":452},[440,700,701,704],{"class":442,"line":514},[440,702,703],{"class":575},"    steps",[440,705,596],{"class":579},[440,707,708],{"class":442,"line":520},[440,709,711],{"class":710},"sHwdD","    # 1. Faz o download do código do repositório\n",[440,713,714,717,720,722],{"class":442,"line":526},[440,715,716],{"class":579},"    -",[440,718,719],{"class":575}," name",[440,721,560],{"class":579},[440,723,724],{"class":582}," Checkout do Código\n",[440,726,727,730,732],{"class":442,"line":531},[440,728,729],{"class":575},"      uses",[440,731,560],{"class":579},[440,733,734],{"class":582}," actions\u002Fcheckout@v4\n",[440,736,737],{"class":442,"line":537},[440,738,453],{"emptyLinePlaceholder":452},[440,740,741],{"class":442,"line":543},[440,742,743],{"class":710},"    # 2. Configura a versão do Java no ambiente de execução\n",[440,745,746,748,750,752],{"class":442,"line":549},[440,747,716],{"class":579},[440,749,719],{"class":575},[440,751,560],{"class":579},[440,753,754],{"class":582}," Instalar JDK 17\n",[440,756,758,760,762],{"class":442,"line":757},20,[440,759,729],{"class":575},[440,761,560],{"class":579},[440,763,764],{"class":582}," actions\u002Fsetup-java@v4\n",[440,766,768,771],{"class":442,"line":767},21,[440,769,770],{"class":575},"      with",[440,772,596],{"class":579},[440,774,776,779,781,784,787],{"class":442,"line":775},22,[440,777,778],{"class":575},"        java-version",[440,780,560],{"class":579},[440,782,783],{"class":579}," '",[440,785,786],{"class":582},"17",[440,788,789],{"class":579},"'\n",[440,791,793,796,798,800,803],{"class":442,"line":792},23,[440,794,795],{"class":575},"        distribution",[440,797,560],{"class":579},[440,799,783],{"class":579},[440,801,802],{"class":582},"temurin",[440,804,789],{"class":579},[440,806,808,811,813],{"class":442,"line":807},24,[440,809,810],{"class":575},"        cache",[440,812,560],{"class":579},[440,814,815],{"class":582}," maven\n",[440,817,819],{"class":442,"line":818},25,[440,820,453],{"emptyLinePlaceholder":452},[440,822,824],{"class":442,"line":823},26,[440,825,826],{"class":710},"    # 3. Compila a aplicação Spring Boot e roda os testes do JUnit\n",[440,828,830,832,834,836],{"class":442,"line":829},27,[440,831,716],{"class":579},[440,833,719],{"class":575},[440,835,560],{"class":579},[440,837,838],{"class":582}," Executar Build e Testes JUnit com Maven\n",[440,840,842,845,847],{"class":442,"line":841},28,[440,843,844],{"class":575},"      run",[440,846,560],{"class":579},[440,848,849],{"class":582}," mvn -B clean test\n",[258,851],{},[261,853,855],{"id":854},"️-prática-obrigatória-1-desenho-do-pipeline","🛠️ Prática Obrigatória 1: Desenho do Pipeline",[266,857,858,861],{},[277,859,860],{},"Cenário:"," Mapeamento visual das etapas de automação do seu projeto.",[863,864,865,872],"ol",{},[273,866,867,868,871],{},"Desenhe um diagrama ",[362,869,870],{},"flowchart"," no Mermaid representando a sequência de passos lógicos que o seu pipeline do GitHub Actions deve executar.",[273,873,874],{},"Adicione cores ou estilos para indicar a diferença visual entre o sucesso e a falha de um passo de teste.",[349,876,878],{"id":877},"resultado-esperado-para-sua-referência","🏁 Resultado Esperado (Para sua Referência)",[266,880,881],{},"Um diagrama Mermaid detalhado demonstrando o ciclo de CI acionado por um Push de branch e o desfecho do build.",[258,883],{},[261,885,887],{"id":886},"️-prática-obrigatória-2-o-roteiro-de-ci-e-teste-de-unidade","🛠️ Prática Obrigatória 2: O Roteiro de CI e Teste de Unidade",[266,889,890,892],{},[277,891,860],{}," Escrevendo sua primeira verificação automatizada.",[863,894,895,901],{},[273,896,897,898,900],{},"Crie a especificação em formato Markdown do seu arquivo de configuração ",[362,899,559],{}," customizado para o seu repositório do projeto.",[273,902,903,904,907],{},"Escreva a classe de teste ",[277,905,906],{},"JUnit (Java)"," correspondente a uma validação de dados lógica do seu sistema (Ex: Validar se uma senha tem menos de 8 caracteres e falha, Validar se a idade do usuário é maior que 18 para aprovação).",[258,909],{},[261,911,913],{"id":912},"instruções-de-entrega-microsoft-teams","📤 Instruções de Entrega (Microsoft Teams)",[266,915,916],{},"Após validar a sua arquitetura de automação de testes:",[863,918,919,930,933],{},[273,920,921,922,925,926,929],{},"Salve o arquivo de especificações e códigos com o nome ",[362,923,924],{},"Atividade_16.md"," na pasta ",[362,927,928],{},"es-atv-16-pipelines-cicd\u002F"," do seu repositório GitHub.",[273,931,932],{},"Certifique-se de fazer o commit e push para o repositório público.",[273,934,935],{},"Submeta o link do seu repositório no Microsoft Teams para avaliação do professor.",[258,937],{},[261,939,941],{"id":940},"checkpoint-de-lógica","💡 Checkpoint de Lógica",[943,944,947,950,951,954,955,958,959,375,961,963],"callout",{"color":945,"icon":946},"primary","i-lucide-megaphone",[277,948,949],{},"Importante:"," ",[277,952,953],{},"Reflexão Profissional:","\nSe durante a execução do pipeline de CI no GitHub Actions um único teste unitário do JUnit falhar (ex: acusando ",[362,956,957],{},"AssertionError","), o que o GitHub fará com o Pull Request de mesclagem de código daquele desenvolvedor? (Resposta: O GitHub marcará o build como \"Falho\" (Status Vermelho) e bloqueará a mesclagem automática do Pull Request, impedindo que o código defeituoso contamine a branch estável de desenvolvimento ",[362,960,630],{},[362,962,619],{},"). 🧠🛡️",[258,965],{},[261,967,969],{"id":968},"rubrica-formativa-de-avaliação","📊 Rubrica Formativa de Avaliação",[971,972,974,975,974,998],"table",{"style":973},"width:100%; border-collapse: collapse; font-family: sans-serif; margin: 20px 0; border: 1px solid #ddd; box-shadow: 0 4px 8px rgba(0,0,0,0.1);","\n  ",[976,977,978,979,974],"thead",{},"\n    ",[980,981,983,984,983,989,983,992,983,995,978],"tr",{"style":982},"background-color: #2c3e50; color: white;","\n      ",[985,986,988],"th",{"style":987},"padding: 12px; border: 1px solid #ddd; text-align: left;","Critério de Avaliação",[985,990,991],{"style":987},"Insuficiente (0% - 40%)",[985,993,994],{"style":987},"Regular (41% - 70%)",[985,996,997],{"style":987},"Excelente (71% - 100%)",[999,1000,978,1001,978,1020,978,1036,974],"tbody",{},[980,1002,983,1004,983,1011,983,1014,983,1017,978],{"style":1003},"background-color: #f8f9fa;",[1005,1006,1008],"td",{"style":1007},"padding: 10px; border: 1px solid #ddd;",[277,1009,1010],{},"Pipeline CI\u002FCD (GitHub Actions YAML & Mermaid)",[1005,1012,1013],{"style":1007},"Erros na sintaxe YAML do GitHub Actions ou fluxo do pipeline sem passos de build\u002Ftest.",[1005,1015,1016],{"style":1007},"Escreve o workflow `.yml` mas sem personalizar para a linguagem do projeto.",[1005,1018,1019],{"style":1007},"Pipeline CI em YAML perfeitamente funcional com gatilhos (`push`\u002F`pull_request`), setup de JDK\u002Fambiente e execução automatizada de testes.",[980,1021,983,1022,983,1027,983,1030,983,1033,978],{},[1005,1023,1024],{"style":1007},[277,1025,1026],{},"Automação de Testes de Unidade (JUnit)",[1005,1028,1029],{"style":1007},"Sem asserções de teste automatizadas ou sintaxe inválida.",[1005,1031,1032],{"style":1007},"Escreve a classe JUnit mas com asserções genéricas.",[1005,1034,1035],{"style":1007},"Classe de teste JUnit impecável com asserções de sucesso e tratamento de falhas lógicas do sistema.",[980,1037,983,1038,983,1043,983,1046,983,1049,978],{"style":1003},[1005,1039,1040],{"style":1007},[277,1041,1042],{},"Entrega no GitHub",[1005,1044,1045],{"style":1007},"Entrega fora da pasta `es-atv-16-pipelines-cicd\u002F`.",[1005,1047,1048],{"style":1007},"Arquivo entregue mas sem validação visual da execução do pipeline.",[1005,1050,1051],{"style":1007},"Submete `Atividade_16.md` com YAML e JUnit formatados e validados no repositório.",[1053,1054,1055],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":436,"searchDepth":449,"depth":456,"links":1057},[1058,1059,1060,1065,1070,1073,1074,1075,1076],{"id":263,"depth":449,"text":264},{"id":310,"depth":449,"text":311},{"id":336,"depth":449,"text":337,"children":1061},[1062],{"id":351,"depth":456,"text":352,"children":1063},[1064],{"id":398,"depth":462,"text":399},{"id":408,"depth":449,"text":409,"children":1066},[1067,1068],{"id":421,"depth":456,"text":422},{"id":555,"depth":456,"text":1069},"2. 📄 O Arquivo do Pipeline .github\u002Fworkflows\u002Fci.yml:",{"id":854,"depth":449,"text":855,"children":1071},[1072],{"id":877,"depth":456,"text":878},{"id":886,"depth":449,"text":887},{"id":912,"depth":449,"text":913},{"id":940,"depth":449,"text":941},{"id":968,"depth":449,"text":969},"Bem-vindo a mais uma etapa da sua jornada na Engenharia de Software! Nas atividades anteriores, aprendemos sobre GitFlow e arquitetura. Hoje, daremos um passo fundamental na automação de processos industriais de software: a Integração Contínua (CI). Aprenderemos como automatizar a compilação e execução de testes JUnit a cada Push que seu time faz para o repositório, garantindo blindagem contra códigos bugados! 🛡️🧩","md",null,{},{"title":170,"description":1077},"ZKm0g00YMVx4aEzRms6v8qpc7akrtcvXSsCma2XZbBI",[1084,1086],{"title":166,"path":167,"stem":168,"description":1085,"children":-1},"Bem-vindo a mais uma etapa prática de Engenharia de Software! Até agora, você criou especificações e diagramas. Mas na vida real de desenvolvimento corporativo, as equipes trabalham juntas em uma base de código única. Como fazer para que 10 programadores editem o mesmo arquivo do Spring Boot ao mesmo tempo sem que um apague a alteração do outro? Hoje, aprenderemos a dominar o controle de versão profissional usando o Git e a metodologia estratégica GitFlow. 🛡️🧩",{"title":174,"path":175,"stem":176,"description":1087,"children":-1},"Bem-vindo a mais uma etapa prática da sua jornada na Engenharia de Software! Após automatizarmos nossos testes no pipeline de CI\u002FCD, agora resolveremos um dos problemas mais clássicos e irritantes no desenvolvimento de software: \"Na minha máquina funciona, por que não funciona no servidor de produção?\" 🤦‍♂️💻",1788375146001]