Initial commit
This commit is contained in:
359
skills/deployment-pipeline-design/SKILL.md
Normal file
359
skills/deployment-pipeline-design/SKILL.md
Normal file
@@ -0,0 +1,359 @@
|
||||
---
|
||||
name: deployment-pipeline-design
|
||||
description: Design multi-stage CI/CD pipelines with approval gates, security checks, and deployment orchestration. Use when architecting deployment workflows, setting up continuous delivery, or implementing GitOps practices.
|
||||
---
|
||||
|
||||
# Deployment Pipeline Design
|
||||
|
||||
Architecture patterns for multi-stage CI/CD pipelines with approval gates and deployment strategies.
|
||||
|
||||
## Purpose
|
||||
|
||||
Design robust, secure deployment pipelines that balance speed with safety through proper stage organization and approval workflows.
|
||||
|
||||
## When to Use
|
||||
|
||||
- Design CI/CD architecture
|
||||
- Implement deployment gates
|
||||
- Configure multi-environment pipelines
|
||||
- Establish deployment best practices
|
||||
- Implement progressive delivery
|
||||
|
||||
## Pipeline Stages
|
||||
|
||||
### Standard Pipeline Flow
|
||||
|
||||
```
|
||||
┌─────────┐ ┌──────┐ ┌─────────┐ ┌────────┐ ┌──────────┐
|
||||
│ Build │ → │ Test │ → │ Staging │ → │ Approve│ → │Production│
|
||||
└─────────┘ └──────┘ └─────────┘ └────────┘ └──────────┘
|
||||
```
|
||||
|
||||
### Detailed Stage Breakdown
|
||||
|
||||
1. **Source** - Code checkout
|
||||
2. **Build** - Compile, package, containerize
|
||||
3. **Test** - Unit, integration, security scans
|
||||
4. **Staging Deploy** - Deploy to staging environment
|
||||
5. **Integration Tests** - E2E, smoke tests
|
||||
6. **Approval Gate** - Manual approval required
|
||||
7. **Production Deploy** - Canary, blue-green, rolling
|
||||
8. **Verification** - Health checks, monitoring
|
||||
9. **Rollback** - Automated rollback on failure
|
||||
|
||||
## Approval Gate Patterns
|
||||
|
||||
### Pattern 1: Manual Approval
|
||||
|
||||
```yaml
|
||||
# GitHub Actions
|
||||
production-deploy:
|
||||
needs: staging-deploy
|
||||
environment:
|
||||
name: production
|
||||
url: https://app.example.com
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Deploy to production
|
||||
run: |
|
||||
# Deployment commands
|
||||
```
|
||||
|
||||
### Pattern 2: Time-Based Approval
|
||||
|
||||
```yaml
|
||||
# GitLab CI
|
||||
deploy:production:
|
||||
stage: deploy
|
||||
script:
|
||||
- deploy.sh production
|
||||
environment:
|
||||
name: production
|
||||
when: delayed
|
||||
start_in: 30 minutes
|
||||
only:
|
||||
- main
|
||||
```
|
||||
|
||||
### Pattern 3: Multi-Approver
|
||||
|
||||
```yaml
|
||||
# Azure Pipelines
|
||||
stages:
|
||||
- stage: Production
|
||||
dependsOn: Staging
|
||||
jobs:
|
||||
- deployment: Deploy
|
||||
environment:
|
||||
name: production
|
||||
resourceType: Kubernetes
|
||||
strategy:
|
||||
runOnce:
|
||||
preDeploy:
|
||||
steps:
|
||||
- task: ManualValidation@0
|
||||
inputs:
|
||||
notifyUsers: 'team-leads@example.com'
|
||||
instructions: 'Review staging metrics before approving'
|
||||
```
|
||||
|
||||
**Reference:** See `assets/approval-gate-template.yml`
|
||||
|
||||
## Deployment Strategies
|
||||
|
||||
### 1. Rolling Deployment
|
||||
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: my-app
|
||||
spec:
|
||||
replicas: 10
|
||||
strategy:
|
||||
type: RollingUpdate
|
||||
rollingUpdate:
|
||||
maxSurge: 2
|
||||
maxUnavailable: 1
|
||||
```
|
||||
|
||||
**Characteristics:**
|
||||
- Gradual rollout
|
||||
- Zero downtime
|
||||
- Easy rollback
|
||||
- Best for most applications
|
||||
|
||||
### 2. Blue-Green Deployment
|
||||
|
||||
```yaml
|
||||
# Blue (current)
|
||||
kubectl apply -f blue-deployment.yaml
|
||||
kubectl label service my-app version=blue
|
||||
|
||||
# Green (new)
|
||||
kubectl apply -f green-deployment.yaml
|
||||
# Test green environment
|
||||
kubectl label service my-app version=green
|
||||
|
||||
# Rollback if needed
|
||||
kubectl label service my-app version=blue
|
||||
```
|
||||
|
||||
**Characteristics:**
|
||||
- Instant switchover
|
||||
- Easy rollback
|
||||
- Doubles infrastructure cost temporarily
|
||||
- Good for high-risk deployments
|
||||
|
||||
### 3. Canary Deployment
|
||||
|
||||
```yaml
|
||||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: Rollout
|
||||
metadata:
|
||||
name: my-app
|
||||
spec:
|
||||
replicas: 10
|
||||
strategy:
|
||||
canary:
|
||||
steps:
|
||||
- setWeight: 10
|
||||
- pause: {duration: 5m}
|
||||
- setWeight: 25
|
||||
- pause: {duration: 5m}
|
||||
- setWeight: 50
|
||||
- pause: {duration: 5m}
|
||||
- setWeight: 100
|
||||
```
|
||||
|
||||
**Characteristics:**
|
||||
- Gradual traffic shift
|
||||
- Risk mitigation
|
||||
- Real user testing
|
||||
- Requires service mesh or similar
|
||||
|
||||
### 4. Feature Flags
|
||||
|
||||
```python
|
||||
from flagsmith import Flagsmith
|
||||
|
||||
flagsmith = Flagsmith(environment_key="API_KEY")
|
||||
|
||||
if flagsmith.has_feature("new_checkout_flow"):
|
||||
# New code path
|
||||
process_checkout_v2()
|
||||
else:
|
||||
# Existing code path
|
||||
process_checkout_v1()
|
||||
```
|
||||
|
||||
**Characteristics:**
|
||||
- Deploy without releasing
|
||||
- A/B testing
|
||||
- Instant rollback
|
||||
- Granular control
|
||||
|
||||
## Pipeline Orchestration
|
||||
|
||||
### Multi-Stage Pipeline Example
|
||||
|
||||
```yaml
|
||||
name: Production Pipeline
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Build application
|
||||
run: make build
|
||||
- name: Build Docker image
|
||||
run: docker build -t myapp:${{ github.sha }} .
|
||||
- name: Push to registry
|
||||
run: docker push myapp:${{ github.sha }}
|
||||
|
||||
test:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Unit tests
|
||||
run: make test
|
||||
- name: Security scan
|
||||
run: trivy image myapp:${{ github.sha }}
|
||||
|
||||
deploy-staging:
|
||||
needs: test
|
||||
runs-on: ubuntu-latest
|
||||
environment:
|
||||
name: staging
|
||||
steps:
|
||||
- name: Deploy to staging
|
||||
run: kubectl apply -f k8s/staging/
|
||||
|
||||
integration-test:
|
||||
needs: deploy-staging
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Run E2E tests
|
||||
run: npm run test:e2e
|
||||
|
||||
deploy-production:
|
||||
needs: integration-test
|
||||
runs-on: ubuntu-latest
|
||||
environment:
|
||||
name: production
|
||||
steps:
|
||||
- name: Canary deployment
|
||||
run: |
|
||||
kubectl apply -f k8s/production/
|
||||
kubectl argo rollouts promote my-app
|
||||
|
||||
verify:
|
||||
needs: deploy-production
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Health check
|
||||
run: curl -f https://app.example.com/health
|
||||
- name: Notify team
|
||||
run: |
|
||||
curl -X POST ${{ secrets.SLACK_WEBHOOK }} \
|
||||
-d '{"text":"Production deployment successful!"}'
|
||||
```
|
||||
|
||||
## Pipeline Best Practices
|
||||
|
||||
1. **Fail fast** - Run quick tests first
|
||||
2. **Parallel execution** - Run independent jobs concurrently
|
||||
3. **Caching** - Cache dependencies between runs
|
||||
4. **Artifact management** - Store build artifacts
|
||||
5. **Environment parity** - Keep environments consistent
|
||||
6. **Secrets management** - Use secret stores (Vault, etc.)
|
||||
7. **Deployment windows** - Schedule deployments appropriately
|
||||
8. **Monitoring integration** - Track deployment metrics
|
||||
9. **Rollback automation** - Auto-rollback on failures
|
||||
10. **Documentation** - Document pipeline stages
|
||||
|
||||
## Rollback Strategies
|
||||
|
||||
### Automated Rollback
|
||||
|
||||
```yaml
|
||||
deploy-and-verify:
|
||||
steps:
|
||||
- name: Deploy new version
|
||||
run: kubectl apply -f k8s/
|
||||
|
||||
- name: Wait for rollout
|
||||
run: kubectl rollout status deployment/my-app
|
||||
|
||||
- name: Health check
|
||||
id: health
|
||||
run: |
|
||||
for i in {1..10}; do
|
||||
if curl -sf https://app.example.com/health; then
|
||||
exit 0
|
||||
fi
|
||||
sleep 10
|
||||
done
|
||||
exit 1
|
||||
|
||||
- name: Rollback on failure
|
||||
if: failure()
|
||||
run: kubectl rollout undo deployment/my-app
|
||||
```
|
||||
|
||||
### Manual Rollback
|
||||
|
||||
```bash
|
||||
# List revision history
|
||||
kubectl rollout history deployment/my-app
|
||||
|
||||
# Rollback to previous version
|
||||
kubectl rollout undo deployment/my-app
|
||||
|
||||
# Rollback to specific revision
|
||||
kubectl rollout undo deployment/my-app --to-revision=3
|
||||
```
|
||||
|
||||
## Monitoring and Metrics
|
||||
|
||||
### Key Pipeline Metrics
|
||||
|
||||
- **Deployment Frequency** - How often deployments occur
|
||||
- **Lead Time** - Time from commit to production
|
||||
- **Change Failure Rate** - Percentage of failed deployments
|
||||
- **Mean Time to Recovery (MTTR)** - Time to recover from failure
|
||||
- **Pipeline Success Rate** - Percentage of successful runs
|
||||
- **Average Pipeline Duration** - Time to complete pipeline
|
||||
|
||||
### Integration with Monitoring
|
||||
|
||||
```yaml
|
||||
- name: Post-deployment verification
|
||||
run: |
|
||||
# Wait for metrics stabilization
|
||||
sleep 60
|
||||
|
||||
# Check error rate
|
||||
ERROR_RATE=$(curl -s "$PROMETHEUS_URL/api/v1/query?query=rate(http_errors_total[5m])" | jq '.data.result[0].value[1]')
|
||||
|
||||
if (( $(echo "$ERROR_RATE > 0.01" | bc -l) )); then
|
||||
echo "Error rate too high: $ERROR_RATE"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
## Reference Files
|
||||
|
||||
- `references/pipeline-orchestration.md` - Complex pipeline patterns
|
||||
- `assets/approval-gate-template.yml` - Approval workflow templates
|
||||
|
||||
## Related Skills
|
||||
|
||||
- `github-actions-templates` - For GitHub Actions implementation
|
||||
- `gitlab-ci-patterns` - For GitLab CI implementation
|
||||
- `secrets-management` - For secrets handling
|
||||
333
skills/github-actions-templates/SKILL.md
Normal file
333
skills/github-actions-templates/SKILL.md
Normal file
@@ -0,0 +1,333 @@
|
||||
---
|
||||
name: github-actions-templates
|
||||
description: Create production-ready GitHub Actions workflows for automated testing, building, and deploying applications. Use when setting up CI/CD with GitHub Actions, automating development workflows, or creating reusable workflow templates.
|
||||
---
|
||||
|
||||
# GitHub Actions Templates
|
||||
|
||||
Production-ready GitHub Actions workflow patterns for testing, building, and deploying applications.
|
||||
|
||||
## Purpose
|
||||
|
||||
Create efficient, secure GitHub Actions workflows for continuous integration and deployment across various tech stacks.
|
||||
|
||||
## When to Use
|
||||
|
||||
- Automate testing and deployment
|
||||
- Build Docker images and push to registries
|
||||
- Deploy to Kubernetes clusters
|
||||
- Run security scans
|
||||
- Implement matrix builds for multiple environments
|
||||
|
||||
## Common Workflow Patterns
|
||||
|
||||
### Pattern 1: Test Workflow
|
||||
|
||||
```yaml
|
||||
name: Test
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, develop ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x, 20.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Run linter
|
||||
run: npm run lint
|
||||
|
||||
- name: Run tests
|
||||
run: npm test
|
||||
|
||||
- name: Upload coverage
|
||||
uses: codecov/codecov-action@v3
|
||||
with:
|
||||
files: ./coverage/lcov.info
|
||||
```
|
||||
|
||||
**Reference:** See `assets/test-workflow.yml`
|
||||
|
||||
### Pattern 2: Build and Push Docker Image
|
||||
|
||||
```yaml
|
||||
name: Build and Push
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
tags: [ 'v*' ]
|
||||
|
||||
env:
|
||||
REGISTRY: ghcr.io
|
||||
IMAGE_NAME: ${{ github.repository }}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Log in to Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Extract metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
type=ref,event=branch
|
||||
type=ref,event=pr
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
```
|
||||
|
||||
**Reference:** See `assets/deploy-workflow.yml`
|
||||
|
||||
### Pattern 3: Deploy to Kubernetes
|
||||
|
||||
```yaml
|
||||
name: Deploy to Kubernetes
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Configure AWS credentials
|
||||
uses: aws-actions/configure-aws-credentials@v4
|
||||
with:
|
||||
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
aws-region: us-west-2
|
||||
|
||||
- name: Update kubeconfig
|
||||
run: |
|
||||
aws eks update-kubeconfig --name production-cluster --region us-west-2
|
||||
|
||||
- name: Deploy to Kubernetes
|
||||
run: |
|
||||
kubectl apply -f k8s/
|
||||
kubectl rollout status deployment/my-app -n production
|
||||
kubectl get services -n production
|
||||
|
||||
- name: Verify deployment
|
||||
run: |
|
||||
kubectl get pods -n production
|
||||
kubectl describe deployment my-app -n production
|
||||
```
|
||||
|
||||
### Pattern 4: Matrix Build
|
||||
|
||||
```yaml
|
||||
name: Matrix Build
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||
python-version: ['3.9', '3.10', '3.11', '3.12']
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
|
||||
- name: Run tests
|
||||
run: pytest
|
||||
```
|
||||
|
||||
**Reference:** See `assets/matrix-build.yml`
|
||||
|
||||
## Workflow Best Practices
|
||||
|
||||
1. **Use specific action versions** (@v4, not @latest)
|
||||
2. **Cache dependencies** to speed up builds
|
||||
3. **Use secrets** for sensitive data
|
||||
4. **Implement status checks** on PRs
|
||||
5. **Use matrix builds** for multi-version testing
|
||||
6. **Set appropriate permissions**
|
||||
7. **Use reusable workflows** for common patterns
|
||||
8. **Implement approval gates** for production
|
||||
9. **Add notification steps** for failures
|
||||
10. **Use self-hosted runners** for sensitive workloads
|
||||
|
||||
## Reusable Workflows
|
||||
|
||||
```yaml
|
||||
# .github/workflows/reusable-test.yml
|
||||
name: Reusable Test Workflow
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
node-version:
|
||||
required: true
|
||||
type: string
|
||||
secrets:
|
||||
NPM_TOKEN:
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ inputs.node-version }}
|
||||
- run: npm ci
|
||||
- run: npm test
|
||||
```
|
||||
|
||||
**Use reusable workflow:**
|
||||
```yaml
|
||||
jobs:
|
||||
call-test:
|
||||
uses: ./.github/workflows/reusable-test.yml
|
||||
with:
|
||||
node-version: '20.x'
|
||||
secrets:
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
```
|
||||
|
||||
## Security Scanning
|
||||
|
||||
```yaml
|
||||
name: Security Scan
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
security:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Run Trivy vulnerability scanner
|
||||
uses: aquasecurity/trivy-action@master
|
||||
with:
|
||||
scan-type: 'fs'
|
||||
scan-ref: '.'
|
||||
format: 'sarif'
|
||||
output: 'trivy-results.sarif'
|
||||
|
||||
- name: Upload Trivy results to GitHub Security
|
||||
uses: github/codeql-action/upload-sarif@v2
|
||||
with:
|
||||
sarif_file: 'trivy-results.sarif'
|
||||
|
||||
- name: Run Snyk Security Scan
|
||||
uses: snyk/actions/node@master
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
```
|
||||
|
||||
## Deployment with Approvals
|
||||
|
||||
```yaml
|
||||
name: Deploy to Production
|
||||
|
||||
on:
|
||||
push:
|
||||
tags: [ 'v*' ]
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
environment:
|
||||
name: production
|
||||
url: https://app.example.com
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Deploy application
|
||||
run: |
|
||||
echo "Deploying to production..."
|
||||
# Deployment commands here
|
||||
|
||||
- name: Notify Slack
|
||||
if: success()
|
||||
uses: slackapi/slack-github-action@v1
|
||||
with:
|
||||
webhook-url: ${{ secrets.SLACK_WEBHOOK }}
|
||||
payload: |
|
||||
{
|
||||
"text": "Deployment to production completed successfully!"
|
||||
}
|
||||
```
|
||||
|
||||
## Reference Files
|
||||
|
||||
- `assets/test-workflow.yml` - Testing workflow template
|
||||
- `assets/deploy-workflow.yml` - Deployment workflow template
|
||||
- `assets/matrix-build.yml` - Matrix build template
|
||||
- `references/common-workflows.md` - Common workflow patterns
|
||||
|
||||
## Related Skills
|
||||
|
||||
- `gitlab-ci-patterns` - For GitLab CI workflows
|
||||
- `deployment-pipeline-design` - For pipeline architecture
|
||||
- `secrets-management` - For secrets handling
|
||||
271
skills/gitlab-ci-patterns/SKILL.md
Normal file
271
skills/gitlab-ci-patterns/SKILL.md
Normal file
@@ -0,0 +1,271 @@
|
||||
---
|
||||
name: gitlab-ci-patterns
|
||||
description: Build GitLab CI/CD pipelines with multi-stage workflows, caching, and distributed runners for scalable automation. Use when implementing GitLab CI/CD, optimizing pipeline performance, or setting up automated testing and deployment.
|
||||
---
|
||||
|
||||
# GitLab CI Patterns
|
||||
|
||||
Comprehensive GitLab CI/CD pipeline patterns for automated testing, building, and deployment.
|
||||
|
||||
## Purpose
|
||||
|
||||
Create efficient GitLab CI pipelines with proper stage organization, caching, and deployment strategies.
|
||||
|
||||
## When to Use
|
||||
|
||||
- Automate GitLab-based CI/CD
|
||||
- Implement multi-stage pipelines
|
||||
- Configure GitLab Runners
|
||||
- Deploy to Kubernetes from GitLab
|
||||
- Implement GitOps workflows
|
||||
|
||||
## Basic Pipeline Structure
|
||||
|
||||
```yaml
|
||||
stages:
|
||||
- build
|
||||
- test
|
||||
- deploy
|
||||
|
||||
variables:
|
||||
DOCKER_DRIVER: overlay2
|
||||
DOCKER_TLS_CERTDIR: "/certs"
|
||||
|
||||
build:
|
||||
stage: build
|
||||
image: node:20
|
||||
script:
|
||||
- npm ci
|
||||
- npm run build
|
||||
artifacts:
|
||||
paths:
|
||||
- dist/
|
||||
expire_in: 1 hour
|
||||
cache:
|
||||
key: ${CI_COMMIT_REF_SLUG}
|
||||
paths:
|
||||
- node_modules/
|
||||
|
||||
test:
|
||||
stage: test
|
||||
image: node:20
|
||||
script:
|
||||
- npm ci
|
||||
- npm run lint
|
||||
- npm test
|
||||
coverage: '/Lines\s*:\s*(\d+\.\d+)%/'
|
||||
artifacts:
|
||||
reports:
|
||||
coverage_report:
|
||||
coverage_format: cobertura
|
||||
path: coverage/cobertura-coverage.xml
|
||||
|
||||
deploy:
|
||||
stage: deploy
|
||||
image: bitnami/kubectl:latest
|
||||
script:
|
||||
- kubectl apply -f k8s/
|
||||
- kubectl rollout status deployment/my-app
|
||||
only:
|
||||
- main
|
||||
environment:
|
||||
name: production
|
||||
url: https://app.example.com
|
||||
```
|
||||
|
||||
## Docker Build and Push
|
||||
|
||||
```yaml
|
||||
build-docker:
|
||||
stage: build
|
||||
image: docker:24
|
||||
services:
|
||||
- docker:24-dind
|
||||
before_script:
|
||||
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
|
||||
script:
|
||||
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
|
||||
- docker build -t $CI_REGISTRY_IMAGE:latest .
|
||||
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
|
||||
- docker push $CI_REGISTRY_IMAGE:latest
|
||||
only:
|
||||
- main
|
||||
- tags
|
||||
```
|
||||
|
||||
## Multi-Environment Deployment
|
||||
|
||||
```yaml
|
||||
.deploy_template: &deploy_template
|
||||
image: bitnami/kubectl:latest
|
||||
before_script:
|
||||
- kubectl config set-cluster k8s --server="$KUBE_URL" --insecure-skip-tls-verify=true
|
||||
- kubectl config set-credentials admin --token="$KUBE_TOKEN"
|
||||
- kubectl config set-context default --cluster=k8s --user=admin
|
||||
- kubectl config use-context default
|
||||
|
||||
deploy:staging:
|
||||
<<: *deploy_template
|
||||
stage: deploy
|
||||
script:
|
||||
- kubectl apply -f k8s/ -n staging
|
||||
- kubectl rollout status deployment/my-app -n staging
|
||||
environment:
|
||||
name: staging
|
||||
url: https://staging.example.com
|
||||
only:
|
||||
- develop
|
||||
|
||||
deploy:production:
|
||||
<<: *deploy_template
|
||||
stage: deploy
|
||||
script:
|
||||
- kubectl apply -f k8s/ -n production
|
||||
- kubectl rollout status deployment/my-app -n production
|
||||
environment:
|
||||
name: production
|
||||
url: https://app.example.com
|
||||
when: manual
|
||||
only:
|
||||
- main
|
||||
```
|
||||
|
||||
## Terraform Pipeline
|
||||
|
||||
```yaml
|
||||
stages:
|
||||
- validate
|
||||
- plan
|
||||
- apply
|
||||
|
||||
variables:
|
||||
TF_ROOT: ${CI_PROJECT_DIR}/terraform
|
||||
TF_VERSION: "1.6.0"
|
||||
|
||||
before_script:
|
||||
- cd ${TF_ROOT}
|
||||
- terraform --version
|
||||
|
||||
validate:
|
||||
stage: validate
|
||||
image: hashicorp/terraform:${TF_VERSION}
|
||||
script:
|
||||
- terraform init -backend=false
|
||||
- terraform validate
|
||||
- terraform fmt -check
|
||||
|
||||
plan:
|
||||
stage: plan
|
||||
image: hashicorp/terraform:${TF_VERSION}
|
||||
script:
|
||||
- terraform init
|
||||
- terraform plan -out=tfplan
|
||||
artifacts:
|
||||
paths:
|
||||
- ${TF_ROOT}/tfplan
|
||||
expire_in: 1 day
|
||||
|
||||
apply:
|
||||
stage: apply
|
||||
image: hashicorp/terraform:${TF_VERSION}
|
||||
script:
|
||||
- terraform init
|
||||
- terraform apply -auto-approve tfplan
|
||||
dependencies:
|
||||
- plan
|
||||
when: manual
|
||||
only:
|
||||
- main
|
||||
```
|
||||
|
||||
## Security Scanning
|
||||
|
||||
```yaml
|
||||
include:
|
||||
- template: Security/SAST.gitlab-ci.yml
|
||||
- template: Security/Dependency-Scanning.gitlab-ci.yml
|
||||
- template: Security/Container-Scanning.gitlab-ci.yml
|
||||
|
||||
trivy-scan:
|
||||
stage: test
|
||||
image: aquasec/trivy:latest
|
||||
script:
|
||||
- trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
|
||||
allow_failure: true
|
||||
```
|
||||
|
||||
## Caching Strategies
|
||||
|
||||
```yaml
|
||||
# Cache node_modules
|
||||
build:
|
||||
cache:
|
||||
key: ${CI_COMMIT_REF_SLUG}
|
||||
paths:
|
||||
- node_modules/
|
||||
policy: pull-push
|
||||
|
||||
# Global cache
|
||||
cache:
|
||||
key: ${CI_COMMIT_REF_SLUG}
|
||||
paths:
|
||||
- .cache/
|
||||
- vendor/
|
||||
|
||||
# Separate cache per job
|
||||
job1:
|
||||
cache:
|
||||
key: job1-cache
|
||||
paths:
|
||||
- build/
|
||||
|
||||
job2:
|
||||
cache:
|
||||
key: job2-cache
|
||||
paths:
|
||||
- dist/
|
||||
```
|
||||
|
||||
## Dynamic Child Pipelines
|
||||
|
||||
```yaml
|
||||
generate-pipeline:
|
||||
stage: build
|
||||
script:
|
||||
- python generate_pipeline.py > child-pipeline.yml
|
||||
artifacts:
|
||||
paths:
|
||||
- child-pipeline.yml
|
||||
|
||||
trigger-child:
|
||||
stage: deploy
|
||||
trigger:
|
||||
include:
|
||||
- artifact: child-pipeline.yml
|
||||
job: generate-pipeline
|
||||
strategy: depend
|
||||
```
|
||||
|
||||
## Reference Files
|
||||
|
||||
- `assets/gitlab-ci.yml.template` - Complete pipeline template
|
||||
- `references/pipeline-stages.md` - Stage organization patterns
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Use specific image tags** (node:20, not node:latest)
|
||||
2. **Cache dependencies** appropriately
|
||||
3. **Use artifacts** for build outputs
|
||||
4. **Implement manual gates** for production
|
||||
5. **Use environments** for deployment tracking
|
||||
6. **Enable merge request pipelines**
|
||||
7. **Use pipeline schedules** for recurring jobs
|
||||
8. **Implement security scanning**
|
||||
9. **Use CI/CD variables** for secrets
|
||||
10. **Monitor pipeline performance**
|
||||
|
||||
## Related Skills
|
||||
|
||||
- `github-actions-templates` - For GitHub Actions
|
||||
- `deployment-pipeline-design` - For architecture
|
||||
- `secrets-management` - For secrets handling
|
||||
346
skills/secrets-management/SKILL.md
Normal file
346
skills/secrets-management/SKILL.md
Normal file
@@ -0,0 +1,346 @@
|
||||
---
|
||||
name: secrets-management
|
||||
description: Implement secure secrets management for CI/CD pipelines using Vault, AWS Secrets Manager, or native platform solutions. Use when handling sensitive credentials, rotating secrets, or securing CI/CD environments.
|
||||
---
|
||||
|
||||
# Secrets Management
|
||||
|
||||
Secure secrets management practices for CI/CD pipelines using Vault, AWS Secrets Manager, and other tools.
|
||||
|
||||
## Purpose
|
||||
|
||||
Implement secure secrets management in CI/CD pipelines without hardcoding sensitive information.
|
||||
|
||||
## When to Use
|
||||
|
||||
- Store API keys and credentials
|
||||
- Manage database passwords
|
||||
- Handle TLS certificates
|
||||
- Rotate secrets automatically
|
||||
- Implement least-privilege access
|
||||
|
||||
## Secrets Management Tools
|
||||
|
||||
### HashiCorp Vault
|
||||
- Centralized secrets management
|
||||
- Dynamic secrets generation
|
||||
- Secret rotation
|
||||
- Audit logging
|
||||
- Fine-grained access control
|
||||
|
||||
### AWS Secrets Manager
|
||||
- AWS-native solution
|
||||
- Automatic rotation
|
||||
- Integration with RDS
|
||||
- CloudFormation support
|
||||
|
||||
### Azure Key Vault
|
||||
- Azure-native solution
|
||||
- HSM-backed keys
|
||||
- Certificate management
|
||||
- RBAC integration
|
||||
|
||||
### Google Secret Manager
|
||||
- GCP-native solution
|
||||
- Versioning
|
||||
- IAM integration
|
||||
|
||||
## HashiCorp Vault Integration
|
||||
|
||||
### Setup Vault
|
||||
|
||||
```bash
|
||||
# Start Vault dev server
|
||||
vault server -dev
|
||||
|
||||
# Set environment
|
||||
export VAULT_ADDR='http://127.0.0.1:8200'
|
||||
export VAULT_TOKEN='root'
|
||||
|
||||
# Enable secrets engine
|
||||
vault secrets enable -path=secret kv-v2
|
||||
|
||||
# Store secret
|
||||
vault kv put secret/database/config username=admin password=secret
|
||||
```
|
||||
|
||||
### GitHub Actions with Vault
|
||||
|
||||
```yaml
|
||||
name: Deploy with Vault Secrets
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Import Secrets from Vault
|
||||
uses: hashicorp/vault-action@v2
|
||||
with:
|
||||
url: https://vault.example.com:8200
|
||||
token: ${{ secrets.VAULT_TOKEN }}
|
||||
secrets: |
|
||||
secret/data/database username | DB_USERNAME ;
|
||||
secret/data/database password | DB_PASSWORD ;
|
||||
secret/data/api key | API_KEY
|
||||
|
||||
- name: Use secrets
|
||||
run: |
|
||||
echo "Connecting to database as $DB_USERNAME"
|
||||
# Use $DB_PASSWORD, $API_KEY
|
||||
```
|
||||
|
||||
### GitLab CI with Vault
|
||||
|
||||
```yaml
|
||||
deploy:
|
||||
image: vault:latest
|
||||
before_script:
|
||||
- export VAULT_ADDR=https://vault.example.com:8200
|
||||
- export VAULT_TOKEN=$VAULT_TOKEN
|
||||
- apk add curl jq
|
||||
script:
|
||||
- |
|
||||
DB_PASSWORD=$(vault kv get -field=password secret/database/config)
|
||||
API_KEY=$(vault kv get -field=key secret/api/credentials)
|
||||
echo "Deploying with secrets..."
|
||||
# Use $DB_PASSWORD, $API_KEY
|
||||
```
|
||||
|
||||
**Reference:** See `references/vault-setup.md`
|
||||
|
||||
## AWS Secrets Manager
|
||||
|
||||
### Store Secret
|
||||
|
||||
```bash
|
||||
aws secretsmanager create-secret \
|
||||
--name production/database/password \
|
||||
--secret-string "super-secret-password"
|
||||
```
|
||||
|
||||
### Retrieve in GitHub Actions
|
||||
|
||||
```yaml
|
||||
- name: Configure AWS credentials
|
||||
uses: aws-actions/configure-aws-credentials@v4
|
||||
with:
|
||||
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
aws-region: us-west-2
|
||||
|
||||
- name: Get secret from AWS
|
||||
run: |
|
||||
SECRET=$(aws secretsmanager get-secret-value \
|
||||
--secret-id production/database/password \
|
||||
--query SecretString \
|
||||
--output text)
|
||||
echo "::add-mask::$SECRET"
|
||||
echo "DB_PASSWORD=$SECRET" >> $GITHUB_ENV
|
||||
|
||||
- name: Use secret
|
||||
run: |
|
||||
# Use $DB_PASSWORD
|
||||
./deploy.sh
|
||||
```
|
||||
|
||||
### Terraform with AWS Secrets Manager
|
||||
|
||||
```hcl
|
||||
data "aws_secretsmanager_secret_version" "db_password" {
|
||||
secret_id = "production/database/password"
|
||||
}
|
||||
|
||||
resource "aws_db_instance" "main" {
|
||||
allocated_storage = 100
|
||||
engine = "postgres"
|
||||
instance_class = "db.t3.large"
|
||||
username = "admin"
|
||||
password = jsondecode(data.aws_secretsmanager_secret_version.db_password.secret_string)["password"]
|
||||
}
|
||||
```
|
||||
|
||||
## GitHub Secrets
|
||||
|
||||
### Organization/Repository Secrets
|
||||
|
||||
```yaml
|
||||
- name: Use GitHub secret
|
||||
run: |
|
||||
echo "API Key: ${{ secrets.API_KEY }}"
|
||||
echo "Database URL: ${{ secrets.DATABASE_URL }}"
|
||||
```
|
||||
|
||||
### Environment Secrets
|
||||
|
||||
```yaml
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
environment: production
|
||||
steps:
|
||||
- name: Deploy
|
||||
run: |
|
||||
echo "Deploying with ${{ secrets.PROD_API_KEY }}"
|
||||
```
|
||||
|
||||
**Reference:** See `references/github-secrets.md`
|
||||
|
||||
## GitLab CI/CD Variables
|
||||
|
||||
### Project Variables
|
||||
|
||||
```yaml
|
||||
deploy:
|
||||
script:
|
||||
- echo "Deploying with $API_KEY"
|
||||
- echo "Database: $DATABASE_URL"
|
||||
```
|
||||
|
||||
### Protected and Masked Variables
|
||||
- Protected: Only available in protected branches
|
||||
- Masked: Hidden in job logs
|
||||
- File type: Stored as file
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Never commit secrets** to Git
|
||||
2. **Use different secrets** per environment
|
||||
3. **Rotate secrets regularly**
|
||||
4. **Implement least-privilege access**
|
||||
5. **Enable audit logging**
|
||||
6. **Use secret scanning** (GitGuardian, TruffleHog)
|
||||
7. **Mask secrets in logs**
|
||||
8. **Encrypt secrets at rest**
|
||||
9. **Use short-lived tokens** when possible
|
||||
10. **Document secret requirements**
|
||||
|
||||
## Secret Rotation
|
||||
|
||||
### Automated Rotation with AWS
|
||||
|
||||
```python
|
||||
import boto3
|
||||
import json
|
||||
|
||||
def lambda_handler(event, context):
|
||||
client = boto3.client('secretsmanager')
|
||||
|
||||
# Get current secret
|
||||
response = client.get_secret_value(SecretId='my-secret')
|
||||
current_secret = json.loads(response['SecretString'])
|
||||
|
||||
# Generate new password
|
||||
new_password = generate_strong_password()
|
||||
|
||||
# Update database password
|
||||
update_database_password(new_password)
|
||||
|
||||
# Update secret
|
||||
client.put_secret_value(
|
||||
SecretId='my-secret',
|
||||
SecretString=json.dumps({
|
||||
'username': current_secret['username'],
|
||||
'password': new_password
|
||||
})
|
||||
)
|
||||
|
||||
return {'statusCode': 200}
|
||||
```
|
||||
|
||||
### Manual Rotation Process
|
||||
|
||||
1. Generate new secret
|
||||
2. Update secret in secret store
|
||||
3. Update applications to use new secret
|
||||
4. Verify functionality
|
||||
5. Revoke old secret
|
||||
|
||||
## External Secrets Operator
|
||||
|
||||
### Kubernetes Integration
|
||||
|
||||
```yaml
|
||||
apiVersion: external-secrets.io/v1beta1
|
||||
kind: SecretStore
|
||||
metadata:
|
||||
name: vault-backend
|
||||
namespace: production
|
||||
spec:
|
||||
provider:
|
||||
vault:
|
||||
server: "https://vault.example.com:8200"
|
||||
path: "secret"
|
||||
version: "v2"
|
||||
auth:
|
||||
kubernetes:
|
||||
mountPath: "kubernetes"
|
||||
role: "production"
|
||||
|
||||
---
|
||||
apiVersion: external-secrets.io/v1beta1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: database-credentials
|
||||
namespace: production
|
||||
spec:
|
||||
refreshInterval: 1h
|
||||
secretStoreRef:
|
||||
name: vault-backend
|
||||
kind: SecretStore
|
||||
target:
|
||||
name: database-credentials
|
||||
creationPolicy: Owner
|
||||
data:
|
||||
- secretKey: username
|
||||
remoteRef:
|
||||
key: database/config
|
||||
property: username
|
||||
- secretKey: password
|
||||
remoteRef:
|
||||
key: database/config
|
||||
property: password
|
||||
```
|
||||
|
||||
## Secret Scanning
|
||||
|
||||
### Pre-commit Hook
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# .git/hooks/pre-commit
|
||||
|
||||
# Check for secrets with TruffleHog
|
||||
docker run --rm -v "$(pwd):/repo" \
|
||||
trufflesecurity/trufflehog:latest \
|
||||
filesystem --directory=/repo
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "❌ Secret detected! Commit blocked."
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
### CI/CD Secret Scanning
|
||||
|
||||
```yaml
|
||||
secret-scan:
|
||||
stage: security
|
||||
image: trufflesecurity/trufflehog:latest
|
||||
script:
|
||||
- trufflehog filesystem .
|
||||
allow_failure: false
|
||||
```
|
||||
|
||||
## Reference Files
|
||||
|
||||
- `references/vault-setup.md` - HashiCorp Vault configuration
|
||||
- `references/github-secrets.md` - GitHub Secrets best practices
|
||||
|
||||
## Related Skills
|
||||
|
||||
- `github-actions-templates` - For GitHub Actions integration
|
||||
- `gitlab-ci-patterns` - For GitLab CI integration
|
||||
- `deployment-pipeline-design` - For pipeline architecture
|
||||
Reference in New Issue
Block a user