4d2ababddf4516adc76075a37609af632937e964
🚀 CI/CD Deployment Guide (Template)
📌 This is a ready-to-use template. Replace example values with your own before using.
📦 Overview
This CI/CD setup automatically deploys your application when code is merged into environment branches.
🔁 Workflow (How Deployment Happens)
feature/* → PR → main → PR → (beta/testing/staging/production) → 🚀 deploy
Steps:
- Create feature branch →
feature/xyz - Raise PR →
main - Merge into
main - Raise PR →
main→ target environment branch - Merge → Deployment runs automatically
🌿 Branch Strategy
| Branch | Purpose |
|---|---|
main |
Stable code |
beta |
Internal testing |
testing |
QA testing |
staging |
Pre-production |
production |
Live |
⚙️ Environment Configuration
Each branch deploys to a different server.
Example Mapping
| Branch | Folder Path Example | PM2_ID Example |
|---|---|---|
| beta | /home/user/app-beta |
app-beta[3000] |
| testing | /home/user/app-testing |
app-testing[3001] |
| staging | /var/www/app-staging |
app-staging[4000] |
| production | /var/www/app-prod |
app-prod[5000] |
⚠️ PM2 Naming (VERY IMPORTANT)
Your PM2 process should be named like:
app-name[port]
✅ Example
app-backend[3000]
❌ Do NOT confuse with:
app-name[1234] ← random ID (WRONG)
⚠️ IMPORTANT RULE (Shell Safety)
Always wrap PM2_ID in quotes:
pm2 reload "$PM2_ID"
pm2 logs "$PM2_ID" --lines 50 --nostream
⚡ What the Deployment Does
On every deploy:
cd <PROJECT_FOLDER>
git fetch
git reset --hard origin/<BRANCH_NAME>
git pull origin <BRANCH_NAME>
git log --oneline -5
npm install
pm2 reload "<PM2_ID>"
pm2 logs "<PM2_ID>" --lines 50 --nostream
🔐 Required Secrets (VERY IMPORTANT)
You MUST configure these in your CI/CD (Gitea → Repository → Settings → Secrets)
🟡 For Beta / Testing (Password-based SSH)
Required Secrets:
BETA_SERVER_HOST=1.2.3.4
BETA_SERVER_USERNAME=your-user
BETA_SERVER_PASSWORD=your-password
BETA_SERVER_PORT=22
👉 Used for:
betatesting
🔵 For Staging (SSH Key-based)
Required Secrets:
STAGING_SERVER_HOST=1.2.3.5
STAGING_SERVER_USERNAME=ubuntu
STAGING_SERVER_KEY=<private-key-content>
STAGING_SERVER_PORT=22
🔴 For Production (SSH Key-based)
Required Secrets:
PRODUCTION_SERVER_HOST=1.2.3.6
PRODUCTION_SERVER_USERNAME=ubuntu
PRODUCTION_SERVER_KEY=<private-key-content>
PRODUCTION_SERVER_PORT=22
🔑 How to Add SSH Key
-
On your server:
cat ~/.ssh/id_rsa -
Copy the full private key:
-----BEGIN OPENSSH PRIVATE KEY----- ... -----END OPENSSH PRIVATE KEY----- -
Paste into:
STAGING_SERVER_KEY / PRODUCTION_SERVER_KEY
🚀 How to Deploy
Deploy to Beta
- Create PR →
main→beta - Merge → auto deploy
Deploy to Testing
- PR →
main→testing
Deploy to Staging
- PR →
main→staging
Deploy to Production
- PR →
main→production
🛠️ Debugging
Check CI Logs
- Gitea → Actions → Logs
SSH into Server
ssh user@server-ip
cd /your/project/path
Check PM2
pm2 list
pm2 logs
⚠️ Common Mistakes
❌ Using wrong PM2 ID
app-name[1234] ← dynamic ID
❌ Not quoting PM2_ID
pm2 reload $PM2_ID ❌
❌ Manual changes on server
git reset --hard will delete them
📈 Recommended Improvements
- Add
npm run build - Add health check
- Add rollback strategy
- Add notifications (Slack/Email)
- Add caching
🧑💻 TL;DR
- Always deploy via PR
- Use PM2 format:
app-name[port] - Always wrap in quotes
- Set correct secrets
- Never edit server manually
✅ Copy → Update values → Ready to use
Description