Ferramentas & Produtividade

DevOps: Do Básico ao Avançado

10 min de leitura

DevOps: Do Básico ao Avançado

O que é DevOps e Por Que Importa DevOps é uma cultura que unifica desenvolvimento (Dev) e operações (Ops), quebrando silos organizacionais e promovendo colaboração contínua. O objetivo é acelerar a entrega de software com qualidade, automatizando processos desde o código até a produção. Não é apenas uma ferramenta ou cargo, mas uma mentalidade que valoriza comunicação, automação, medição e compartilhamento (CAMS). Na prática, DevOps resolve problemas clássicos: deploys demorados, ambientes inconsistentes, falta de visibilidade sobre falhas e sobrecarga operacional. Empresas que adotam DevOps reduzem o tempo de lançamento de funcionalidades de semanas para horas, aumentam a taxa de sucesso de deploys e respondem a incidentes mais rapidamente. Princípios Fundamentais Integração e Entrega Contínua (CI/CD): automatizar build, testes e deploy Infraestrutura como Código (IaC): versionar e automatizar infraestrutura Monitoramento e Feedback: observabilidade em tempo real Colaboração: times multifuncionais com responsabilidade compartilhada CI/CD: Automatizando o Pipeline CI/CD é o coração do DevOps. Integração Contínua (CI) automatiza a compilação e testes a

<h2>O que é DevOps e Por Que Importa</h2>

<p>DevOps é uma cultura que unifica desenvolvimento (Dev) e operações (Ops), quebrando silos organizacionais e promovendo colaboração contínua. O objetivo é acelerar a entrega de software com qualidade, automatizando processos desde o código até a produção. Não é apenas uma ferramenta ou cargo, mas uma mentalidade que valoriza comunicação, automação, medição e compartilhamento (CAMS).</p>

<p>Na prática, DevOps resolve problemas clássicos: deploys demorados, ambientes inconsistentes, falta de visibilidade sobre falhas e sobrecarga operacional. Empresas que adotam DevOps reduzem o tempo de lançamento de funcionalidades de semanas para horas, aumentam a taxa de sucesso de deploys e respondem a incidentes mais rapidamente.</p>

<h3>Princípios Fundamentais</h3>

<ul>

<li><strong>Integração e Entrega Contínua (CI/CD)</strong>: automatizar build, testes e deploy</li>

<li><strong>Infraestrutura como Código (IaC)</strong>: versionar e automatizar infraestrutura</li>

<li><strong>Monitoramento e Feedback</strong>: observabilidade em tempo real</li>

<li><strong>Colaboração</strong>: times multifuncionais com responsabilidade compartilhada</li>

</ul>

<h2>CI/CD: Automatizando o Pipeline</h2>

<p>CI/CD é o coração do DevOps. <strong>Integração Contínua</strong> (CI) automatiza a compilação e testes a cada commit, detectando bugs cedo. <strong>Entrega Contínua</strong> (CD) garante que o código esteja sempre pronto para deploy, enquanto <strong>Deploy Contínuo</strong> automatiza o envio para produção.</p>

<p>Ferramentas populares incluem Jenkins, GitLab CI, GitHub Actions e CircleCI. Vamos criar um pipeline completo com GitHub Actions que testa e faz deploy de uma aplicação Node.js:</p>

<pre><code class="language-yaml"># .github/workflows/ci-cd.yml

name: CI/CD Pipeline

on:

push:

branches: [main]

pull_request:

branches: [main]

jobs:

test:

runs-on: ubuntu-latest

steps:

  • uses: actions/checkout@v3
  • name: Setup Node.js

uses: actions/setup-node@v3

with:

node-version: &#039;18&#039;

cache: &#039;npm&#039;

  • name: Install dependencies

run: npm ci

  • name: Run tests

run: npm test

  • name: Run linter

run: npm run lint

build-and-deploy:

needs: test

runs-on: ubuntu-latest

if: github.ref == &#039;refs/heads/main&#039;

steps:

  • uses: actions/checkout@v3
  • name: Build Docker image

run: docker build -t myapp:${{ github.sha }} .

  • name: Login to Docker Hub

uses: docker/login-action@v2

with:

username: ${{ secrets.DOCKER_USERNAME }}

password: ${{ secrets.DOCKER_PASSWORD }}

  • name: Push image

run: |

docker tag myapp:${{ github.sha }} myuser/myapp:latest

docker push myuser/myapp:latest

  • name: Deploy to production

run: |

kubectl set image deployment/myapp \

myapp=myuser/myapp:latest \

--record</code></pre>

<p>Este pipeline executa testes em cada push, constrói a imagem Docker apenas na branch principal e faz deploy automático no Kubernetes. A separação em jobs garante que o deploy só ocorra se os testes passarem.</p>

