Beleza pessoal, vamos começar então aqui mais uma etapa do nosso repositório. Olhando aqui para o nosso workflow DCI, eu acho que já tá bem completinho o que a gente pode fazer aqui também é criar é mais um job né onde a gente passando com sucesso todos os steps acima né ou seja o job é de se aí passando com sucesso a gente pode fazer aqui a abertura do de um PR né então vou colocar aqui um create PR to main vou repetir algumas coisas aqui né como nosso runzone E aí eu vou colocar aqui mais um cara que é novo, que é esse needs. O que é esse needs? Basicamente, eu estou falando que eu só quero executar esse job depois que alguns outros jobs forem finalizados e se eles forem finalizados com sucesso então eu vou pegar aqui o nome do nosso job eu vou falar assim puta beleza só quero executar nosso create.pr quando eu tiver finalizado aqui o CI image né e aí eu começo a declaração aqui dos meus steps novamente o que que eu vou fazer aqui tá eu vou fazer um check out e eu vou utilizar aqui tipo uma outra action que vai fazer a abertura de um PR no caso apontando para main utilizando um token né do GitHub e esse token aqui ele é capturado conforme a gente executa action né então a própria action ela já faz uma chamada né GitHub App, busca um token para a gente conseguir fazer todas as ações interagindo com o próprio GitHub. Então a gente não precisa declarar essa Secret, essa Secret já vem aqui da própria estrutura do GitHub Actions. estrutura do GitHub Actions. Dessa forma, a gente vai conseguir então ter um fluxo onde a gente consiga rodar etapas mínimas de CI e tem abertura de um PR para a main. Tudo isso vai ser executado quando a gente tiver uma branch feature ou fix, né? E aí a gente começa a declarar aqui também o nosso workflow da main né então para não tomar muito tempo eu já deixei ele pronto o que que a gente vai fazer aqui ele vai se chamar main o trigger dele vai ser um trigger do tipo pull request sempre que a gente tiver com o pull request no status de closed referente a branch main, a gente vai fazer o que? A gente vai entrar na etapa de baixo, e aí quando a gente entrar na etapa de baixo, a gente entra nesse primeiro job que é de publicação da imagem, contudo eu só vou executar esse job se a gente tiver o evento de pull request merged como true, ou seja, pensando no trigger aqui, você pode ter um pull request que está closed, mas porque ele foi fechado sem ser mergeado, clôset mas porque ele foi fechado sem ser mergê adonais por alguém simplesmente encerrou ele lá tá este ou alguma coisa assim nesse caso o que vai acontecer o workflow começa mas quando ele iniciar o primeiro step o primeiro job aqui ele vai entrar com essa condição aqui de falso e não vai dar, consequentemente ele não vai ser executado. Então isso daqui a gente também consegue, enfim, tem diversos, a gente chama de contextos do GitHub, se você digitar github-actions-contexts vão aparecer diversos contextos que a gente consiga que a gente consegue trabalhar se referenciar para ter esse tipo de jogadinha aqui quando estiver trabalhando com actions tá é ea gente está referenciando aqui um outro reusable que se chamalish esse cara não tá criado né então vamos criar esse publish.emo e aí esse arquivo de Publish a gente também vai ter aqui algumas coisas declarado nele tá que é basicamente aqui algumas permissions, o nome do nosso reusable, o nosso trigger vai ser o mesmo, que é o workflow call, porque ele é um reusable, a gente também vai ter aqui os mesmos inputs, e aí pensando nos jobs aqui, a gente tem o job de build de imagem, onde ele vai fazer um checkout, utilizando o mesmo runner, ele vai fazer o config parser, ele vai rodar aqui uma etapa do sonar, vai fazer um login no GitHub, que é o nosso registro em específico nesse caso vai fazer um build local da nossa imagem então aqui eu tô utilizando né conforme eu tinha comentado com vocês para fazer o build o nosso registro eu tô pegando no nosso arquivo de settings e e o nosso repository também tá vendo do nosso arquivo de settings basicamente vai ficar aqui tipo vai fazer um um merge dessas duas informações e aí eu tô colocando aqui os primeiros caracteres né os primeiros oito caracteres do do chá comit que a gente tá fazendo aqui o o build da imagem e aí como último step eu tô fazendo o push um push justamente da imagem que a gente fez o build na etapa anterior né e eu tô fazendo um push utilizando as mesmas informações então o build local vai ter basicamente o mesmo tag que o do meu do meu registro remoto né e aí eu também estou utilizando aqui como working directory informações de input de onde eu tenho que me referenciar para buscar o meu Dockerfile, tá? Percebam que aqui a gente tem algumas coisas que a gente vai precisar configurar, né? Então, por exemplo, essa etapa já está ok. Quando a gente entra na próxima etapa, que é do Sonar, a gente já está fazendo referência aqui a algumas secrets que a gente não tem cadastrado dentro do nosso repositório. E a gente também está fazendo referência a algumas outras secrets aqui do Docker Hub que a gente também não tem cadastrado dentro do nosso repositório tá é para a gente conseguir realizar esses procedimentos com sucesso a gente vai precisar regularizar todas essas etapas uma coisa que eu não tinha feito né que eu deveria ter feito logo no comecinho é a gente ter aqui criado uma uma brent né então vou trabalhar aqui com uma uma brent chamada feature inicio setup beleza beleza e aí agora a gente tem a nossa branch específica e aí a main vai ficar específico agora pro nosso fluxo aqui que vai vir de abertura de pr né é que eu vou fazer aqui eu vou primeiro publicar essas alterações a gente valida e também já valações, a gente valida. E também já valida se a gente está conseguindo fazer a abertura do PR para a main, conforme esse último job que a gente configurou aqui. Vamos ver se está funcionando bacana. Thank you. you E aí a empresa a nossa action aqui foi executada com sucesso, o trigger tá funcionando bacana. Perceba, né, agora ele já criou tipo uma árvore de dependência, então se a gente olhar aqui o nosso anterior a gente só tinha um, agora a gente tem dois e eles não estão concorrentes, né, eles poderiam estar concorrentes a gente teria tipo esse job aqui embaixo como a gente não quer isso então ele já passou aqui pelo CI passou com sucesso, a gente não tinha mexido em nada e agora ele está executando a abertura aqui de um PR para a main beleza beleza concluiu com sucesso vamos ver aqui os nossos por request legal né a gente já tem aqui um por request e da feature para mim e os nossos nosso comitê né as informações aqui pra gente fazer o code review bacana então a alteração que a gente fez é surte o efeito desejado e agora o que a gente precisa fazer aqui a gente se a gente executar esse pr pra mim agora a gente vai quebrar eu acho até que vale a pena a gente fazer esse teste pra vocês verem como que vai funcionar né porque vai quebrar porque a gente não tem todas as informações que são necessárias para a gente poder executar esse workflow vamos fazer aqui o país executou novamente o fluxo de se aí aqui já precisa corrigir isso Beleza, ele entrou porque a gente atendeu aquele requisito de estar como Merged, ele executou aqui o Output, e quando ele começou a executar aqui as etapas do sonar ele falhou porque ele não tem essa variável, essa secret que a gente está fazendo referência a gente percebeu que tem alguma coisa acontecendo errado nos nossos workflows, porque basicamente ele está executando novamente esse fluxo de abertura de PR e tal, mesmo quando a gente só fez manipulação da branch main. Mesmo quando a gente só fez manipulação Da branch main E na verdade O que está acontecendo É que a gente Esqueceu uma letra aqui Tá Então Se a gente olhar aqui no nosso workflow A gente consegue Validar aqui Aqui está bacana E aqui a gente consegue validar aqui aqui tá tá bacana né tipo e aqui a gente não tem eu não tava com esse então tava dando algum problema aqui na nossa trilha tá eu vou executar novamente todo o fluxo aqui só para validar que tá funcionando bacana E aí Thank you. teoricamente ele vai abrir um PR novo aqui para a gente, né? E aí nesse PR a gente consegue fazer a configuração aqui do restante do que a gente precisa. O que a gente vai fazer aqui em paralelo, tá turma? Vamos logar aqui no Sonar Cloud. Quem não tiver conta pode fazer a conta. pode fazer a conta nesse caso aqui a gente já vai fazer o login utilizando o próprio GitHub tá bom e aí ele já vai pedir aqui é pra gente fazer autorização né do Sornacloud a gente vai autorizar legal e aí ele vai falar assim ah eu consigo fazer aqui né importar uma organização tal ou encontrar né tipo caso não não tenha aparecido na lista e tal vamos nessa de importe e a gente vai colocar aqui ao repositories vamos dar um install e aí ele já achou aqui né uma uma organization já sugere aqui uma organization com o meu nome ele já dá uma sugestão aqui de chave o nosso caso aqui a gente vai escolher o plano free e vai dar um create organization legal ele achou alguns repositórios né tipo como esse login ele é novo então tem pouco repositório aqui eu vou colocar especificamente só o que a gente está trabalhando que é esse de python image e vou dar um setup beleza aqui é a configuração de como ele vai fazer análise do nosso código a gente pode colocar aqui como previews e dar um create project beleza nosso projeto tá criado agora a gente vai precisar gerar aqui nosso token. Enquanto isso, a gente consegue fazer a validação aqui de que a gente passou com sucesso, abriu um novo PR, né? Então, a gente tem aqui o nosso segundo PR aberto. Ele já até adicionou aqui alguns comentários relacionados ao ao sonar como a gente não executou nada de dentro da nossa etapa ali de CI, ele acaba que não tem nada aqui, mas a gente consegue vir aqui em my account security a minha calma security e a gente vai gerar um novo toque tá então a gente vai colocar aqui por exemplo eu vou deixar específico python o ocafo saiko o colocar full cycle full cycle e vou dar um generate token e vou dar um generate token beleza agora a gente tem um um token e esse token aqui e esse token aqui a gente precisa utilizar para poder fazer o cadastro dentro do nosso repositório para que funcione nossa integração com o Sonar. Então se vocês olharem aqui o nosso código o que a gente tem aqui? A gente tem basicamente um GitHub token, que é o mesmo token que a gente referencia para a gente poder fazer a integração para abertura de PR, é um token, uma secret que já é interna, e a gente tem um token do próprio Sonar. Então esse Sonar token aqui é o token que a gente vai precisar, é a secret que a gente vai precisar criar dentro do nosso repositório para a gente conseguir viabilizar a integração aqui com a ferramenta, tá? Secret, Actions, e vai dar um New Repository Secret. Eu vou colar aquele valor que é basicamente o valor que eu peguei aqui, tá bom? e a gente vai pegar aqui também o nosso secret que a gente está referenciando e vai dar um nome para ele aqui bem coisa demais legal vamos dar um é de secret e agora a gente já tem esse secret cadastrado beleza que mais tá faltando tá faltando do docker hub né então a gente pode acessar aqui nossa página do blockerhub eu vou fazer login aqui beleza a gente vem aqui em my profile My Profile, na verdade vem aqui em Account Settings, e a gente vai ter aqui os nossos Personal Access Tokens, né? Então a gente vem nesse item, vou colocar aqui também Full Cycle, vou colocar permissões de read e write e vou dar um generate legal o que a gente tem aqui né a gente tem o nome do usuário ea gente tem o nosso personal access token. O que é que eu preciso fazer com isso? Se a gente for pegar aqui o nosso código, a gente está referenciando duas secrets, nosso username e o nosso token. Então vamos criar dentro do nosso repositório essas informações também aqui o username e cria do access token Beleza, Manuel. A gente está criando o local aqui, mas esse processo é muito manual, é muito trabalhoso, não faz sentido a gente ter que fazer isso para todos os nossos repositórios, né? Pô, realmente não faz sentido. Se a gente for pensar em uma empresa grande, né? Tipo, trabalhando de forma corporativa, o que a gente vai ter aqui, tá, pessoal? A gente vai ter basicamente dentro do GitHub, tipo, um organization, né? E a gente consegue distribuir essas secrets, a gente consegue,uir essas secrets, a gente consegue criar environments, fazer uma série de configurações, por exemplo, de proteção de branches, tudo a nível de organization. Então, vamos supor que a sua empresa utiliza Sonar também, seja Sonar Cloud ou algum setup privado e você já vai ter um token que você vai conseguir utilizar pra todo mundo então você só distribui você já tem sei lá, um registry tipo um Artifactory um ACR que todo mundo utiliza você consegue distribuir esses tokens pra todo mundo ou então você consegue distribuir esses tokens pra todo mundo ou então você consegue criar automações pra tipo, pensando aqui em uma cloud por exemplo, que cada um tenha seu ACR a gente consegue dentro do reusable ter uma role que a gente vai fazer uma sumi role buscar as credenciais e a gente conseguiria através tipo dessas informações também fazer as interações ali com o nosso registro para poder fazer o posto da imagem tá então assim existem n formas de configuração para o nosso lábio aqui a gente tá fazendo manual mas em uma empresa de forma corporativa isso daqui vai ser bem mais transparente tá beleza a gente cadastrou tudo a gente agora teoricamente conseguiria rodar os nossos os nossos steps aqui então o que que eu vou fazer eu vou mergear novamente essa informação e a gente deveria disparar uma nova action beleza, não teve dois fluxos rodando agora teve um só, que é o fluxo da main que é de publicação da imagem então se a gente olhar aqui os nossos repositories tem que aparecer um repository novo que é o que a gente for buildar aqui né vamos esperar concluir aqui todos os steps ele rodou o sonar baixou o sonar na verdade agora está rodando um scan legal, ele deu falha ah, tá bom ele deu falha porque ele falou o seguinte ele não conhece qual que é algumas informações de properties. Por exemplo, o Project Key e Sunor Organization, para ele poder estar vinculado lá certinho então se a gente vier aqui em My Projects por exemplo a gente tem esse cara aqui e a gente precisa falar pro Sonar né pra ele vir buscar esse cara então como que a gente faz isso tá a gente pode subir um arquivinho chamado sonar.projects ponto e dentro desse arquivinho de sonar o port a gente consegue passar algumas informações aqui para ele né então por exemplo qual que é o nosso project key qualquer nosso organization qual que é o project name a versão desse project name e até a versão, por exemplo, da linguagem que a gente está querendo utilizar aqui, né? Então, a gente buildou a imagem com o Python 3.12, só essas informações que a gente vai precisar atualizar. Então, vamos pegar o nosso project key aqui, colocar aqui em cima, nosso organization também é essa, né? Beleza, e o nosso project name aqui vai ser Python Image. Legal. Bom, vamos rodar. Teoricamente, isso aqui deveria ser o suficiente Para a gente conseguir passar com sucesso Nossa pipeline E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí E aí rodar todo o fluxo novamente. Então, ele vai rodar novamente aqui o nosso CI, vai fazer a abertura de um novo PR. Quando a gente tiver esse PR aberto aqui, a gente consegue fazer a execução da nossa pipeline, tá? Já passou o CI. fez a abertura aqui de novo pro request you you E aí Ah, deu um outro erro aqui pessoal. E isso aconteceu porque se a gente vier aqui dentro do nosso project, a gente consegue pegar o project key. E o project key não está dando match com o que a gente passou aqui né então o Project Key na verdade é o nome do organization underline o nome do project name vamos rodar novamente eu acho que agora vai passar com sucesso you you you you Beleza pessoal, deu um outro errinho aqui agora, ele está falando de estar utilizando aqui a análise de ICA de forma automática né tá habilitada a gente também tá executando ele aqui então se a gente vier aqui nas configurações do nosso projeto a gente consegue vir aqui administração análise estática e desmarcar nesse botão, a gente pode fazer um re-run e como a gente não está fazendo alteração de código, a gente pode fazer um re-run para poder fazer a validação aqui e se passa com sucesso. you you Legal, então todos os steps aqui passaram com sucesso. Vamos dar uma explorada um pouco mais aqui em cada uma delas se a gente for olhar aqui a etapa do e do sonar escando tá bastante verboso né mas a gente consegue ver que ele fez a análise aqui e aí no final e ele fala que passou com sucesso né a gente consegue olhar aqui também ele tá com status ok ele tem aqui as análises dos últimos requests né que foram feitas então aparentemente tá tudo bacana aqui e a gente fez aqui o docker login conseguiu fazer com sucesso o build também foi feito com sucesso publicação se a gente olhar aqui agora nosso repository a gente consegue ter a nossa imagem aqui de de python publicada aqui com o nosso chacomit tá bom, é isso o nosso chacomit tá bom é isso é tem bastante coisa que dá para incrementar nessa nesse tipo de pipeline mas acho que o que a gente conseguiu ver aqui já dá para ter um bom overview do potencial e do que a gente consegue explorar da ferramenta. Agora é continuar os estudos aqui em cima, explorar as outras possibilidades que a gente tem para a gente conseguir ter uma pipeline cada vez mais robusta, com mais etapas pensando em shift left.