Folha de Dicas do CircleCI
Folha de Dicas do CircleCI
Instalação
| Plataforma | Comando |
|---|---|
| Linux (curl) | `curl -fLSs https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/master/install.sh \ |
| Linux (snap) | sudo snap install circleci |
| macOS (Homebrew) | brew install circleci |
| macOS (curl) | `curl -fLSs https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/master/install.sh \ |
| Windows (Chocolatey) | choco install circleci-cli |
| Windows (Scoop) | scoop install circleci |
| Verify Installation | circleci version |
| Initial Setup | circleci setup |
| Update CLI | circleci update |
Comandos Básicos
| Comando | Descrição |
|---|---|
circleci config validate | Validate your .circleci/config.yml file |
circleci config validate -c path/to/config.yml | Validar um arquivo de configuração específico |
circleci config process .circleci/config.yml | Processar e expandir configuração (resolver orbs) |
circleci local execute | Executar um job localmente usando Docker |
circleci local execute --job job-name | Executar um trabalho específico localmente |
circleci follow | Listar todos os projetos seguidos |
circleci follow github/org/repo | Siga um projeto específico |
circleci project info github/org/repo | Obter informações do projeto |
circleci pipeline run github/org/repo | Acionar um novo pipeline |
circleci pipeline run github/org/repo --branch develop | Acionar pipeline em branch específica |
circleci pipeline list github/org/repo | Listar pipelines recentes de um projeto |
circleci pipeline get <pipeline-id> | Obter detalhes sobre um pipeline específico |
circleci build list github/org/repo | Listar builds recentes de um projeto |
circleci build get <build-number> | Obter informações sobre uma compilação específica |
circleci build cancel <build-number> | Cancelar uma compilação em execução |
Uso Avançado
| Comando | Descrição |
|---|---|
circleci pipeline run github/org/repo --parameters '{"key":"value"}' | Disparar pipeline com parâmetros |
circleci local execute --env VAR1=value1 --env VAR2=value2 | Execute localmente com variáveis de ambiente |
circleci context list github org-name | Listar todos os contextos para uma organização |
circleci context create github org-name context-name | Criar um novo contexto |
circleci context show github org-name context-name | Mostrar detalhes de contexto |
circleci context delete github org-name context-name | Excluir um contexto |
circleci context env-var list github org-name context-name | Listar variáveis de ambiente em um contexto |
circleci context env-var store github org-name context-name VAR_NAME | Armazenar variável de ambiente no contexto |
circleci orb list | Listar todos os orbs públicos disponíveis |
circleci orb search <query> | Pesquisar orbs por palavra-chave |
circleci orb info namespace/orb@version | Obtenha informações detalhadas sobre um orb |
circleci orb source namespace/orb@version | Visualizar o código-fonte de um orb |
circleci orb create namespace/orb | Criar um novo orb |
circleci orb publish path/to/orb.yml namespace/orb@dev:first | Publicar versão de desenvolvimento de um orb |
circleci orb publish promote namespace/orb@dev:first patch | Promover orb para produção (versão de patch) |
circleci orb validate path/to/orb.yml | Validar uma configuração de orb |
circleci api graphql-query --query '{ me { id name } }' | Executar consulta de API GraphQL |
circleci api get /me | Fazer solicitação GET de API REST |
circleci diagnostic | Executar verificações de diagnóstico na configuração do CLI |
circleci config pack src/ > orb.yml | Empacotar arquivos de origem orb em um único YAML |
Configuração
Estrutura Básica do Arquivo de Configuração
O arquivo de configuração do CircleCI está localizado em .circleci/config.ymlno diretório raiz do seu repositório.
version: 2.1
# Define reusable execution environments
executors:
node-executor:
docker:
- image: cimg/node:18.16
resource_class: medium
working_directory: ~/project
# Define reusable command sequences
commands:
install-deps:
steps:
- restore_cache:
keys:
- v1-deps-{{ checksum "package-lock.json" }}
- run: npm ci
- save_cache:
key: v1-deps-{{ checksum "package-lock.json" }}
paths:
- node_modules
# Define jobs
jobs:
build:
executor: node-executor
steps:
- checkout
- install-deps
- run: npm run build
- persist_to_workspace:
root: .
paths:
- dist
test:
executor: node-executor
steps:
- checkout
- install-deps
- run: npm test
- store_test_results:
path: test-results
# Define workflows
workflows:
build-and-test:
jobs:
- build
- test:
requires:
- build
Configuração do Executor Docker
jobs:
build:
docker:
- image: cimg/python:3.11
auth:
username: $DOCKERHUB_USERNAME
password: $DOCKERHUB_PASSWORD
environment:
FLASK_ENV: development
- image: cimg/postgres:14.0
environment:
POSTGRES_USER: testuser
POSTGRES_DB: testdb
resource_class: large
steps:
- checkout
- run: python app.py
Configuração do Executor de Máquina
jobs:
build:
machine:
image: ubuntu-2204:2023.04.2
docker_layer_caching: true
resource_class: large
steps:
- checkout
- run: docker build -t myapp .
Usando Orbs
version: 2.1
orbs:
node: circleci/node@5.1.0
aws-cli: circleci/aws-cli@3.1.0
slack: circleci/slack@4.12.0
jobs:
deploy:
executor: node/default
steps:
- checkout
- node/install-packages
- aws-cli/setup
- run: npm run deploy
- slack/notify:
event: pass
template: success_tagged_deploy_1
Filtros de Workflow e Agendamento
workflows:
version: 2
build-deploy:
jobs:
- build
- test:
requires:
- build
- deploy:
requires:
- test
filters:
branches:
only:
- main
- /release\/.*/
tags:
only: /^v.*/
nightly:
triggers:
- schedule:
cron: "0 0 * * *"
filters:
branches:
only: main
jobs:
- test
Paralelismo e Divisão de Testes
jobs:
test:
docker:
- image: cimg/node:18.16
parallelism: 4
steps:
- checkout
- run: npm ci
- run:
name: Run Tests
command: |
TESTFILES=$(circleci tests glob "tests/**/*.test.js" | \
circleci tests split --split-by=timings)
npm test $TESTFILES
- store_test_results:
path: test-results
Classes de Recursos
jobs:
small-job:
docker:
- image: cimg/base:stable
resource_class: small # 1 vCPU, 2GB RAM
large-job:
docker:
- image: cimg/base:stable
resource_class: large # 4 vCPU, 8GB RAM
xlarge-job:
docker:
- image: cimg/base:stable
resource_class: xlarge # 8 vCPU, 16GB RAM
Casos de Uso Comuns
Caso de Uso 1: Pipeline de Aplicação Node.js em Múltiplos Estágios
version: 2.1
orbs:
node: circleci/node@5.1.0
jobs:
build:
executor: node/default
steps:
- checkout
- node/install-packages:
pkg-manager: npm
- run:
name: Build Application
command: npm run build
- persist_to_workspace:
root: .
paths:
- dist
- node_modules
test:
executor: node/default
steps:
- checkout
- attach_workspace:
at: .
- run:
name: Run Unit Tests
command: npm test
- store_test_results:
path: test-results
deploy-staging:
executor: node/default
steps:
- attach_workspace:
at: .
- run:
name: Deploy to Staging
command: npm run deploy:staging
workflows:
build-test-deploy:
jobs:
- build
- test:
requires:
- build
- deploy-staging:
requires:
- test
filters:
branches:
only: develop
Caso de Uso 2: Construção e Push de Imagem Docker
version: 2.1
orbs:
docker: circleci/docker@2.2.0
jobs:
build-and-push:
executor: docker/docker
steps:
- setup_remote_docker:
docker_layer_caching: true
- checkout
- docker/check
- docker/build:
image: myorg/myapp
tag: ${CIRCLE_SHA1},latest
- docker/push:
image: myorg/myapp
tag: ${CIRCLE_SHA1},latest
workflows:
build-deploy:
jobs:
- build-and-push:
context: docker-hub-creds
filters:
branches:
only: main
Caso de Uso 3: Testes Paralelos com Divisão de Testes
version: 2.1
jobs:
test:
docker:
- image: cimg/python:3.11
parallelism: 8
steps:
- checkout
- run: pip install -r requirements.txt
- run:
name: Run Tests in Parallel
command: |
TESTFILES=$(circleci tests glob "tests/**/test_*.py" | \
circleci tests split --split-by=timings)
pytest $TESTFILES \
--junitxml=test-results/junit.xml \
--cov=app \
--cov-report=html
- store_test_results:
path: test-results
- store_artifacts:
path: htmlcov
workflows:
test:
jobs:
- test
Caso de Uso 4: Workflow Condicional com Parâmetros
version: 2.1
parameters:
run-integration-tests:
type: boolean
default: false
deployment-environment:
type: string
default: "staging"
jobs:
unit-test:
docker:
- image: cimg/node:18.16
steps:
- checkout
- run: npm ci
- run: npm run test:unit
integration-test:
docker:
- image: cimg/node:18.16
steps:
- checkout
- run: npm ci
- run: npm run test:integration
deploy:
docker:
- image: cimg/node:18.16
parameters:
environment:
type: string
steps:
- checkout
- run: npm ci
- run: npm run deploy:<< parameters.environment >>
workflows:
test-and-deploy:
jobs:
- unit-test
- integration-test:
when: << pipeline.parameters.run-integration-tests >>
- deploy:
environment: << pipeline.parameters.deployment-environment >>
requires:
- unit-test
filters:
branches:
only: main
Caso de Uso 5: Monorepo com Filtragem de Caminho
version: 2.1
setup: true
orbs:
path-filtering: circleci/path-filtering@0.1.3
workflows:
setup-workflow:
jobs:
- path-filtering/filter:
base-revision: main
config-path: .circleci/continue-config.yml
mapping: |
services/api/.* api-build true
services/web/.* web-build true
packages/.* all-build true
continue-config.yml:
version: 2.1
parameters:
api-build:
type: boolean
default: false
web-build:
type: boolean
default: false
all-build:
type: boolean
default: false
jobs:
build-api:
docker:
- image: cimg/node:18.16
steps:
- checkout
- run: cd services/api && npm ci && npm run build
build-web:
docker:
- image: cimg/node:18.16
steps:
- checkout
- run: cd services/web && npm ci && npm run build
workflows:
api-workflow:
when: << pipeline.parameters.api-build >>
jobs:
- build-api
web-workflow:
when: << pipeline.parameters.web-build >>
jobs:
- build-web
Melhores Práticas
-
Use Orbs para Tarefas Comuns: Aproveite os orbs do CircleCI para integrações padronizadas (AWS, Docker, Slack) para reduzir a complexidade de configuração e o esforço de manutenção.
-
Implemente Cache Estrategicamente: Faça cache de dependências usando chaves baseadas em checksum (
{{ checksum "package-lock.json" }}) para acelerar builds, garantindo a invalidação do cache quando as dependências mudarem. -
Otimize Classes de Recursos: Escolha classes de recursos apropriadas para cada job; use instâncias menores para tarefas simples e reserve instâncias maiores para operações que demandam computação, como compilação ou testes complexos.
-
Habilite Cache de Camadas Docker: Para jobs que constroem imagens Docker, habilite
docker_layer_caching: truepara reduzir significativamente os tempos de build reutilizando camadas inalteradas. -
Dividir Testes para Execução Paralela: Usar
circleci tests splitcom--split-by=timingspara distribuir testes em contêineres paralelos com base nos tempos de execução históricos, maximizando a eficiência. -
Usar Workspaces para Dados Entre Jobs: Persistir artefatos de build usando
persist_to_workspaceeattach_workspaceem vez de recompilar em jobs subsequentes, economizando tempo e garantindo consistência. -
Implementar Filtros de Workflow: Usar filtros de branch e tag para controlar quando os jobs são executados, prevenindo implantações desnecessárias e conservando créditos, mantendo a segurança.
-
Armazenar Segredos em Contextos: Gerenciar credenciais sensíveis em contextos do CircleCI em vez de variáveis de ambiente do projeto para melhor segurança, controle de acesso e reutilização entre projetos.
-
Validar Configuração Localmente: Sempre executar
circleci config validatee testar jobs localmente comcircleci local executeantes de enviar para capturar erros de sintaxe e problemas de configuração antecipadamente. -
Monitorar e Otimizar Uso de Créditos: Revisar regularmente Insights e Análises para identificar jobs lentos, otimizar configurações de paralelismo e reduzir execuções de workflow desnecessárias para gerenciar custos de forma eficaz.
Resolução de Problemas
| Problema | Solução |
|---|---|
| ”Config file not found” error | Ensure .circleci/config.yml exists in repository root. Run circleci config validate to check file location and syntax. |
| Local execution fails with Docker errors | Verify Docker is running: docker ps. Ensure the CLI has access to Docker socket. On Linux, add user to docker group: sudo usermod -aG docker $USER. |
| ”Invalid configuration” during validation | Run circleci config process .circleci/config.yml to see expanded config and identify syntax errors. Check YAML indentation (use spaces, not tabs). |
| Jobs not triggering on push | Verify project is followed: circleci follow github/org/repo. Check workflow filters aren’t excluding your branch. Ensure webhook is configured in VCS settings. |
| Workspace attachment fails | Ensure persist_to_workspace in upstream job completes successfully. Verify root and paths match between persist and attach. Check job dependencies in workflow. |
| Cache not restoring | Verify cache key matches between save_cache and restore_cache. Use fallback keys: keys: [v1-{{ checksum "file" }}, v1-]. Check cache hasn’t expired (30 days). |
| Authentication errors with CLI | Re-run circleci setup with a valid API token. Generate new token at https://app.circleci.com/settings/user/tokens. Verify token has correct permissions. |
| Parallel test splitting not working | Ensure test results are stored with store_test_results. Use glob patterns that match your test files. Verify parallelism is set greater than 1. |
| Out of memory errors | Increase resource_class to large or xlarge. Optimize memory-intensive operations. Check for memory leaks in application code. |
| Context environment variables not available | Verify job uses correct context in workflow: context: context-name. Check user has access to context in organization settings. Ensure variable names don’t conflict. |
| Orb import fails | Verify orb exists: circleci orb info namespace/orb@version. Check version is valid. For private orbs, ensure organization has access and use --org-id flag. |