All checks were successful
Reindex Knowledge Base / reindex (push) Successful in 3s
Adds title, description, type, domain, and tags frontmatter to every doc for improved KB semantic search. The description field is prepended to every search chunk, and domain/type/tags enable filtered queries. Type values: context, guide, runbook, reference, troubleshooting Domain values match directory structure (networking, docker, etc.) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
365 lines
8.6 KiB
Markdown
365 lines
8.6 KiB
Markdown
---
|
|
title: "CI/CD Deployment Strategies"
|
|
description: "Decision framework and implementation guide for choosing deployment automation levels (manual through blue-green). Covers 5 progressive strategies with safety best practices, rollback procedures, and per-project recommendations."
|
|
type: guide
|
|
domain: server-configs
|
|
tags: [gitea, ci-cd, deployment, docker, rollback, blue-green, health-checks]
|
|
---
|
|
|
|
# Deployment Strategies for Gitea CI/CD
|
|
|
|
Guide to choosing and implementing deployment automation for your projects.
|
|
|
|
## 🎯 Decision Framework
|
|
|
|
### Consider These Factors
|
|
|
|
1. **Criticality**: How important is uptime?
|
|
- Discord bot for active league: HIGH
|
|
- Personal project: LOW
|
|
- Public API: VERY HIGH
|
|
|
|
2. **Test Coverage**: How confident are you in your tests?
|
|
- Comprehensive unit + integration tests: AUTO-DEPLOY OK
|
|
- Some tests: SEMI-AUTO
|
|
- No tests: MANUAL ONLY
|
|
|
|
3. **Rollback Complexity**: Can you easily revert?
|
|
- Docker with versioned images: EASY
|
|
- Database migrations: HARD
|
|
- Stateful services: MEDIUM
|
|
|
|
4. **Traffic Patterns**: When can you deploy?
|
|
- 24/7 users: Need zero-downtime
|
|
- Business hours only: Deploy off-hours
|
|
- Low traffic: Restart acceptable
|
|
|
|
## 📊 Deployment Options Comparison
|
|
|
|
| Strategy | Speed | Safety | Complexity | Best For |
|
|
|----------|-------|--------|------------|----------|
|
|
| **Manual** | Slow | High | Low | Critical systems, low test coverage |
|
|
| **Semi-Auto** | Medium | High | Low | Most projects (recommended) |
|
|
| **Auto + Health** | Fast | Medium | Medium | Good test coverage, health endpoints |
|
|
| **Blue-Green** | Fast | High | High | Zero-downtime required |
|
|
| **Canary** | Fast | Very High | Very High | Large user base, gradual rollout |
|
|
|
|
## 🚀 Recommended Progression
|
|
|
|
### Level 1: Manual Deploy (Start Here)
|
|
```bash
|
|
# Simple, safe, controllable
|
|
ssh production
|
|
docker compose pull
|
|
docker compose up -d
|
|
```
|
|
|
|
**Pros:**
|
|
- ✅ Full control over timing
|
|
- ✅ Can test/verify first
|
|
- ✅ Simple to understand
|
|
- ✅ Easy to abort
|
|
|
|
**Cons:**
|
|
- ❌ Requires manual SSH
|
|
- ❌ Inconsistent process
|
|
- ❌ Slower deployments
|
|
|
|
### Level 2: Deploy Script (Easy Win)
|
|
```bash
|
|
# One command from local machine
|
|
./deploy.sh v1.8.1
|
|
```
|
|
|
|
**Pros:**
|
|
- ✅ Consistent process
|
|
- ✅ Pre-deployment checks
|
|
- ✅ Still manual control
|
|
- ✅ Rollback instructions
|
|
|
|
**Cons:**
|
|
- ❌ Still requires human
|
|
- ❌ Can't deploy from CI
|
|
|
|
**Setup:** Copy `/tmp/deploy.sh` to your repo root
|
|
|
|
### Level 3: CI Notifies, Manual Deploy
|
|
```yaml
|
|
# Workflow builds, then notifies:
|
|
- Discord: "v1.8.1 ready to deploy"
|
|
- You run: ./deploy.sh v1.8.1
|
|
```
|
|
|
|
**Pros:**
|
|
- ✅ Fast build process
|
|
- ✅ Clear deployment signal
|
|
- ✅ Choose deployment timing
|
|
- ✅ Audit trail
|
|
|
|
**Cons:**
|
|
- ❌ Two-step process
|
|
- ❌ Can forget to deploy
|
|
|
|
**Current State:** This is where Paper Dynasty is now ✅
|
|
|
|
### Level 4: Auto-Deploy with Safeguards
|
|
```yaml
|
|
# Workflow builds, tests, deploys, health checks
|
|
- Build image
|
|
- Push to Docker Hub
|
|
- SSH to production
|
|
- Pull and restart
|
|
- Health check
|
|
- Rollback on failure
|
|
- Notify Discord
|
|
```
|
|
|
|
**Pros:**
|
|
- ✅ Fully automated
|
|
- ✅ Fast deployment
|
|
- ✅ Automatic rollback
|
|
- ✅ Consistent process
|
|
|
|
**Cons:**
|
|
- ❌ Complexity
|
|
- ❌ Brief downtime
|
|
- ❌ Requires good health checks
|
|
|
|
**Setup:** Use `/tmp/safe-auto-deploy-step.yml`
|
|
|
|
### Level 5: Blue-Green Deployment
|
|
```yaml
|
|
# Run two environments, switch traffic
|
|
- Deploy to "green" environment
|
|
- Health check green
|
|
- Switch load balancer to green
|
|
- Keep "blue" as instant rollback
|
|
```
|
|
|
|
**Pros:**
|
|
- ✅ Zero downtime
|
|
- ✅ Instant rollback
|
|
- ✅ Test before switching
|
|
- ✅ Very safe
|
|
|
|
**Cons:**
|
|
- ❌ Requires two environments
|
|
- ❌ Needs load balancer
|
|
- ❌ Database complexity
|
|
- ❌ 2x resources
|
|
|
|
**Best For:** High-traffic web services
|
|
|
|
## 🎯 Recommendations by Project Type
|
|
|
|
### Discord Bot (Paper Dynasty)
|
|
**Recommended:** Level 3 (CI Notify + Manual Deploy)
|
|
|
|
**Why?**
|
|
- Active users (league members)
|
|
- Brief downtime acceptable (1-2 min)
|
|
- Manual timing is valuable
|
|
- Can deploy during off-hours
|
|
|
|
**Next Step:** Add deploy script for consistency
|
|
|
|
### Internal Tool / Dashboard
|
|
**Recommended:** Level 4 (Auto-Deploy with Health Check)
|
|
|
|
**Why?**
|
|
- Limited users
|
|
- Downtime less critical
|
|
- Faster iteration valuable
|
|
- Easy rollback available
|
|
|
|
### Public API / High Traffic
|
|
**Recommended:** Level 5 (Blue-Green) or Canary
|
|
|
|
**Why?**
|
|
- Zero downtime required
|
|
- Large user base
|
|
- Complex rollback scenarios
|
|
- Worth the complexity
|
|
|
|
### Personal Project / Portfolio
|
|
**Recommended:** Level 2 or 3
|
|
|
|
**Why?**
|
|
- Simple is better
|
|
- Automation overhead not worth it
|
|
- Infrequent deploys
|
|
- Learning opportunity
|
|
|
|
## 🛠️ Implementation Guide
|
|
|
|
### Adding Auto-Deploy to Paper Dynasty
|
|
|
|
If you decide to try auto-deploy:
|
|
|
|
1. **Add deploy SSH key to secrets:**
|
|
```bash
|
|
# Generate deploy-only SSH key
|
|
ssh-keygen -t ed25519 -f ~/.ssh/paper_dynasty_deploy -C "gitea-deploy"
|
|
|
|
# Add public key to sba-bots
|
|
ssh-copy-id -i ~/.ssh/paper_dynasty_deploy.pub cal@10.10.0.88
|
|
|
|
# Add private key to Gitea secrets
|
|
cat ~/.ssh/paper_dynasty_deploy
|
|
# Copy to: Repo → Settings → Secrets → DEPLOY_SSH_KEY
|
|
```
|
|
|
|
2. **Add production host secret:**
|
|
- Secret name: `PRODUCTION_HOST`
|
|
- Value: `10.10.0.88`
|
|
|
|
3. **Add deploy user secret:**
|
|
- Secret name: `DEPLOY_USER`
|
|
- Value: `cal`
|
|
|
|
4. **Add deploy step to workflow:**
|
|
- Copy from `/tmp/safe-auto-deploy-step.yml`
|
|
- Paste after "Build Docker image" step
|
|
- Update webhook URL
|
|
|
|
5. **Test with a minor change:**
|
|
- Make a small PR (comment change)
|
|
- Merge and watch deployment
|
|
- Verify bot restarts successfully
|
|
- Check Discord for notifications
|
|
|
|
6. **Monitor first few deployments:**
|
|
- Watch for issues
|
|
- Check logs: `ssh sba-bots 'docker compose logs'`
|
|
- Verify no errors
|
|
|
|
### Adding Health Checks
|
|
|
|
For better auto-deploy safety, add a health endpoint to your bot:
|
|
|
|
```javascript
|
|
// Express health check endpoint
|
|
app.get('/health', (req, res) => {
|
|
// Check Discord connection
|
|
if (!client.ws.ping) {
|
|
return res.status(503).json({ status: 'unhealthy', reason: 'Discord disconnected' });
|
|
}
|
|
|
|
// Check database connection
|
|
if (!db.isConnected()) {
|
|
return res.status(503).json({ status: 'unhealthy', reason: 'Database disconnected' });
|
|
}
|
|
|
|
res.json({
|
|
status: 'healthy',
|
|
version: process.env.VERSION,
|
|
uptime: process.uptime(),
|
|
discord: {
|
|
guilds: client.guilds.cache.size,
|
|
ping: client.ws.ping
|
|
}
|
|
});
|
|
});
|
|
```
|
|
|
|
Then health check in deploy script:
|
|
```bash
|
|
curl -f http://localhost:3000/health || rollback
|
|
```
|
|
|
|
## ⚠️ Safety Best Practices
|
|
|
|
### Before Auto-Deploying
|
|
|
|
1. **✅ Add Comprehensive Tests**
|
|
- Unit tests for core logic
|
|
- Integration tests for Discord API
|
|
- Smoke tests for critical paths
|
|
|
|
2. **✅ Implement Health Checks**
|
|
- HTTP endpoint for status
|
|
- Check all critical services
|
|
- Return proper status codes
|
|
|
|
3. **✅ Set Up Monitoring**
|
|
- Error tracking (Sentry)
|
|
- Performance monitoring (Datadog)
|
|
- Discord webhook for errors
|
|
|
|
4. **✅ Plan Rollback Process**
|
|
- Keep last 3 images cached
|
|
- Document rollback steps
|
|
- Test rollback procedure
|
|
|
|
5. **✅ Document Deployment**
|
|
- What gets deployed
|
|
- How to abort
|
|
- How to rollback
|
|
- Who to contact
|
|
|
|
### During Deployment
|
|
|
|
1. **Monitor Logs**
|
|
```bash
|
|
docker compose logs -f
|
|
```
|
|
|
|
2. **Check Metrics**
|
|
- Response times
|
|
- Error rates
|
|
- Resource usage
|
|
|
|
3. **Verify Functionality**
|
|
- Test critical commands
|
|
- Check database connections
|
|
- Verify integrations
|
|
|
|
### After Deployment
|
|
|
|
1. **Watch for Issues**
|
|
- First 5 minutes are critical
|
|
- Check error channels
|
|
- Monitor user reports
|
|
|
|
2. **Validate Success**
|
|
- All services healthy
|
|
- No error spike
|
|
- Performance normal
|
|
|
|
3. **Document Issues**
|
|
- What went wrong
|
|
- How you fixed it
|
|
- How to prevent
|
|
|
|
## 🔄 Rollback Procedures
|
|
|
|
### Quick Rollback (Docker)
|
|
```bash
|
|
ssh production
|
|
cd /path/to/app
|
|
docker compose down
|
|
docker tag yourusername/repo:current yourusername/repo:rollback-backup
|
|
docker pull yourusername/repo:v1.7.0 # Last known good
|
|
docker compose up -d
|
|
```
|
|
|
|
### Emergency Rollback (CI)
|
|
```yaml
|
|
# Manually trigger workflow with old version
|
|
git tag -f v1.7.0-redeploy
|
|
git push -f origin v1.7.0-redeploy
|
|
# Watch actions deploy old version
|
|
```
|
|
|
|
## 📚 Further Reading
|
|
|
|
- [Deployment Strategies](https://www.redhat.com/en/topics/devops/deployment-strategies)
|
|
- [Blue-Green Deployments](https://martinfowler.com/bliki/BlueGreenDeployment.html)
|
|
- [Canary Releases](https://martinfowler.com/bliki/CanaryRelease.html)
|
|
- [Docker Health Checks](https://docs.docker.com/engine/reference/builder/#healthcheck)
|
|
|
|
---
|
|
|
|
**Last Updated:** 2026-02-04
|
|
**Applies To:** Paper Dynasty Discord bot, future Gitea CI/CD projects
|