CI/CD9 min de leitura

Laboratório Prático de CI/CD com Ferramentas Open Source

Estrutura do projeto

Diagrama da pipeline local de CI/CD

Neste laboratório, vamos montar um ambiente completo de CI/CD rodando totalmente local, usando ferramentas open source de nível enterprise — sem custos e sem depender de nuvem.


Pré-requisitos do ambiente

Ferramentas no host (Windows)

  • Docker Desktop
  • Kubernetes local (Kind)
  • kubectl
  • Helm
  • Git
  • Java 17

O que isso resolve?

Esse conjunto cria um ambiente enterprise-like, mas totalmente local — um CI/CD sem custos.

Docs oficiais:


1. Arquitetura do laboratório

Visão geral do fluxo CI/CD

Código → Github → Jenkins → Kaniko (CI) → Registry no Kubernetes → ArgoCD (CD) → Aplicação no Cluster

Fluxo Técnico Detalhado (Passo a Passo Real)

1️⃣ Developer → GitHub

  • Alteramos o código
  • Commit inclui: código Java, Dockerfile, Jenkinsfile e (opcional) helm/

Ponto crítico: Jenkinsfile versionado → pipeline imutável.


2️⃣ GitHub → Jenkins

  • Trigger via SCM Polling — como estamos rodando em localhost, o GitHub não consegue descobrir o Jenkins via webhook, por isso configuramos polling a cada 2 minutos.

3️⃣ Jenkins → Pod Efêmero (Kubernetes Plugin)

Pod gerado dinamicamente contendo:

  • jnlp — conecta ao controller
  • kaniko — build de imagem (alternativa moderna)

Decisão de arquitetura:

  • Sem Docker-in-Docker (DinD)
  • Sem privileged container
  • Totalmente cloud-native

4️⃣ Build da Aplicação

Dentro do pod:

mvn clean package -DskipTests

Resultado: JAR/WAR no workspace (emptyDir)


5️⃣ Build da Imagem com Kaniko

/kaniko/executor \
  --context=&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-variable&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-variable&quot;</span>&gt;<span class="hljs-variable">${WORKSPACE}</span>&lt;/span&gt;&amp;lt;/span&amp;gt; \
  --dockerfile=&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-variable&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-variable&quot;</span>&gt;<span class="hljs-variable">${WORKSPACE}</span>&lt;/span&gt;&amp;lt;/span&amp;gt;/Dockerfile \
  --destination=&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-variable&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-variable&quot;</span>&gt;<span class="hljs-variable">${REGISTRY_CI}</span>&lt;/span&gt;&amp;lt;/span&amp;gt;/&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-variable&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-variable&quot;</span>&gt;<span class="hljs-variable">${PROJECT}</span>&lt;/span&gt;&amp;lt;/span&amp;gt;/&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-variable&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-variable&quot;</span>&gt;<span class="hljs-variable">${IMAGE_NAME}</span>&lt;/span&gt;&amp;lt;/span&amp;gt;:&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-variable&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-variable&quot;</span>&gt;<span class="hljs-variable">${TAG}</span>&lt;/span&gt;&amp;lt;/span&amp;gt; \
  --insecure \
  --skip-tls-verify \
  --cleanup

📌 O que é Kaniko? Kaniko é uma ferramenta open source para criar imagens de contêineres a partir de um Dockerfile diretamente dentro de um contêiner ou cluster Kubernetes, sem depender de um daemon Docker. Ideal para ambientes de CI/CD seguros — ele executa cada comando no espaço do usuário, cria as camadas e empurra direto para o registry.


6️⃣ Push → Docker Registry

O registry local recebe a imagem com sua tag.


7️⃣ Docker Registry Local → ArgoCD → Kubernetes

O ArgoCD:

  • Observa alterações no repositório gitops-repo
  • Os manifests Kubernetes apontam para a imagem no registry: image: localhost:5000/cicd/cicd-api:30
  • Quando há mudança no Git: sincroniza o estado, aplica o Deployment e o Kubernetes faz o pull da imagem do registry no namespace cicd

