mirror of
https://github.com/BagelHole/DevOps-Security-Agent-Skills.git
synced 2026-08-22 12:49:53 +02:00
451 lines
8.2 KiB
Markdown
451 lines
8.2 KiB
Markdown
---
|
|||
|
|
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
|