Files
DevOps-Security-Agent-Skills/devops/ci-cd/circleci/SKILL.md
T

451 lines
8.2 KiB
Markdown
Raw Normal View History

2026-01-27 17:35:45 -05:00
---
name: circleci
description: Configure CircleCI workflows and orbs for continuous integration and deployment. Create config.yml pipelines, use orbs for reusable configurations, and optimize build performance. Use when working with CircleCI for CI/CD automation.
license: MIT
metadata:
author: devops-skills
version: "1.0"
---
# CircleCI
Build, test, and deploy applications using CircleCI's cloud-native CI/CD platform.
## When to Use This Skill
Use this skill when:
- Setting up CI/CD pipelines with CircleCI
- Using orbs for reusable configuration
- Optimizing build times with caching and parallelism
- Configuring CircleCI workflows and approvals
- Managing CircleCI contexts and secrets
## Prerequisites
- CircleCI account connected to repository
- Project enabled in CircleCI dashboard
- Basic YAML understanding
## Configuration File
Create `.circleci/config.yml`:
```yaml
version: 2.1
orbs:
node: circleci/node@5.2
docker: circleci/docker@2.4
executors:
default:
docker:
- image: cimg/node:20.10
working_directory: ~/project
jobs:
build:
executor: default
steps:
- checkout
- node/install-packages:
pkg-manager: npm
- run:
name: Build application
command: npm run build
- persist_to_workspace:
root: .
paths:
- dist
test:
executor: default
steps:
- checkout
- node/install-packages:
pkg-manager: npm
- run:
name: Run tests
command: npm test
deploy:
executor: default
steps:
- checkout
- attach_workspace:
at: .
- run:
name: Deploy
command: ./deploy.sh
workflows:
build-test-deploy:
jobs:
- build
- test:
requires:
- build
- deploy:
requires:
- test
filters:
branches:
only: main
```
## Executors
### Docker Executor
```yaml
executors:
node:
docker:
- image: cimg/node:20.10
- image: cimg/postgres:15.0
environment:
POSTGRES_USER: test
POSTGRES_DB: testdb
working_directory: ~/app
```
### Machine Executor
```yaml
executors:
linux-machine:
machine:
image: ubuntu-2204:current
resource_class: large
```
### macOS Executor
```yaml
executors:
macos:
macos:
xcode: "15.0.0"
resource_class: macos.m1.medium.gen1
```
## Caching
### Dependency Caching
```yaml
jobs:
build:
steps:
- checkout
- restore_cache:
keys:
- v1-deps-{{ checksum "package-lock.json" }}
- v1-deps-
- run: npm ci
- save_cache:
key: v1-deps-{{ checksum "package-lock.json" }}
paths:
- node_modules
```
### Multi-Key Caching
```yaml
- restore_cache:
keys:
- v1-{{ .Branch }}-{{ checksum "package-lock.json" }}
- v1-{{ .Branch }}-
- v1-main-
- v1-
```
## Workspaces
### Persist Data
```yaml
jobs:
build:
steps:
- checkout
- run: npm run build
- persist_to_workspace:
root: .
paths:
- dist
- node_modules
deploy:
steps:
- attach_workspace:
at: ~/project
- run: ./deploy.sh
```
## Parallelism
### Test Splitting
```yaml
jobs:
test:
parallelism: 4
steps:
- checkout
- run:
name: Run tests
command: |
TESTFILES=$(circleci tests glob "test/**/*.test.js" | circleci tests split --split-by=timings)
npm test -- $TESTFILES
- store_test_results:
path: test-results
```
## Workflows
### Sequential Jobs
```yaml
workflows:
pipeline:
jobs:
- build
- test:
requires:
- build
- deploy:
requires:
- test
```
### Parallel Jobs
```yaml
workflows:
pipeline:
jobs:
- build
- test-unit:
requires:
- build
- test-integration:
requires:
- build
- deploy:
requires:
- test-unit
- test-integration
```
### Manual Approval
```yaml
workflows:
deploy-prod:
jobs:
- build
- test
- hold:
type: approval
requires:
- test
- deploy-production:
requires:
- hold
```
### Scheduled Workflows
```yaml
workflows:
nightly:
triggers:
- schedule:
cron: "0 2 * * *"
filters:
branches:
only:
- main
jobs:
- build
- test
```
### Branch Filtering
```yaml
workflows:
build-deploy:
jobs:
- build:
filters:
branches:
only:
- main
- /feature-.*/
- deploy:
filters:
branches:
only: main
tags:
only: /^v.*/
```
## Orbs
### Using Orbs
```yaml
version: 2.1
orbs:
aws-cli: circleci/aws-cli@4.1
kubernetes: circleci/kubernetes@1.3
jobs:
deploy:
executor: aws-cli/default
steps:
- aws-cli/setup:
aws_access_key_id: AWS_ACCESS_KEY_ID
aws_secret_access_key: AWS_SECRET_ACCESS_KEY
- kubernetes/install-kubectl
- run: kubectl apply -f k8s/
```
### Common Orbs
```yaml
orbs:
node: circleci/node@5.2 # Node.js
docker: circleci/docker@2.4 # Docker builds
aws-cli: circleci/aws-cli@4.1 # AWS CLI
aws-ecr: circleci/aws-ecr@9.0 # ECR push
aws-ecs: circleci/aws-ecs@4.0 # ECS deploy
gcp-cli: circleci/gcp-cli@3.1 # GCP CLI
kubernetes: circleci/kubernetes@1.3 # K8s deploy
slack: circleci/slack@4.12 # Notifications
```
## Docker Builds
```yaml
version: 2.1
orbs:
docker: circleci/docker@2.4
jobs:
build-and-push:
executor: docker/docker
steps:
- setup_remote_docker:
version: 20.10.24
- checkout
- docker/check
- docker/build:
image: myorg/myapp
tag: $CIRCLE_SHA1
- docker/push:
image: myorg/myapp
tag: $CIRCLE_SHA1
```
## Environment Variables
### Project Variables
Set in CircleCI Project Settings > Environment Variables
### Contexts
```yaml
workflows:
deploy:
jobs:
- deploy-staging:
context: staging-secrets
- deploy-production:
context: production-secrets
```
### Using Variables
```yaml
jobs:
deploy:
steps:
- run:
name: Deploy
command: |
aws s3 sync dist/ s3://$S3_BUCKET
environment:
AWS_DEFAULT_REGION: us-east-1
```
## Artifacts and Test Results
```yaml
jobs:
test:
steps:
- run:
name: Run tests
command: npm test -- --coverage
- store_test_results:
path: test-results
- store_artifacts:
path: coverage
destination: coverage-report
```
## Resource Classes
```yaml
jobs:
build:
docker:
- image: cimg/node:20.10
resource_class: large # 4 vCPU, 8GB RAM
steps:
- checkout
- run: npm run build
# Available classes:
# small: 1 vCPU, 2GB RAM
# medium: 2 vCPU, 4GB RAM (default)
# large: 4 vCPU, 8GB RAM
# xlarge: 8 vCPU, 16GB RAM
```
## Common Issues
### Issue: Cache Not Restoring
**Problem**: Cache misses on every build
**Solution**: Verify cache key format, ensure checksum file hasn't changed
### Issue: Workspace Attach Fails
**Problem**: Cannot find persisted workspace
**Solution**: Ensure persist_to_workspace job completed, check paths
### Issue: Docker Layer Caching
**Problem**: Docker builds are slow
**Solution**: Enable Docker Layer Caching in project settings (paid feature)
## Best Practices
- Use orbs for common tasks
- Implement aggressive caching strategies
- Use workspaces for sharing data between jobs
- Split tests with parallelism for faster builds
- Use contexts for environment-specific secrets
- Define reusable executors
- Store test results for insights
## Related Skills
- [github-actions](../github-actions/) - GitHub CI/CD
- [docker-management](../../containers/docker-management/) - Container builds
- [aws-ecs-fargate](../../../infrastructure/cloud-aws/aws-ecs-fargate/) - ECS deployments