👉 O ArgoCD não faz build — ele apenas aplica manifests. O build já foi feito pelo Kaniko.


2. Pré-requisitos do ambiente local

Infra base (máquina host):

  • Docker Desktop ou Podman
  • Kubernetes local: Kind (recomendado) ou k3d
  • kubectl
  • Helm 3.x
  • Java 17 (para Jenkins pipelines e apps Java)
  • Git
  • Conta no GitHub

3. Kubernetes local com Kind

Manual de instalação: kind.sigs.k8s.io

Se estiver usando WSL:

curl -Lo kind https://kind.sigs.k8s.io/dl/v0.31.0/kind-linux-amd64
&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-built_in&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">chmod</span>&lt;/span&gt;&amp;lt;/span&amp;gt; +x kind
&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-built_in&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">sudo</span>&lt;/span&gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-built_in&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">mv</span>&lt;/span&gt;&amp;lt;/span&amp;gt; kind /usr/local/bin/kind
kind version

O Kind (Kubernetes IN Docker) cria clusters Kubernetes usando containers Docker. É ideal para labs, CI pipelines e testes locais — rápido, descartável e reproduzível.

Criar o cluster

kind create cluster --name cicd-lab
kubectl cluster-info

Após o comando, você verá:

Set kubectl context to &amp;amp;quot;kind-cicd-lab&amp;amp;quot;
You can now use your cluster with: kubectl cluster-info --context kind-cicd-lab

Caso ocorra erro de versão (WSL/Docker Desktop)

Crie o arquivo kind-config.yaml:

<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;kind:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;Cluster&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;apiVersion:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;kind.x-k8s.io/v1alpha4&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;name:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;cicd-lab&amp;lt;/span&amp;gt;&lt;/span&gt;</span>

<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;nodes:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-bullet&amp;quot;&amp;gt;-&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;role:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;control-plane&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
    <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;image:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;kindest/node:v1.29.4&amp;lt;/span&amp;gt;&lt;/span&gt;</span>

