Fundamentos de Pipeline
Como Pipelines Funcionam
PipelineContainer de nível superior; um por commit/gatilho
StageGrupo de jobs que rodam em paralelo
JobTarefa única (script) dentro de um stage
RunnerAgente que executa jobs
Acionando Pipelines
Push to branchAutomático (padrão)
Merge requestVia workflow:rules ou only: merge_requests
ScheduleCI/CD → Schedules nas configurações do projeto
APIPOST /projects/:id/trigger/pipeline
ManualBotão Run Pipeline no menu CI/CD
.gitlab-ci.yml
Configuração Mínima
stages: [build, test, deploy] build-job: stage: build script: echo "Compiling..."
Palavras-chave Globais
stagesDefinir ordem dos stages
defaultValores padrão para todos os jobs
variablesVariáveis CI/CD globais
workflowControlar quando pipelines são criados
includeImportar arquivos YAML externos
Incluir Templates
include: - template: Auto-DevOps.gitlab-ci.yml - local: .ci/lint.yml - project: 'group/shared-ci' file: '/templates/deploy.yml'
Jobs
Definição de Job
test-unit: stage: test image: node:20 script: - npm ci - npm test
Palavras-chave de Job
scriptComandos shell a executar (obrigatório)
before_scriptComandos antes do script principal
after_scriptComandos após (mesmo em falha)
imageImagem Docker para o job
rulesCondições para inclusão do job
needsDependências DAG (pular ordem de stage)
allow_failurePipeline continua se job falhar
retryContagem de retry automático (0-2)
timeoutDuração máxima do job
Rules
deploy: rules: - if: '$CI_COMMIT_BRANCH == "main"' when: manual - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: never - when: on_success
Stages
Ordem dos Stages
stages: - lint - build - test - deploy
Stages Padrão
.preSempre executa primeiro
buildStage padrão 1
testStage padrão 2
deployStage padrão 3
.postSempre executa por último
DAG com needs
test-api: stage: test needs: ["build-api"] # skip waiting for full stage test-web: stage: test needs: ["build-web"] # runs as soon as build-web done
Variáveis
Definindo Variáveis
variables: NODE_ENV: "production" DB_HOST: "postgres" job: variables: NODE_ENV: "test" # job-level override
Variáveis Predefinidas
CI_COMMIT_SHAHash completo do commit
CI_COMMIT_BRANCHNome da branch
CI_COMMIT_TAGNome da tag (se pipeline de tag)
CI_PIPELINE_IDID único do pipeline
CI_PROJECT_DIRCaminho de checkout do repositório
CI_MERGE_REQUEST_IIDNúmero do MR (apenas pipelines de MR)
CI_REGISTRY_IMAGECaminho da imagem no registro de containers
Protegidas e Mascaradas
ProtectedDisponível apenas em branches/tags protegidas
MaskedOcultas nos logs do job
FileEscrita em arquivo temporário; caminho na variável
Artifacts
Salvando Artifacts
build: script: npm run build artifacts: paths: [dist/] expire_in: 1 week
Tipos de Artifact
pathsArquivos/diretórios para armazenar
excludePadrões a ignorar
expire_inAuto-excluir após duração
reports:junitXML JUnit para resumo de testes no MR
reports:coverage_reportVisualização de cobertura Cobertura
Relatório JUnit
test: script: pytest --junitxml=report.xml artifacts: reports: junit: report.xml
Cache
Cacheando Dependências
test: cache: key: ${CI_COMMIT_REF_SLUG} paths: [node_modules/] script: npm ci && npm test
Cache vs Artifacts
CacheAcelerar jobs; não garantido; reutilização por chave
ArtifactsPassar arquivos entre jobs/stages; garantido
Políticas de Cache
pull-pushBaixar + enviar (padrão)
pullApenas baixar (mais rápido para consumidores)
pushApenas enviar (para produtores)
Ambientes
Definindo Ambientes
deploy-staging: stage: deploy environment: name: staging url: https://staging.example.com script: ./deploy.sh staging
Recursos de Ambiente
nameNome do ambiente (exibido na UI)
urlLink para a app implantada
on_stopJob a executar quando o ambiente é parado
auto_stop_inParar automaticamente após duração
action: stopMarca job como ação de parada
Review Apps
review: environment: name: review/$CI_COMMIT_REF_SLUG url: https://$CI_COMMIT_REF_SLUG.example.com on_stop: stop-review auto_stop_in: 1 week
Docker
Construir e Publicar Imagem
build-image: image: docker:24 services: [docker:24-dind] script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
Services (Containers Sidecar)
test: image: python:3.12 services: - postgres:16 - redis:7 variables: POSTGRES_DB: testdb POSTGRES_PASSWORD: secret
Docker-in-Docker
docker:24-dindImagem do serviço DinD
DOCKER_TLS_CERTDIRDefinir como '/certs' ou '' para configuração TLS
DOCKER_HOSTtcp://docker:2376 (TLS) ou :2375
Padrões Comuns
Monorepo (changes)
test-api: rules: - changes: [api/**/*] test-web: rules: - changes: [web/**/*]
Portão Manual de Deploy
deploy-prod: stage: deploy when: manual rules: - if: '$CI_COMMIT_BRANCH == "main"'
Matrix Paralela
test: parallel: matrix: - PYTHON: ["3.10", "3.11", "3.12"] DB: ["postgres", "sqlite"] script: tox -e py${PYTHON}-${DB}