Manual Deploy Adalah Time Bomb
Jika Anda masih manual deploy SaaS ke production, you are sitting on a time bomb. Saya pernah lupa satu step di deployment dan production down selama 2 jam. Sejak saat itu, CI/CD bukan optional mandatory.
CI/CD Pipeline yang Saya Gunakan
Untuk SaaS Go, pipeline saya selalu punya 4 stage:
- Lint dan Format Pastikan kode clean sebelum masuk
- Test Unit test, integration test
- Build Compile binary dan Docker image
- Deploy Auto-deploy ke staging, manual approve untuk production
GitHub Actions Setup yang Praktis
# .github/workflows/deploy.yml
name: CI/CD Pipeline
on:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.22"
- name: Lint
run: golangci-lint run
- name: Test
run: go test -v -race ./...
- name: Build
run: CGO_ENABLED=0 go build -o server ./cmd/server
deploy:
needs: test
runs-on: ubuntu-latest
if: github.ref == "refs/heads/main"
steps:
- name: Deploy to production
run: echo "Deploying..."
Deployment Strategy
Untuk SaaS, saya recommend rolling deployment dengan zero-downtime. Di Go, ini mudah karena binary-nya small dan startup time-nya cepat. Setup graceful shutdown:
func main() {
app := fiber.New()
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
fmt.Println("Gracefully shutting down...")
app.Shutdown()
}()
app.Listen(":8080")
}
Tips Tambahan
- Database migrations harus di-automate dalam pipeline jangan pernah manual migrate production
- Gunakan secrets management yang proper (GitHub Secrets, Vault, atau minimal env vars)
- Setup notification (Slack/Telegram) untuk setiap deploy
- Implement rollback mechanism kalau deploy gagal, otomatis rollback ke versi sebelumnya
Good CI/CD bukan cuma soal automation ini soal confidence. Kalau Anda confident untuk deploy kapan saja, velocity tim akan naik drastis.
Database Migration dalam CI/CD Pipeline
Salah satu aspek yang paling sering dilupakan adalah automated database migration. Jangan pernah manual apply migration di production. Di pipeline saya:
# Step dalam CI/CD pipeline
1. Run migration tests against test database
2. Backup production database
3. Apply migrations to production
4. Run smoke tests
5. If any step fails, automatic rollback
Untuk rollback, saya simpan semua down migration files. Jika migration gagal atau ada issue setelah apply, pipeline bisa otomatis jalankan down migration dan restore dari backup.
Monitoring Post-Deploy
Deploy tidak berhenti di deployment. 15 menit pertama setelah deploy adalah golden window untuk detect issue. Setup:
- Error rate alert kalau error rate naik lebih dari 2x dari baseline, alert ke Slack
- Latency monitoring P99 latency yang tiba-tiba naik bisa jadi tanda masalah
- Deployment dashboard real-time view of all services post-deploy
Saya juga selalu pantau resource usage post-deploy. Memory leak atau CPU spike bisa jadi tanda regression yang tidak tertangkap oleh test suite.