Comandos essenciais para integração contínua, entrega contínua e automação de pipelines
📖 Definição
CI/CD (Continuous Integration/Continuous Deployment) é um conjunto de práticas e ferramentas que automatizam o processo de build, teste e deploy de software. Permite entregas mais rápidas, consistentes e com menor risco de erros humanos.
💪 Por que aprender?
• Automated builds and testing
• Continuous integration
• Continuous deployment/delivery
• Infrastructure as code
• Pipeline orchestration
🚀 O que você pode fazer?
• Software development
• DevOps teams
• Cloud deployments
• Microservices architecture
• Enterprise applications
Jenkins, GitLab, GitHub
Automation, IaC
AWS, Azure, GCP
Containers, Kubernetes
🔧 Jenkins Básico
Comandos essenciais do Jenkins para automação de builds
📋Jenkinsfile
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
}
}# Pipeline básico com estágio de build
pipeline {
agent { docker 'maven:3.6.3-jdk-8' }
stages {
stage('Test') {
steps {
sh 'mvn test'
}
}
}
}# Pipeline com agente Docker para testes
📋Comandos Jenkins CLI
java -jar jenkins-cli.jar -s http://jenkins:8080 list-jobs# Lista jobs
java -jar jenkins-cli.jar -s http://jenkins:8080 build job-name# Executa job
java -jar jenkins-cli.jar -s http://jenkins:8080 console job-name# Logs do job
java -jar jenkins-cli.jar -s http://jenkins:8080 safe-restart# Reinicia seguro
📋Plugins
java -jar jenkins-cli.jar -s http://jenkins:8080 list-plugins# Lista plugins
java -jar jenkins-cli.jar -s http://jenkins:8080 install-plugin plugin.hpi# Instala plugin
java -jar jenkins-cli.jar -s http://jenkins:8080 restart# Reinicia Jenkins
🐙 GitHub Actions Básico
Workflows essenciais do GitHub Actions
📋Workflow Básico
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: '16'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test# Workflow básico de CI
📋Build e Deploy
name: Build and Deploy
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build Docker image
run: docker build -t myapp .
- name: Push to registry
run: docker push myregistry/myapp# Build e deploy de imagem Docker
📋Secrets e Variáveis
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy to production
env:
API_KEY: ${{ secrets.API_KEY }}
DEPLOY_URL: ${{ secrets.DEPLOY_URL }}
run: |
curl -X POST $DEPLOY_URL \
-H "Authorization: Bearer $API_KEY"# Uso de secrets e variáveis de ambiente
🦊 GitLab CI Básico
Configurações essenciais do GitLab CI
📋.gitlab-ci.yml Básico
stages:
- build
- test
- deploy
build:
stage: build
script:
- echo "Building..."
- npm run build
artifacts:
paths:
- dist/
test:
stage: test
script:
- npm test# Pipeline básico com build, test e deploy
📋Cache e Dependências
variables:
NODE_CACHE: "$CI_PROJECT_DIR/.npm"
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- .npm/
before_script:
- npm ci --cache .npm --prefer-offline# Configuração de cache para dependências
📋Docker Build
build:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA} .
- docker push ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}
only:
- main# Build e push de imagem Docker
🏗️ Terraform Básico
Comandos fundamentais do Terraform
📋Comandos Básicos
terraform init# Inicializa projeto
terraform plan# Mostra mudanças
terraform apply# Aplica mudanças
terraform destroy# Destrói recursos
terraform validate# Valida sintaxe
terraform fmt# Formata código
📋Workspace Management
terraform workspace new dev# Cria workspace
terraform workspace select dev# Seleciona workspace
terraform workspace list# Lista workspaces
terraform workspace delete dev# Remove workspace
🐳 Docker CI/CD Básico
Comandos essenciais para Docker em CI/CD
📋Dockerfile
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["npm", "start"]# Dockerfile básico para aplicação Node.js
📋Build Commands
docker build -t myapp:latest .# Build imagem
docker build -t myapp:v1.0 -t myapp:latest .# Múltiplas tags
docker build --build-arg NODE_ENV=production -t myapp .# Build args
docker build --no-cache -t myapp .# Sem cache
📋Registry Push
docker login registry.example.com# Login registry
docker tag myapp:latest registry.example.com/myapp:latest# Tag para push
docker push registry.example.com/myapp:latest# Push imagem
🔧 Jenkins Intermediário
Recursos intermediários do Jenkins
📋Pipeline Multibranch
pipeline {
agent any
triggers {
pollSCM('H/5 * * * *')
}
stages {
stage('Checkout') {
steps {
git branch: 'main', url: 'https://github.com/user/repo.git'
}
}
}
}# Pipeline com trigger SCM polling
📋Parallel Stages
pipeline {
agent any
stages {
stage('Test') {
parallel {
stage('Unit Tests') {
steps { sh 'mvn test' }
}
stage('Integration Tests') {
steps { sh 'mvn verify' }
}
}
}
}
}# Execução paralela de estágios
📋Deploy com Parâmetros
pipeline {
agent any
parameters {
string(name: 'ENVIRONMENT', defaultValue: 'dev')
}
stages {
stage('Deploy') {
steps {
sh "deploy.sh ${params.ENVIRONMENT}"
}
}
}
}# Pipeline com parâmetros configuráveis
🐙 GitHub Actions Intermediário
Recursos intermediários do GitHub Actions
📋Matrix Strategy
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x, 16.x, 18.x]
os: [ubuntu-latest, windows-latest]
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}# Execução em matriz de configurações
📋Cache de Dependências
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Cache node modules
uses: actions/cache@v2
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-# Cache inteligente de dependências
🦊 GitLab CI Intermediário
Recursos intermediários do GitLab CI
📋Deploy com Ambiente
deploy_staging:
stage: deploy
script:
- echo "Deploying to staging..."
- rsync -avz dist/ user@staging:/var/www/
environment:
name: staging
url: https://staging.example.com
only:
- main# Deploy para ambiente staging
📋Testes Paralelos
test:
stage: test
parallel: 4
script:
- npm run test -- --shard=${CI_NODE_INDEX}/${CI_NODE_TOTAL}
artifacts:
reports:
junit: test-results/junit.xml# Execução paralela de testes
⛵ ArgoCD Intermediário
Recursos intermediários do ArgoCD
📋Instalação ArgoCD
kubectl create namespace argocd# Cria namespace
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml# Instala ArgoCD
kubectl get pods -n argocd# Verifica instalação
kubectl port-forward svc/argocd-server -n argocd 8080:443# Acesso UI
📋ArgoCD CLI
argocd login localhost:8080# Login CLI
argocd app list# Lista aplicações
argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default# Cria aplicação
argocd app sync guestbook# Sincroniza app
📋Application YAML
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/user/my-app.git
targetRevision: HEAD
path: manifests
destination:
server: https://kubernetes.default.svc
namespace: my-app
syncPolicy:
automated:
prune: true
selfHeal: true# Definição de aplicação ArgoCD
🏗️ Terraform Intermediário
Recursos intermediários do Terraform
📋State Management
terraform state list# Lista recursos
terraform state show aws_instance.web# Mostra recurso
terraform state rm aws_instance.old# Remove do state
terraform import aws_instance.web i-123456# Importa recurso
📋Modules
module "vpc" {
source = "./modules/vpc"
cidr_block = "10.0.0.0/16"
}# Uso de módulos
terraform get# Baixa modules
terraform graph# Gera grafo de dependências
📋Variables e Outputs
variable "instance_type" {
description = "EC2 instance type"
type = string
default = "t3.micro"
}# Definição de variável
output "instance_ip" {
description = "Public IP of EC2 instance"
value = aws_instance.web.public_ip
}# Definição de output
terraform apply -var="instance_type=t3.large"# Variável inline
terraform apply -var-file="prod.tfvars"# Arquivo de variáveis
🐳 Docker CI/CD Intermediário
Recursos intermediários de Docker em CI/CD
📋Multi-stage Build
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]# Build multi-stage para otimização
📋docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
depends_on:
- db
db:
image: postgres:13
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass# Compose com aplicação e banco
📋CI/CD Commands
docker-compose -f docker-compose.yml -f docker-compose.prod.yml build# Build múltiplos
docker-compose up -d# Start detached
docker-compose down# Stop e remove
docker-compose logs -f app# Logs em tempo real
🔧 Jenkins Avançado
Recursos avançados do Jenkins
📋Notificações
pipeline {
agent any
post {
success {
slackSend(channel: '#deployments', message: 'Deploy successful!')
}
failure {
mail to: 'team@example.com', subject: 'Build Failed'
}
}
}# Configuração de notificações
🐙 GitHub Actions Avançado
Recursos avançados do GitHub Actions
📋Deploy Multi-Ambiente
name: Deploy
on:
workflow_dispatch:
inputs:
environment:
description: 'Target environment'
required: true
default: 'staging'
type: choice
options:
- staging
- production
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy to ${{ github.event.inputs.environment }}
run: ./deploy.sh ${{ github.event.inputs.environment }}# Deploy manual com seleção de ambiente
📋Testes Automatizados
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Run tests
run: npm test
- name: Upload coverage
uses: codecov/codecov-action@v1
with:
file: ./coverage/lcov.info# Execução de testes com upload de coverage
📋Releases Automáticos
name: Release
on:
push:
tags:
- 'v*'
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Create Release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: false
prerelease: false# Criação automática de releases
🦊 GitLab CI Avançado
Recursos avançados do GitLab CI
📋Multi-Project Pipeline
build_api:
stage: build
trigger:
project: my-group/api-project
strategy: depend
build_frontend:
stage: build
script:
- npm run build
artifacts:
paths:
- dist/# Pipeline multi-projeto
📋Deploy Condicional
deploy_production:
stage: deploy
script:
- echo "Deploying to production..."
rules:
- if: ${CI_COMMIT_BRANCH} == ${CI_DEFAULT_BRANCH}
- when: manual
environment:
name: production
url: https://example.com# Deploy condicional com regras
📋Include Templates
include:
- local: '/templates/.gitlab-ci-template.yml'
- project: 'my-group/common-ci'
file: '/templates/node.yml'
ref: main
variables:
NODE_VERSION: "16"# Include de templates externos
⛵ ArgoCD Avançado
Recursos avançados do ArgoCD
📋App of Apps
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: root-app
spec:
project: default
source:
repoURL: https://github.com/user/my-apps.git
targetRevision: HEAD
path: .
destination:
server: https://kubernetes.default.svc
namespace: argocd
syncPolicy:
automated:
prune: true# Padrão App of Apps para múltiplas aplicações
📋Progressive Delivery
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: my-app
spec:
replicas: 5
strategy:
canary:
steps:
- setWeight: 20
- setWeight: 40
- setWeight: 60
- setWeight: 80
canaryService: my-app-canary
stableService: my-app# Deploy progressivo com Canary
📋Sync Waves
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
annotations:
argocd.argoproj.io/sync-options: CreateNamespace=true
argocd.argoproj.io/sync-wave: "1"
spec:
project: default
source:
repoURL: https://github.com/user/my-app.git
targetRevision: HEAD
destination:
server: https://kubernetes.default.svc
namespace: my-app# Sincronização com waves para ordem de deploy
📋Notifications
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
spec:
project: default
source:
repoURL: https://github.com/user/my-app.git
destination:
server: https://kubernetes.default.svc
notification:
triggers:
- on-sync-status-unknown
- on-sync-failed
- on-sync-succeeded
template:
service: slack
template: |
text: |
Application {{.app.metadata.name}} sync status is {{.app.status.sync.status}}
recipients:
- my-channel# Configuração de notificações
🏗️ Terraform Avançado
Recursos avançados do Terraform
📋Remote State
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
}
}# Configuração de state remoto em S3
terraform force-unlock LOCK_ID# Força unlock
terraform plan -out=tfplan# Salva plano
terraform apply tfplan# Aplica plano salvo
🐳 Docker CI/CD Avançado
Recursos avançados de Docker em CI/CD
📋Production Deploy
docker-compose -f docker-compose.prod.yml up -d --remove-orphans# Deploy prod
docker-compose pull# Atualiza imagens
docker-compose restart app# Restart serviço
docker-compose exec app npm run migrate# Executa comando
📋Health Checks
version: '3.8'
services:
app:
image: myapp:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s# Configuração de health checks
🤝 Contribuindo
Encontrou um erro? Quer melhorar um cheatsheet? Tem uma sugestão? Adoraríamos suas contribuições! Abra uma issue ou submeta um PR.
Gostou do projeto? Apoie o desenvolvimento com um café e ajude a manter tudo open source ☕