pin - pipeline with Docker Golang API.
This document outlines real-world scenarios where Pin can be effectively used for development, testing, and deployment workflows.
Scenario: Setting up a consistent development environment across team members.
# dev-setup.yaml
workflow:
- setup-dependencies
- start-services
- run-tests
setup-dependencies:
image: node:18-alpine
copyFiles: true
script:
- npm install
- npm run build
start-services:
image: node:18-alpine
copyFiles: true
port:
- "3000:3000"
- "127.0.0.1:8080:8080"
script:
- npm run start:dev
run-tests:
image: node:18-alpine
copyFiles: true
script:
- npm run test:watch
Benefits:
Scenario: Running linting, formatting, and security checks before commits.
# quality-check.yaml
workflow:
- lint
- format-check
- security-scan
- type-check
lint:
image: node:18-alpine
copyFiles: true
script:
- npm run lint
- npm run lint:css
format-check:
image: node:18-alpine
copyFiles: true
script:
- npm run prettier:check
security-scan:
image: node:18-alpine
copyFiles: true
script:
- npm audit --audit-level=moderate
- npx snyk test
type-check:
image: node:18-alpine
copyFiles: true
script:
- npm run type-check
Scenario: Testing application against different database versions.
# multi-db-test.yaml
workflow:
- test-postgres-13
- test-postgres-14
- test-postgres-15
test-postgres-13:
image: golang:1.21-alpine
copyFiles: true
parallel: true
env:
- DB_HOST=postgres-13
- DB_PORT=5432
- DB_NAME=testdb
script:
- go test ./... -tags=integration
test-postgres-14:
image: golang:1.21-alpine
copyFiles: true
parallel: true
env:
- DB_HOST=postgres-14
- DB_PORT=5432
- DB_NAME=testdb
script:
- go test ./... -tags=integration
test-postgres-15:
image: golang:1.21-alpine
copyFiles: true
parallel: true
env:
- DB_HOST=postgres-15
- DB_PORT=5432
- DB_NAME=testdb
script:
- go test ./... -tags=integration
Scenario: Performance testing with different load patterns.
# load-test.yaml
workflow:
- start-app
- light-load
- heavy-load
- spike-test
start-app:
image: myapp:latest
port:
- "8080:8080"
script:
- ./start-server.sh
light-load:
image: alpine:latest
script:
- apk add --no-cache apache2-utils
- ab -n 1000 -c 10 http://localhost:8080/api/test
heavy-load:
image: alpine:latest
script:
- apk add --no-cache apache2-utils
- ab -n 10000 -c 100 http://localhost:8080/api/test
spike-test:
image: alpine:latest
script:
- apk add --no-cache apache2-utils
- ab -n 5000 -c 500 http://localhost:8080/api/test
Scenario: Different deployment strategies based on git branches.
# ci-pipeline.yaml
workflow:
- build
- test
- security-check
- deploy-dev
- deploy-staging
- deploy-prod
build:
image: golang:1.21-alpine
copyFiles: true
script:
- go build -o app .
- docker build -t myapp:${COMMIT_SHA} .
test:
image: golang:1.21-alpine
copyFiles: true
script:
- go test ./...
- go test -race ./...
security-check:
image: aquasec/trivy:latest
script:
- trivy image myapp:${COMMIT_SHA}
deploy-dev:
image: alpine:latest
condition: $BRANCH != "main" && $BRANCH != "staging"
script:
- echo "Deploying to dev environment..."
- kubectl apply -f k8s/dev/
deploy-staging:
image: alpine:latest
condition: $BRANCH == "staging"
script:
- echo "Deploying to staging environment..."
- kubectl apply -f k8s/staging/
deploy-prod:
image: alpine:latest
condition: $BRANCH == "main"
script:
- echo "Deploying to production environment..."
- kubectl apply -f k8s/prod/
Scenario: Testing different feature combinations.
# feature-test.yaml
workflow:
- test-feature-a
- test-feature-b
- test-feature-combo
test-feature-a:
image: myapp:latest
env:
- FEATURE_A=true
- FEATURE_B=false
script:
- npm test -- --grep "Feature A"
test-feature-b:
image: myapp:latest
env:
- FEATURE_A=false
- FEATURE_B=true
script:
- npm test -- --grep "Feature B"
test-feature-combo:
image: myapp:latest
env:
- FEATURE_A=true
- FEATURE_B=true
script:
- npm test -- --grep "Feature Integration"
Scenario: Debugging with different logging levels and tools.
# debug.yaml
workflow:
- debug-verbose
- debug-profiling
- debug-memory
debug-verbose:
image: myapp:latest
copyFiles: true
env:
- LOG_LEVEL=debug
- DEBUG=*
script:
- npm start
debug-profiling:
image: node:18-alpine
copyFiles: true
script:
- npm install -g clinic
- clinic doctor -- node app.js
debug-memory:
image: node:18-alpine
copyFiles: true
script:
- node --inspect=0.0.0.0:9229 app.js
Scenario: Testing network connectivity and API endpoints.
# network-debug.yaml
workflow:
- connectivity-test
- api-health-check
- dns-resolution
connectivity-test:
image: alpine:latest
script:
- ping -c 3 google.com
- telnet database 5432 || echo "Database connection failed"
api-health-check:
image: alpine:latest
script:
- apk add --no-cache curl jq
- curl -v http://api:8080/health | jq .
dns-resolution:
image: alpine:latest
script:
- nslookup api
- nslookup database
Scenario: Extract, Transform, Load data processing.
# etl-pipeline.yaml
workflow:
- extract-data
- transform-data
- validate-data
- load-data
extract-data:
image: python:3.11-alpine
copyFiles: true
env:
- SOURCE_DB_URL=postgresql://user:pass@source:5432/db
script:
- python extract.py
transform-data:
image: python:3.11-alpine
copyFiles: true
script:
- python transform.py --input raw_data.csv --output clean_data.csv
validate-data:
image: python:3.11-alpine
copyFiles: true
script:
- python validate.py --data clean_data.csv
load-data:
image: python:3.11-alpine
copyFiles: true
env:
- TARGET_DB_URL=postgresql://user:pass@target:5432/db
script:
- python load.py --data clean_data.csv
Scenario: Training and evaluating ML models.
# ml-pipeline.yaml
workflow:
- prepare-data
- train-model
- evaluate-model
- deploy-model
prepare-data:
image: python:3.11-slim
copyFiles: true
script:
- pip install pandas scikit-learn
- python prepare_data.py
train-model:
image: tensorflow/tensorflow:latest
copyFiles: true
script:
- python train_model.py --epochs 100
evaluate-model:
image: python:3.11-slim
copyFiles: true
script:
- pip install scikit-learn matplotlib
- python evaluate_model.py
deploy-model:
image: python:3.11-slim
condition: $MODEL_ACCURACY > "0.9"
script:
- echo "Model meets accuracy threshold, deploying..."
- python deploy_model.py
Scenario: Testing deployment across different cloud providers.
# multi-cloud.yaml
workflow:
- test-aws
- test-gcp
- test-azure
test-aws:
image: amazon/aws-cli:latest
env:
- AWS_REGION=us-east-1
script:
- aws s3 ls
- aws ecs describe-clusters
test-gcp:
image: google/cloud-sdk:alpine
env:
- GOOGLE_CLOUD_PROJECT=my-project
script:
- gcloud compute instances list
- gcloud container clusters list
test-azure:
image: mcr.microsoft.com/azure-cli:latest
script:
- az vm list
- az aks list
Scenario: Validating Terraform/CloudFormation templates.
# iac-validation.yaml
workflow:
- terraform-validate
- terraform-plan
- cloudformation-validate
terraform-validate:
image: hashicorp/terraform:latest
copyFiles: true
script:
- terraform init
- terraform validate
- terraform fmt -check
terraform-plan:
image: hashicorp/terraform:latest
copyFiles: true
script:
- terraform plan -out=tfplan
cloudformation-validate:
image: amazon/aws-cli:latest
copyFiles: true
script:
- aws cloudformation validate-template --template-body file://template.yaml
Scenario: Comprehensive security analysis.
# security-scan.yaml
workflow:
- dependency-scan
- secret-scan
- container-scan
- static-analysis
dependency-scan:
image: node:18-alpine
copyFiles: true
script:
- npm audit --audit-level=moderate
- npx snyk test
secret-scan:
image: trufflesecurity/trufflehog:latest
copyFiles: true
script:
- trufflehog filesystem .
container-scan:
image: aquasec/trivy:latest
script:
- trivy image myapp:latest
static-analysis:
image: sonarsource/sonar-scanner-cli:latest
copyFiles: true
script:
- sonar-scanner -Dsonar.projectKey=myproject
This comprehensive guide shows how Pin can be integrated into various development and operational workflows, providing flexibility and consistency across different environments.