⏱ Tempo de execução: ~65min.
Neste lab, você construirá uma esteira de desenvolvimento com o serviço OCI DevOps, que irá automatizar a entrega da aplicação MuShop, de forma conteinerizada, a um cluster Kubernetes na OCI!
Para aprofundar seu conhecimento neste serviço, acesse os links abaixo! 👇
Confira todo o passo-a-passo dessa implementação:
- Pre Reqs: Coletar dados necessários e configurar policies
- Passo 1: Espelhar um repo no github para o projeto OCI DevOps
- Passo 2: Criar pipeline de build e configurar criação da container image (CI)
- Passo 3: Configurar entrega da container image (CI)
- Passo 4: Criar pipeline de deploy e configurar entrega da aplicação ao cluster Kubernetes (CD)
- Passo 5: Criação dos triggers de início e de conexão dos pipelines de CI e de CD
- Passo 6: Validação da implementação
Vamos coletar alguns dados na tenancy da OCI que serão utilizados ao longo do laboratório. Recomendamos que os anote em um bloco de notas para ter sempre em mãos, de modo fácil. Serão coletados os seguintes dados:
Tenancy Namespace:
Auth Token:
Código da Região:
-
Faça o login em sua conta na OCI.
-
No menu do lado direto, no ícone do usuário, clique no nome da sua tenancy.
- Agora copie o namespace para o bloco de notas.
- No menu do lado direito, clique no ícone do usuário, e então no nome do seu usuário.
- Copie o dado destacado em vermelho e o insira no seu bloco de notas. Este será o seu 'username'.
- Depois, desça a página até visualizar 'Resources', então clique em Auth Tokens e em Generate Token, para gerar um novo token.
- Insira uma descrição.
- Salve o auth token gerado no bloco de notas.
-
Para a região US East (Ashburn): 'iad'.
-
Para a região de Brazil East (Sao Paulo): 'gru'.
-
Para as demais regiões, confira neste link.
-
Copie o valor correspondente à sua região para o bloco de notas.
Precisaremos criar dynamic groups e associar policies a estes, para que os recursos possam ter permissões para algumas execuções.
Para aprofundar seu conhecimento nestes serviços, acesse os links abaixo! 👇
- Na OCI, no menu de hambúrguer 🍔, acesse: Identity & Security → Identity → Compartments.
- Busque pelo compartment onde irá provisionar os recursos e copie o seu OCID.
- Na OCI, no menu de hambúrguer 🍔, acesse: Identity & Security → Identity → Dynamic Groups.
- Então, clique em Create Dynamic Group.
- Atribua um nome e uma descrição ao dg, insira as seguintes regras e clique em Create. Lembre-se de substituir
<seu-compartment-id>
.
Para inserir uma regra adicional, clique em '+ Additional Rule'.
Rule 1: Any {instance.compartment.id = '<seu-compartment-id>'}
Rule 2: Any {resource.type = 'cluster', resource.compartment.id = '<seu-compartment-id>'}
Rule 3: Any{resource.type = 'devopsbuildpipeline', resource.compartment.id = '<seu-compartment-id>'}
Rule 4: Any{resource.type = 'devopsdeploypipeline', resource.compartment.id = '<seu-compartment-id>'}
Rule 5: Any {resource.type = 'devopsdeploypipeline', resource.compartment.id = '<seu-compartment-id>'}
- No menu do lado esquerdo, clique em Policies e em Create Policy.
- Escolha o compartment 'root, atribua um nome e descrição ao conjunto de policies, marque a opção 'Show manual editor', insira as seguintes policies e clique em Create.
Lembre-se de substituir <seu-dg>
pelo nome do seu dynamic group.
Allow dynamic-group <seu-dg> to read metrics in tenancy
Allow dynamic-group <seu-dg> to read compartments in tenancy
Allow dynamic-group <seu-dg> to manage repos in tenancy
Allow dynamic-group <seu-dg> to manage devops-family in tenancy
Allow service vulnerability-scanning-service to read repos in tenancy
Allow service vulnerability-scanning-service to read compartments in tenancy
Allow dynamic-group <seu-dg> to use generic-artifacts in tenancy
É isso! Cumprimos todos os pré-requisitos para o laboratório! Vamos para os próximos passos!
- Crie um repo no github.
- Clique no ícone do seu perfil e em Settings.
- No menu do lado esquerdo, clique em Developer settings.
- Feito isto, clique em Personal access tokens e Generate new token.
- Insira uma nota descritiva e selecione o tempo de expiração que deseja. Para o escopo, selecione public_repo.
- Ao final da página, clique em Generate Token.
- Copie o token gerado.
Nesse momento, vamos provisionar um OCI Vault para armazenar o token gerado no GitHub como um vault secret. O OCI Vault é um serviço da OCI que permite o gerenciamento seguro de credenciais e de outros dados sensíveis com chaves de criptografia.
Para aprofundar seu conhecimento neste serviço, acesse os links abaixo! 👇
- Na OCI, no menu de hambúrguer 🍔, acesse: Identity & Security → Vault.
- Clique em Create Vault.
- Atribua um nome ao seu vault e clique em Create Vault.
- Para criar uma Master Encryption Key, clique em Create Key.
- Selecione o 'Protection Mode' como Software, atribua um nome à chave e clique em Create Key.
- Feito isto, clique em Secrets e em Create Secret.
- Atribua um nome ao secret, selecione a Master Encryption Key criada anteriormente, insira o Personal Access Token em 'Secrets Contents' e clique em Create Secret.
Nessa etapa, vamos criar um tópico para que o projeto do OCI DevOps possa enviar notificações de eventos de execução dos pipelines. Para isso, utilizaremos o serviço OCI Notifications!
Para aprofundar seu conhecimento neste serviço, acesse os links abaixo! 👇
- Na OCI, no menu de hambúrguer 🍔, acesse: Developer Services → Application Integration → Notifications.
- Então, clique em Create Topic.
- Atribua um nome ao tópico e clique em Create.
Nessa etapa, vamos então criar um projeto no OCI DevOps.
- Na OCI, no menu de hambúrguer 🍔, acesse: Developer Services → DevOps → Projects.
- No compartment correspondente, clique em Create DevOps Project.
- Atribua um nome ao projeto, selecione o Notification Topic criado anteriormente e clique em Create DevOps Project.
- No projeto criado, clique em Enable Log.
- Clique no seletor, na coluna 'Enable log'.
- Mantenha as configurações como padrão e clique em Enable Log.
Nessa etapa, vamos configurar propriamente a conexão do projeto do OCI DevOps ao repositório no GitHub.
- No menu do lado esquerdo, clique em External Connections.
- Clique em Create external connection.
- Atribua um nome à conexão, selecione o Vault e o Secret criados anteriormente, e clique em Create.
- Na página do projeto, clique em Code Repositories.
- Clique em Mirror repository.
- Selecione, em 'Connection', a conexão criada anteriormente, em 'Repository', o repo no GitHub, e então clique em Mirror Repository.
Com isso, concluímos o espelhamento do repo no GitHub para o projeto OCI DevOps! Podemos seguir agora com os próximos passos!
-
Retorne à página inicial do projeto OCI DevOps.
-
Clique em Create build pipeline.
- Preencha o formulário da seguinte forma, e clique em Create:
- Name: build
- Description: (Defina uma descrição qualquer).
- Acesse a aba de Build Pipeline, e clique em Add Stage.
- Selecione a opção Managed Build e clique Next.
- Preencha o formulário da seguinte forma:
- Stage Name: Criacao de container image
- Description: (Defina uma descrição qualquer).
- OCI build agent compute shape: Não alterar.
- Base container image: Não alterar.
- Build spec file path: Não alterar.
- Em Primary code repository, clique em Select.
- Selecione as opções abaixo e clique em Save.
- Source Connection type: GitHub
- Name: Selecione a conexão criada.
- Select Repository: Selecione o repo do github.
- Branch: main.
- Build source name: storefront
- Feito isto, clique em Add.
🤔 Neste momento é importante entender a forma como a ferramenta trabalha 📝.
- A ferramenta utiliza um documento no formato YAML para definir os passos que devem ser executados durante o processo de construção da aplicação.
- Por padrão este documento é chamado de build_spec.yaml e deve ser configurado previamente de acordo com as necessidades da aplicação.
- Os passos serão então executados por uma instância temporária (agent), que será provisionada no início de cada execução e destruída ao final do processo.
- 🧾 Documentação de como formatar o documento de build
- 📑 Documento utilizado neste workshop (build_spec.yaml)
- Na aba de Build Pipeline, clique no sinal de "+", abaixo do stage Criacao de container image, e em Add Stage.
- Selecione a opção Deliver Artifacts e clique em Next.
- Preencha o formulário como abaixo e clique em Create Artifact.
- Stage name: Entrega de Container Image
- Description: (Defina uma descrição qualquer).
- Preencha o formulário como abaixo e clique em Add.
- Name: mushop-demo
- Type: Container image repository
- Artifact Source:
<código-de-região>.ocir.io/<tenancy-namespace>/mushop-demo:${BUILDRUN_HASH}
- Replace parameters used in this artifact: Yes, substitute placeholders
- Finalmente, preencha como abaixo e clique em Add.
- Build config/result artifact name: mushop-demo
Isso conclui a parte de Build (CI) do projeto! Até aqui automatizamos a compilação do código, configuramos a criação da container image e também o seu armazenamento no container registry! Vamos agora para a parte de Deployment (CD)!
Nesse momento, iremos inicialmente criar o kubernetes secret, para permitir que o cluster colete a container image durante o deployment. Iremos criar o secret no namespace 'mushop'.
- No Cloud Shell, execute o seguinte comando:
kubectl create namespace mushop
- Copie o comando abaixo para o seu bloco de notas e o edite substituindo os campos destacados por '<>'.
kubectl create secret docker-registry ocisecret --docker-server=<código-da-região>.ocir.io --docker-username='<tenancy-namespace>/oracleidentitycloudservice/<e-mail>' --docker-password='<auth-token>' --docker-email='<e-mail>' -n mushop
- Então, no Cloud Shell, execute o comando anterior.
Vamos agora adicionar o cluster kubernetes como ambiente alvo no projeto OCI DevOps.
-
Retorne ao seu projeto DevOps clicando no menu hambúrguer 🍔 e acessando: Developer Services → DevOps → Projects.
-
No canto esquerdo, selecione Environments.
-
Clique em Create New Environment.
-
Preencha o formulário como abaixo e clique em Next.
- Environment type: Oracle Kubernetes Engine
- Name: OKE
- Description: OKE
- Selecione o cluster kubernetes, e clique em Create Envrinoment.
Nesse momento, vamos adicionar o arquivo deployment.yaml como artefato no OCI DevOps.
-
Copie o deployment.yaml para um novo bloco de notas.
-
Acesse o seu projeto DevOps clicando no menu hambúrguer 🍔 e acessando: Developer Services → DevOps → Projects.
-
No canto esquerdo selecione Artifacts em seguida em Add Artifact.
- Preencha o formulario como abaixo e clique em Add.
- Name: deployment.yaml
- Type: Kubernetes manifest
- Artifact Source: Inline
- Value: Cole o conteúdo do arquivo deployment.yaml
- Replace parameters used in this artifact: Yes, substitute placeholders
- No canto esquerdo, selecione Deployment Pipelines e, em seguida, clique em Create Pipeline.
- Preencha o formulário como abaixo e clique em Create pipeline.
- Pipeline name: deploy
- Description: (Defina uma descrição qualquer).
- Na aba de 'Pipeline', clique em Add Stage.
- Selecione a Opção Apply Manifest to your Kubernetes Cluster e clique em Next.
- Preencha o formulário da seguinte forma:
- Name: Deployment da Aplicacao
- Description: (Defina uma Descrição qualquer).
- Environment: OKE
- Clique em Select Artifact, e selecione deployment.yaml.
- Feito isto, insira 'mushop' em Override Kubernetes namespace e clique em Add.
Com isso finalizamos a parte de Deployment (CD) do nosso projeto! No passo a seguir vamos conectar ambos os pipelines, e definir um trigger para que o processo automatizado se inicie!
-
Retorne ao projeto clicando no 🍔 menu hambúrguer e acessando: Developer Services → DevOps → Projects.
-
No canto esquerdo selecione Triggers, e em seguida clique em Create Trigger.
- Preencha o formulário como abaixo e clique em Add action.
- Name: trigger-mushop
- Description: (Defina uma descrição qualquer).
- Source connection: GitHub
- Preencha o formulário como abaixo e clique em Save.
- Select Build Pipeline: build
- Event: Push (check)
- Source branch: main
- Então, clique em Create.
- Copie o 'Trigger URL' e o 'Trigger Secret' para um bloco de notas, então clique em Close.
Nesse momento, vamos então configurar o envio da notificação de push do repo no github para o OCI DevOps.
- No GitHub, acesse o seu repo e clique em Settings.
- No lado esquerdo, clique em Webhooks e, então, em Add webhook.
- Preencha o formulário como abaixo e clique em Add webhook.
- Payload URL: Copiado anteriormente
- Content type: application/json
- Secret: Copiado anteriormente
A partir desse momento, qualquer novo push feito no repositório do github iniciará o pipeline de build criado nesse workshop.
- Retorne à configuração do pipeline de build do projeto selecionando Build Pipelines → build.
- Na aba de Build Pipeline, clique no sinal de "+" abaixo do stage Entrega de Imagem de Container e clique em Add Stage.
- Selecione o item de Trigger Deployment, e clique em Next.
- Preencha o formulário como abaixo e clique em Add.
- Nome: Inicio de Deployment
- Description: (Defina uma descrição qualquer).
- Select deployment pipeline: deploy
Mantenha os demais campos sem alteração.
Parabéns por chegar até aqui!! Nosso pipeline já está pronto! No próximo passo iremos validar o projeto, checando se está tudo ok.
-
Retorne ao projeto clicando no 🍔 menu hambúrguer e acessando: Developer Services → DevOps → Projects.
-
Obtenha o código da aplicação MuShop (storefront) e realize o push para o seu repo pessoal, no GitHub.
https://github.com/PortoLucas1/mushop
-
No menu do lado esquerdo, selecione Build History.
-
Após um curto intervalo, você deverá visualizar que o build pipeline foi iniciado.
- O pipeline será executado assim como configurado e ativará o deployment pipeline conectado.
- Finalizadas as execuções, no Cloud Shell, no canto superior direito, execute o comando abaixo:
kubectl get svc -n mushop --field-selector metadata.name=svc-mushop-demo
- Você deverá obter o seguinte:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc-mushop-demo LoadBalancer 10.96.204.188 <external-ip> 8080:30204/TCP 176m
- Cole o ip do campo 'EXTERNAL-IP' no seu browser, seguido da porta 8080:
http://<external-ip>:8080
- Você deverá visualizar a aplicação implementada (de forma customizada)!
👏🏻 Parabéns!!! Você foi capaz de construir com sucesso um pipeline completo de DevOps na OCI para a aplicação MuShop! 🚀
PS: Caso tenha encontrado algum erro ou inconsistência neste guia, não deixe de nos informar! :)