agentsclimarketplace

Devops deploy

Skill tranhieutt/software_development_department/.claude/skills/devops-deploy

Designs and executes CI/CD pipelines, GitOps workflows, deployment automation, and cloud infrastructure deployment including Docker, AWS Lambda, SAM, Terraform, and GitHub Actions. Use when building or improving CI/CD pipelines, containerizing applications, creating deployment runbooks, or deploying to cloud infrastructure.From its SKILL.md

Install
npx -y skills add tranhieutt/software_development_department --skill devops-deploy

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

SKILL.md

8.6 KB, ~2.1k tokens by cl100k_base, as published. Nobody here has run it

DevOps Deploy

Production checklist (always verify)

  • Env vars via Secrets Manager — never hardcoded
  • Health check endpoint responding
  • Structured JSON logs with request_id
  • Rate limiting configured
  • CORS restricted to authorized domains
  • Lambda timeout appropriate (10–30s)
  • CloudWatch alarms for errors and latency
  • Rollback plan documented
  • Load test before launch

Docker: multi-stage Python

FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt

FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
ENV PYTHONUNBUFFERED=1
EXPOSE 8000
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:8000/health || exit 1
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

Docker Compose (local dev)

services:
  app:
    build: .
    ports: ["8000:8000"]
    environment:
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
    volumes:
      - .:/app
    depends_on: [db, redis]
  db:
    image: postgres:15
    environment:
      POSTGRES_DB: app
      POSTGRES_USER: app
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - pgdata:/var/lib/postgresql/data
  redis:
    image: redis:7-alpine
volumes:
  pgdata:

SAM template (Lambda + DynamoDB)

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Globals:
  Function:
    Timeout: 30
    Runtime: python3.11
    Environment:
      Variables:
        DYNAMODB_TABLE: !Ref AppTable

Resources:
  AppFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/
      Handler: lambda_function.handler
      MemorySize: 512
      Policies:
        - DynamoDBCrudPolicy:
            TableName: !Ref AppTable

  AppTable:
    Type: AWS::DynamoDB::Table
    Properties:
      BillingMode: PAY_PER_REQUEST
      AttributeDefinitions:
        - AttributeName: userId
          AttributeType: S
      KeySchema:
        - AttributeName: userId
          KeyType: HASH
      TimeToLiveSpecification:
        AttributeName: ttl
        Enabled: true
# SAM commands
sam build
sam deploy --guided          # first time (creates samconfig.toml)
sam deploy                   # subsequent
sam deploy --no-confirm-changeset --no-fail-on-empty-changeset
sam logs -n AppFunction --tail

GitHub Actions: test + security + deploy

name: Deploy
on:
  push:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: { python-version: "3.11" }
      - run: pip install -r requirements.txt
      - run: pytest tests/ -v --cov=src --cov-report=xml

  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: pip install bandit safety
      - run: bandit -r src/ -ll
      - run: safety check -r requirements.txt

  deploy:
    needs: [test, security]
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: aws-actions/setup-sam@v2
      - 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-east-1
      - run: sam build
      - run: sam deploy --no-confirm-changeset

Health check endpoint (FastAPI)

import time, os
from fastapi import FastAPI

app = FastAPI()
START_TIME = time.time()

@app.get("/health")
async def health():
    return {
        "status": "healthy",
        "uptime_seconds": time.time() - START_TIME,
        "version": os.environ.get("APP_VERSION", "unknown"),
    }

Pipeline Design

Standard Pipeline Stages

[Build] -> [Test] -> [Security Scan] -> [Package] -> [Deploy Staging] -> [Integration Test] -> [Approval] -> [Deploy Prod] -> [Verify]
StageActionsFailure Policy
BuildCompile, lint, type-checkBlock
TestUnit + integration testsBlock
SecuritySAST, dependency scan, container scanBlock on Critical/High
PackageDocker build, push to registry, sign imageBlock
Deploy StagingApply manifests/Helm, run smoke testsBlock
ApprovalManual gate for productionRequire approval
Deploy ProdProgressive rolloutAuto-rollback on failure
VerifyHealth checks, metrics validationAuto-rollback

Deployment Strategy Selection

StrategyZero-downtimeRollback SpeedResource CostUse When
Rolling UpdateYesSlow (redeploy)LowDefault for most services
Blue/GreenYesInstant (switch)2xCritical services, DB-independent
CanaryYesFast (shift)1.1xHigh-traffic, need real-user validation

GitOps Repository Structure

app-repo/           # Application source code + Dockerfile
env-repo/           # Environment configs
  base/             # Base manifests
  overlays/
    dev/
    staging/
    prod/

Tools: ArgoCD or Flux v2 · Kustomize or Helm · External Secrets Operator

Security Scanning in Pipeline

  • SAST: CodeQL, Semgrep, SonarQube
  • Dependency: Snyk, Dependabot, npm audit
  • Container: Trivy, Grype
  • Secrets: GitLeaks, TruffleHog
  • SBOM: Syft · Image signing: Cosign

DORA Metrics to Track

  • Deployment frequency
  • Lead time for changes
  • Change failure rate
  • Mean time to recovery (MTTR)

Deployment Runbook Principles

Platform Selection

What are you deploying?
├── Static site → Vercel, Netlify, Cloudflare Pages
├── Simple web app → Railway, Render, Fly.io / VPS + PM2
├── Microservices → Container orchestration
└── Serverless → Edge functions, Lambda
PlatformDeployment MethodRollback
Vercel/NetlifyGit push, auto-deployRedeploy previous commit
Railway/RenderGit push or CLIDashboard rollback
VPS + PM2SSH + manual stepsRestore backup, restart
DockerImage push + orchestrationPrevious image tag
Kuberneteskubectl applykubectl rollout undo

5-Phase Deployment Process

1. PREPARE  → Verify code, build, env vars
2. BACKUP   → Save current state before changing
3. DEPLOY   → Execute with monitoring open
4. VERIFY   → Health check, logs, key flows
5. CONFIRM or ROLLBACK

Verification Window

  • First 5 min: Active monitoring
  • 15 min: Confirm stable
  • 1 hour: Final verification
  • Next day: Review metrics

Rollback Decision

SymptomAction
Service downRollback immediately
Critical errorsRollback
Performance >50% degradedConsider rollback
Minor issuesFix forward if quick

Rollback principles: Speed over perfection → Communicate → Post-mortem after stable.

Anti-Patterns

❌ Don't✅ Do
Deploy on FridayDeploy early in week
Skip stagingAlways test first
Deploy without backupBackup before deploy
Walk away after deployMonitor for 15+ min
Multiple changes at onceOne change at a time

CloudWatch alarm (Python)

import boto3

def create_error_alarm(function_name: str, sns_topic_arn: str):
    cw = boto3.client("cloudwatch")
    cw.put_metric_alarm(
        AlarmName=f"{function_name}-errors",
        MetricName="Errors",
        Namespace="AWS/Lambda",
        Dimensions=[{"Name": "FunctionName", "Value": function_name}],
        Period=300, EvaluationPeriods=1, Threshold=5,
        ComparisonOperator="GreaterThanThreshold",
        AlarmActions=[sns_topic_arn],
        TreatMissingData="notBreaching",
    )

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.