Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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.
.claude/skills/microck-deployment-pipeline-design/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-18 | ✓→✓ | = Same ✓ | 70% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 48% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 245% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 133% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 136% | 0% |
Architecture patterns for multi-stage CI/CD pipelines with approval gates and deployment strategies.
Design robust, secure deployment pipelines that balance speed with safety through proper stage organization and approval workflows.
┌─────────┐ ┌──────┐ ┌─────────┐ ┌────────┐ ┌──────────┐
│ Build │ → │ Test │ → │ Staging │ → │ Approve│ → │Production│
└─────────┘ └──────┘ └─────────┘ └────────┘ └──────────┘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
yaml# GitLab CI deploy:production: stage: deploy script: - deploy.sh production environment: name: production when: delayed start_in: 30 minutes only: - main
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
yamlapiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 10 strategy: type: RollingUpdate rollingUpdate: maxSurge: 2 maxUnavailable: 1
Characteristics:
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:
yamlapiVersion: 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:
pythonfrom 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:
yamlname: 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!"}'
yamldeploy-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
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
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
references/pipeline-orchestration.md - Complex pipeline patternsassets/approval-gate-template.yml - Approval workflow templatesgithub-actions-templates - For GitHub Actions implementationgitlab-ci-patterns - For GitLab CI implementationsecrets-management - For secrets handling| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-19 | fail→fail | 12,355 | 11,073 | -10% | 1 | 1 | 0% | 2,453 | 4,328 | +76% | 0 | 0 | — |
case-18 | pass→pass | 13,135 | 9,451 | -28% | 1 | 1 | 0% | 2,251 | 3,822 | +70% | 0 | 0 | — |
case-01 | fail→fail | 36,495 | 24,395 | -33% | 1 | 1 | 0% | 6,202 | 6,796 | +10% | 0 | 0 | — |
case-02 | pass→pass | 17,102 | 13,326 | -22% | 1 | 1 | 0% | 3,171 | 4,681 | +48% | 0 | 0 | — |
case-03 | pass→pass | 4,004 | 3,622 | -10% | 1 | 1 | 0% | 840 | 2,900 | +245% | 0 | 0 | — |
case-04 | pass→pass | 8,865 | 9,291 | +5% | 1 | 1 | 0% | 1,661 | 3,870 | +133% | 0 | 0 | — |
case-05 | pass→pass | 9,325 | 8,994 | -4% | 1 | 1 | 0% | 1,594 | 3,765 | +136% | 0 | 0 | — |
case-06 | pass→pass | 6,278 | 3,791 | -40% | 1 | 1 | 0% | 1,113 | 2,808 | +152% | 0 | 0 | — |
case-07 | fail→fail | 12,178 | 9,820 | -19% | 1 | 1 | 0% | 2,160 | 3,944 | +83% | 0 | 0 | — |
case-08 | pass→pass | 4,618 | 3,342 | -28% | 1 | 1 | 0% | 860 | 2,762 | +221% | 0 | 0 | — |
case-09 | fail→fail | 18,514 | 13,243 | -28% | 1 | 1 | 0% | 3,752 | 4,681 | +25% | 0 | 0 | — |
case-10 | pass→pass | 8,684 | 4,680 | -46% | 1 | 1 | 0% | 1,798 | 3,122 | +74% | 0 | 0 | — |
case-11 | fail→fail | 8,133 | 6,532 | -20% | 1 | 1 | 0% | 1,530 | 3,463 | +126% | 0 | 0 | — |
case-12 | pass→pass | 19,086 | 15,051 | -21% | 1 | 1 | 0% | 3,837 | 5,118 | +33% | 0 | 0 | — |
case-13 | pass→pass | 11,912 | 7,289 | -39% | 1 | 1 | 0% | 2,278 | 3,547 | +56% | 0 | 0 | — |
case-14 | pass→pass | 7,822 | 7,410 | -5% | 1 | 1 | 0% | 1,446 | 3,526 | +144% | 0 | 0 | — |
case-15 | pass→pass | 10,042 | 5,941 | -41% | 1 | 1 | 0% | 1,895 | 3,255 | +72% | 0 | 0 | — |
case-16 | pass→pass | 16,293 | 8,535 | -48% | 1 | 1 | 0% | 2,864 | 3,708 | +29% | 0 | 0 | — |
case-17 | pass→pass | 2,954 | 2,211 | -25% | 1 | 1 | 0% | 503 | 2,478 | +393% | 0 | 0 | — |
case-20 | pass→pass | 15,117 | 18,565 | +23% | 1 | 1 | 0% | 2,385 | 5,089 | +113% | 0 | 0 | — |
case-21 | fail→fail | 10,352 | 8,716 | -16% | 1 | 1 | 0% | 1,968 | 3,845 | +95% | 0 | 0 | — |
case-22 | pass→pass | 6,124 | 4,216 | -31% | 1 | 1 | 0% | 1,010 | 2,936 | +191% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of 0 percentage points is the difference between those two pass rates over the 22 comparable cases.
Other measured skills in the registry, with their headline benchmark lift.