<h3>Estratégias de Deploy Avançadas</h3>

<p><strong>Blue-Green Deployment</strong>: mantém dois ambientes idênticos (blue e green). O tráfego é redirecionado instantaneamente entre eles, permitindo rollback imediato.</p>

<p><strong>Canary Deployment</strong>: libera gradualmente para uma pequena porcentagem de usuários antes do rollout completo, reduzindo riscos.</p>

<pre><code class="language-yaml"># Exemplo de Canary com Kubernetes e Istio

apiVersion: networking.istio.io/v1beta1

kind: VirtualService

metadata:

name: myapp-canary

spec:

hosts:

  • myapp.example.com

http:

  • match:
  • headers:

user-type:

exact: beta

route:

  • destination:

host: myapp

subset: v2

  • route:
  • destination:

host: myapp

subset: v1

weight: 90

  • destination:

host: myapp

subset: v2

weight: 10</code></pre>

<h2>Infraestrutura como Código com Terraform</h2>

<p>IaC trata infraestrutura como software versionado, reproduzível e testável. Terraform é a ferramenta líder, usando HCL (HashiCorp Configuration Language) para declarar recursos em múltiplos provedores de nuvem.</p>

<p>Um exemplo real provisionando infraestrutura AWS completa:</p>

<pre><code class="language-hcl"># main.tf

terraform {

required_providers {

aws = {

source = &quot;hashicorp/aws&quot;

version = &quot;~&gt; 5.0&quot;

}

}

backend &quot;s3&quot; {

bucket = &quot;terraform-state-prod&quot;

key = &quot;infrastructure/terraform.tfstate&quot;

region = &quot;us-east-1&quot;

}

}

provider &quot;aws&quot; {

region = var.aws_region

}

VPC e networking

resource &quot;aws_vpc&quot; &quot;main&quot; {

cidr_block = &quot;10.0.0.0/16&quot;

enable_dns_hostnames = true

tags = {

Name = &quot;production-vpc&quot;

Environment = &quot;production&quot;

}

}

resource &quot;aws_subnet&quot; &quot;public&quot; {

count = 2

vpc_id = aws_vpc.main.id

cidr_block = &quot;10.0.${count.index + 1}.0/24&quot;

availability_zone = data.aws_availability_zones.available.names[count.index]

map_public_ip_on_launch = true

}

EKS Cluster

resource &quot;aws_eks_cluster&quot; &quot;main&quot; {

name = &quot;production-cluster&quot;

role_arn = aws_iam_role.eks_cluster.arn

version = &quot;1.28&quot;

vpc_config {

subnet_ids = aws_subnet.public[*].id

}

depends_on = [

aws_iam_role_policy_attachment.eks_cluster_policy

]

}

Node Group

resource &quot;aws_eks_node_group&quot; &quot;main&quot; {

cluster_name = aws_eks_cluster.main.name

node_group_name = &quot;production-nodes&quot;

node_role_arn = aws_iam_role.eks_nodes.arn

subnet_ids = aws_subnet.public[*].id

scaling_config {

desired_size = 3

max_size = 5

min_size = 2

}

instance_types = [&quot;t3.medium&quot;]

}

Outputs para usar em outros módulos

output &quot;cluster_endpoint&quot; {

value = aws_eks_cluster.main.endpoint

}

output &quot;cluster_name&quot; {

value = aws_eks_cluster.main.name

}</code></pre>

<p>Comandos essenciais do Terraform:</p>

<pre><code class="language-bash"># Inicializar e baixar providers

terraform init

Planejar mudanças (dry-run)

terraform plan

Aplicar mudanças

terraform apply

Destruir recursos

terraform destroy

Importar recurso existente

terraform import aws_instance.example i-1234567890abcdef0</code></pre>

<p>O uso de módulos reutilizáveis e remote state (S3 backend) permite colaboração eficiente entre times. Sempre versione código IaC no Git e use pull requests com <code>terraform plan</code> nos comentários.</p>

<h2>Observabilidade: Monitoramento e Logging</h2>

<p>Observabilidade vai além de monitoramento tradicional, combinando métricas, logs e traces distribuídos. O stack mais usado é Prometheus (métricas), Grafana (visualização), Loki (logs) e Jaeger (tracing).</p>

<h3>Implementando Métricas com Prometheus</h3>

<pre><code class="language-python"># app.py - Aplicação Flask com métricas Prometheus

from flask import Flask, request

from prometheus_client import Counter, Histogram, generate_latest

import time

app = Flask(__name__)

Métricas customizadas