<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;containerdConfigPatches:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-bullet&amp;quot;&amp;gt;-&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;|-&lt;/span&gt;</span>
    [<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;plugins.&amp;amp;quot;io.containerd.grpc.v1.cri&amp;amp;quot;.registry.mirrors.&amp;amp;quot;localhost:5000&amp;amp;quot;&lt;/span&gt;</span>]
    <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;endpoint&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;=&lt;/span&gt;</span> [<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;amp;quot;http://localhost:5000&amp;amp;quot;&lt;/span&gt;</span>]
    <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;insecure_skip_verify&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;=&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-literal&quot;&gt;true&lt;/span&gt;&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;</span>

Depois:

kind create cluster --config kind-config.yaml --&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-built_in&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">wait</span>&lt;/span&gt;&amp;lt;/span&amp;gt; 5m

4. Configurar namespace no Kubernetes

kubectl create namespace cicd

Saída esperada: namespace/cicd created

Por que usar namespaces? Eles permitem isolamento lógico, organização por responsabilidade e simulação de ambientes (dev, cicd, infra).

Docs: kubernetes.io/docs/.../namespaces


5. Registry no Kubernetes

Subimos um Docker Registry oficial (registry:2) como Deployment no namespace cicd.

Componentes:

  • Deployment: 1 réplica, porta 5000, hostPort: 5000 para expor diretamente no nó Kind
  • Volume: emptyDir (não persistente, suficiente para lab)
  • Service: Exposição interna no cluster (registry.cicd.svc.cluster.local:5000)

👉 Aqui o registry é um Pod Kubernetes, diferente do setup clássico com Docker externo.

Crie o arquivo registry.yaml:

<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;apiVersion:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;apps/v1&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;kind:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;Deployment&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;metadata:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;name:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;registry&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;namespace:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;cicd&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;spec:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;replicas:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-number&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;selector:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
    <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;matchLabels:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
      <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;app:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;registry&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;template:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
    <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;metadata:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
      <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;labels:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
        <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;app:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;registry&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
    <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;spec:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
      <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;containers:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
        <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-bullet&amp;quot;&amp;gt;-&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;name:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;registry&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
          <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;image:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;registry:2&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
          <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;ports:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
            <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-bullet&amp;quot;&amp;gt;-&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;containerPort:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-number&amp;quot;&amp;gt;5000&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
              <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;hostPort:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-number&amp;quot;&amp;gt;5000&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
          <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;volumeMounts:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
            <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-bullet&amp;quot;&amp;gt;-&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;name:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;registry-data&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
              <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;mountPath:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;/var/lib/registry&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
      <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;volumes:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
        <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-bullet&amp;quot;&amp;gt;-&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;name:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;registry-data&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
          <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;emptyDir:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> {}
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-meta&amp;quot;&amp;gt;---&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;apiVersion:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;v1&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;kind:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;Service&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;metadata:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;name:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;registry&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;namespace:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;cicd&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;spec:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;selector:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
    <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;app:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;registry&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;ports:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
    <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-bullet&amp;quot;&amp;gt;-&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;port:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-number&amp;quot;&amp;gt;5000&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
      <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;targetPort:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-number&amp;quot;&amp;gt;5000&amp;lt;/span&amp;gt;&lt;/span&gt;</span>

Aplique e valide:

kubectl apply -f registry.yaml
kubectl get pods -n cicd

Pods rodando no namespace cicd

O hostPort: 5000 permite que o registry seja acessado via http://localhost:5000, facilitando testes locais com curl e push de imagens sem NodePort ou Ingress.

⚠️ hostPort é aceitável em labs, não recomendado em produção.


6. Jenkins no Kubernetes

Utilize o projeto como base: github.com/guigomes91/cicd — e deixe uma ⭐!

Instalação via Helm

helm repo add jenkins https://charts.jenkins.io
helm repo update

helm install jenkins jenkins/jenkins \
  -n cicd \
  --&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-built_in&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">set</span>&lt;/span&gt;&amp;lt;/span&amp;gt; controller.serviceType=NodePort

Por que NodePort no lab?

Item Situação
Kubernetes Kind (local)
Infra Docker Desktop + WSL2
LoadBalancer ❌ Não existe
Ingress Controller ❌ Ainda não instalado

Em produção, o padrão é:

Ambiente Exposição
Dev local NodePort
Staging Ingress
Produção Ingress + TLS + LB

Acessar o Jenkins

kubectl get svc -n cicd
&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;# jenkins   NodePort   ...   8080:30170/TCP&amp;lt;/span&amp;gt;

kubectl port-forward -n cicd svc/jenkins 8080:8080

Acesse: http://localhost:8080

Senha inicial do Jenkins

kubectl &amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-built_in&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">exec</span>&lt;/span&gt;&amp;lt;/span&amp;gt; -n cicd deploy/jenkins -c jenkins -- &amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-built_in&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">cat</span>&lt;/span&gt;&amp;lt;/span&amp;gt; /run/secrets/additional/chart-admin-password

&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;# Alternativa:&amp;lt;/span&amp;gt;
kubectl get secret -n cicd jenkins -o jsonpath=&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-string&amp;quot;&lt;/span&gt;&amp;gt;&amp;amp;quot;{.data.jenkins-admin-password}&amp;amp;quot;&amp;lt;/span&amp;gt; | &amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-built_in&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">base64</span>&lt;/span&gt;&amp;lt;/span&amp;gt; -d

Tela de login do Jenkins

Criando o Pipeline

Clique em + Nova tarefa:

Menu Nova Tarefa no Jenkins

Formulário de criação de nova tarefa

Informe o nome da tarefa (ex: cicd-api) e selecione Pipeline. Após criada, clique no link do job e depois em Configurar:

Dashboard do pipeline cicd-lab

Menu de configuração do pipeline

Na seção Triggers, marque Consultar periodicamente o SCM e configure o agendamento:

Configuração do SCM Polling

Na seção Pipeline, em Definition selecione Pipeline script from SCM:

Configuração Pipeline script from SCM

Informe a URL do repositório e a branch (ex: master):

Configuração do repositório Git

Em Script Path, deixe Jenkinsfile e clique em Save:

Script Path apontando para Jenkinsfile

O que o Jenkins faz?

O Jenkins é o motor de CI: executa pipelines, compila código, roda testes, builda imagens Docker e publica artefatos. Ele não faz deploy — prepara tudo para o CD.

Docs: jenkins.io/doc | Helm Chart


Configurar SSH para o Kaniko atualizar o GitOps repo

Para o Kaniko atualizar o Deployment no repositório gitops-repo, é necessário configurar autenticação SSH dentro do pod, pois:

  • ❌ O container do Jenkins não conhece o host github.com
  • Não existe chave SSH válida dentro do pod
  • ➡️ Cada pod é um ambiente totalmente limpo

Crie um secret no namespace cicd com o nome jenkins-gitops-ssh:

&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-built_in&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">sudo</span>&lt;/span&gt;&amp;lt;/span&amp;gt; nano jenkins-gitops-ssh.yaml
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;apiVersion:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;v1&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;kind:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;Secret&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;metadata:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;name:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;jenkins-gitops-ssh&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;namespace:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;cicd&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;type:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;Opaque&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;data:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;id_ed25519:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;&amp;amp;lt;BASE64_DA_CHAVE_PRIVADA&amp;amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;known_hosts:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;&amp;amp;lt;BASE64_DO_KNOWN_HOSTS&amp;amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;</span>

Verificar chaves existentes:

&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-built_in&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">ls</span>&lt;/span&gt;&amp;lt;/span&amp;gt; -l ~/.ssh

Se não existir nenhuma chave, gere uma ED25519:

ssh-keygen -t ed25519 -C &amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-string&amp;quot;&lt;/span&gt;&amp;gt;&amp;amp;quot;jenkins-gitops&amp;amp;quot;&amp;lt;/span&amp;gt;
&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;# Pressione ENTER em todas as perguntas, sem senha&amp;lt;/span&amp;gt;

Gerar os valores Base64:

&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;# Chave privada&amp;lt;/span&amp;gt;
&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-built_in&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">base64</span>&lt;/span&gt;&amp;lt;/span&amp;gt; -w 0 ~/.ssh/id_ed25519

&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;# Known hosts &lt;span class=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">do</span>&lt;/span&gt; GitHub&amp;lt;/span&amp;gt;
ssh-keyscan github.com &amp;amp;gt; /tmp/known_hosts
&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-built_in&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">base64</span>&lt;/span&gt;&amp;lt;/span&amp;gt; -w 0 /tmp/known_hosts

Adicionar a chave pública no GitHub:

  • Repositório gitops-repoSettings → Deploy Keys
  • Marcar ✅ Allow write access

Aplique o secret:

kubectl apply -f jenkins-gitops-ssh.yaml

&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;# Validar&amp;lt;/span&amp;gt;
kubectl get secret jenkins-gitops-ssh -n cicd -o yaml

7. ArgoCD

&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;# Criar namespace&amp;lt;/span&amp;gt;
kubectl create namespace argocd

&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;# Aplicar manifests oficiais&amp;lt;/span&amp;gt;
kubectl apply -n argocd \
  -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;# Aguardar pods&amp;lt;/span&amp;gt;
kubectl get pods -n argocd

Acesso à interface web

kubectl port-forward svc/argocd-server -n argocd 8083:443

Acesse: https://localhost:8083 — usuário: admin

Recuperar senha inicial:

kubectl -n argocd get secret argocd-initial-admin-secret \
  -o jsonpath=&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-string&amp;quot;&lt;/span&gt;&amp;gt;&amp;amp;quot;{.data.password}&amp;amp;quot;&amp;lt;/span&amp;gt; | &amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-built_in&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">base64</span>&lt;/span&gt;&amp;lt;/span&amp;gt; -d

Após o primeiro login, altere a senha.

Criando uma Application (GitOps)

Repositório de exemplo: gitops-repo/cicd-api/app/deployment.yaml

&amp;lt;span class=&lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-built_in&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">sudo</span>&lt;/span&gt;&amp;lt;/span&amp;gt; nano application-argocd.yaml
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;apiVersion:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;argoproj.io/v1alpha1&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;kind:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;Application&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;metadata:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;name:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;cicd-api&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;namespace:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;argocd&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
<span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;spec:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;project:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;default&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;source:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
    <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;repoURL:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;https://github.com/seu-user/gitops-repo.git&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
    <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;targetRevision:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;master&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
    <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;path:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;cicd-api/app&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;destination:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
    <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;server:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;https://kubernetes.default.svc&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
    <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;namespace:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-string&amp;quot;&amp;gt;cicd-api&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
  <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;syncPolicy:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
    <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;automated:&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
      <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;prune:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-literal&amp;quot;&amp;gt;true&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
      <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-attr&amp;quot;&amp;gt;selfHeal:&amp;lt;/span&amp;gt;&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;&amp;lt;span&lt;/span&gt;</span> <span class="hljs-string">&lt;span</span> <span class="hljs-string">class=&quot;hljs-string&quot;&gt;class=&amp;quot;hljs-literal&amp;quot;&amp;gt;true&amp;lt;/span&amp;gt;&lt;/span&gt;</span>
kubectl apply -f application-argocd.yaml

Após isso, a aplicação aparece no dashboard do ArgoCD e qualquer alteração no Git é refletida no cluster.

Regra fundamental do GitOps

Nunca altere recursos diretamente no cluster. Qualquer mudança via kubectl edit ou apply será revertida para o estado definido no Git.

Validar sincronização:

kubectl get applications -n argocd

Ou acompanhe na interface web — Status: Synced | Health: Healthy

ArgoCD mostrando aplicação cicd-api Healthy e Synced

☝️ O ponto-chave: O ArgoCD não faz build, não baixa imagem e não decide registry. Ele faz apenas uma coisa: aplica no Kubernetes exatamente o que está no Git. Quem decide de onde vem a imagem é exclusivamente o Deployment.


8. Aplicação de exemplo (Java Spring Boot)

Repositório: github.com/guigomes91/cicd

app/
 ├── Dockerfile
 ├── Jenkinsfile
 ├── pom.xml
 └── src/

Dockerfile:

FROM eclipse-temurin:17-jre
COPY target/app.jar app.jar
ENTRYPOINT [&amp;amp;quot;java&amp;amp;quot;,&amp;amp;quot;-jar&amp;amp;quot;,&amp;amp;quot;/app.jar&amp;amp;quot;]

9. Cenários práticos para treino

Exercício 1 – CI

  • Faça um commit que quebra o build
  • Valide a falha no Jenkins

Exercício 2 – CD

  • Suba uma nova imagem e observe o deploy automático
  • Acompanhe o rollout no Kubernetes:
kubectl rollout status deployment cicd-api

Exercício 3 – Rollback

kubectl rollout undo deployment cicd-api

10. Evoluções do laboratório

Depois do básico, você pode adicionar:

  • SonarQube — quality gate
  • Trivy — scan de imagem
  • Prometheus + Grafana — observabilidade
  • Feature flags
  • Separação de namespace por ambiente — dev, homolog e produção
  • Multi-branch pipeline — separação por branch (dev, hml, prod)

11. Resultado final

Ao final do laboratório, você terá praticado:

  • ✅ CI real com Jenkins
  • ✅ Docker Registry local no Kubernetes
  • ✅ Deploy via ArgoCD (GitOps)
  • ✅ Kubernetes local com Kind
  • ✅ Rollout, rollback e versionamento de imagens

Publicado por: Guilherme Gomes - 02/05/2026 20:29

← Voltar aos Artigos