REQUEST_COUNT = Counter(

&#039;http_requests_total&#039;,

&#039;Total de requisições HTTP&#039;,

[&#039;method&#039;, &#039;endpoint&#039;, &#039;status&#039;]

)

REQUEST_DURATION = Histogram(

&#039;http_request_duration_seconds&#039;,

&#039;Duração das requisições HTTP&#039;,

[&#039;method&#039;, &#039;endpoint&#039;]

)

@app.before_request

def before_request():

request.start_time = time.time()

@app.after_request

def after_request(response):

duration = time.time() - request.start_time

REQUEST_DURATION.labels(

method=request.method,

endpoint=request.path

).observe(duration)

REQUEST_COUNT.labels(

method=request.method,

endpoint=request.path,

status=response.status_code

).inc()

return response

@app.route(&#039;/api/users&#039;)

def get_users():

return {&#039;users&#039;: [&#039;Alice&#039;, &#039;Bob&#039;]}

@app.route(&#039;/metrics&#039;)

def metrics():

return generate_latest()

if __name__ == &#039;__main__&#039;:

app.run(host=&#039;0.0.0.0&#039;, port=5000)</code></pre>

<p>Configuração do Prometheus para scraping:</p>

<pre><code class="language-yaml"># prometheus.yml

global:

scrape_interval: 15s

evaluation_interval: 15s

scrape_configs:

  • job_name: &#039;flask-app&#039;

static_configs:

  • targets: [&#039;app:5000&#039;]

metrics_path: &#039;/metrics&#039;

  • job_name: &#039;kubernetes-pods&#039;

kubernetes_sd_configs:

  • role: pod

relabel_configs:

  • source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]

action: keep

regex: true</code></pre>

<h3>Alertas Inteligentes</h3>

<pre><code class="language-yaml"># alerts.yml - Regras de alerta Prometheus

groups:

  • name: application_alerts

interval: 30s

rules:

  • alert: HighErrorRate

expr: |

rate(http_requests_total{status=~&quot;5..&quot;}[5m])

/ rate(http_requests_total[5m]) &gt; 0.05

for: 5m

labels:

severity: critical

annotations:

summary: &quot;Taxa de erro alta em {{ $labels.instance }}&quot;

description: &quot;{{ $value | humanizePercentage }} de erros nos últimos 5 minutos&quot;

  • alert: PodCrashLooping

expr: rate(kube_pod_container_status_restarts_total[15m]) &gt; 0

for: 5m

labels:

severity: warning

annotations:

summary: &quot;Pod {{ $labels.pod }} reiniciando continuamente&quot;</code></pre>

<h2>Conclusão</h2>

<ul>

<li><strong>DevOps é cultura antes de tecnologia</strong>: CI/CD, IaC e observabilidade são ferramentas que viabilizam colaboração, automação e feedback contínuo entre desenvolvimento e operações</li>

<li><strong>Automatize tudo</strong>: desde testes unitários até provisionamento de infraestrutura, automação reduz erros humanos e acelera entregas com qualidade consistente</li>

<li><strong>Meça para melhorar</strong>: observabilidade com métricas, logs e traces permite decisões baseadas em dados reais, identificando gargalos e antecipando problemas antes de impactar usuários</li>

</ul>

<h2>Referências</h2>

<ul>

<li><a href="https://www.amazon.com.br/DevOps-Handbook-World-Class-Reliability-Organizations/dp/1942788002" target="_blank" rel="noopener noreferrer">The DevOps Handbook - Gene Kim et al.</a></li>

<li><a href="https://developer.hashicorp.com/terraform/docs" target="_blank" rel="noopener noreferrer">Terraform Documentation - HashiCorp</a></li>

<li><a href="https://prometheus.io/docs/practices/naming/" target="_blank" rel="noopener noreferrer">Prometheus Best Practices</a></li>

<li><a href="https://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/" target="_blank" rel="noopener noreferrer">Kubernetes Documentation - CI/CD</a></li>

<li><a href="https://docs.github.com/en/actions" target="_blank" rel="noopener noreferrer">GitHub Actions Documentation</a></li>

</ul>

Comentários

Mais em Ferramentas & Produtividade

Microsserviços: Do Básico ao Avançado
Microsserviços: Do Básico ao Avançado

Fundamentos de Microsserviços Microsserviços representam um padrão arquitetur...

O que Todo Dev Deve Saber sobre Observabilidade
O que Todo Dev Deve Saber sobre Observabilidade

O que é Observabilidade? Observabilidade é a capacidade de entender o estado...

Mensageria Assíncrona na Prática
Mensageria Assíncrona na Prática

O que é Mensageria Assíncrona e Por Que Importa Mensageria assíncrona é um pa...