Continuous Integration and Continuous Deployment (CI/CD) is the backbone of modern software delivery. When done right, it lets your team ship code confidently, multiple times a day, without the risk of breaking production.
What Is a CI/CD Pipeline?
A CI/CD pipeline automates the steps between writing code and running it in production. Every time a developer pushes code, the pipeline runs — building the app, running tests, scanning for vulnerabilities, and deploying if everything passes.
Setting Up with GitHub Actions
GitHub Actions is the easiest way to get started. Create a .github/workflows/deploy.yml file in your repo:
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Tests
run: npm test
- name: Deploy to VPS
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.VPS_HOST }}
username: ${{ secrets.VPS_USER }}
key: ${{ secrets.VPS_SSH_KEY }}
script: |
cd /var/www/myapp
git pull origin main
npm install --production
pm2 restart app
Key Stages Every Pipeline Needs
- Build — compile code, resolve dependencies
- Test — unit tests, integration tests, lint checks
- Security Scan — check for vulnerable packages with tools like Trivy or Snyk
- Deploy — push to staging first, then promote to production
Best Practices
Keep your pipeline fast — aim for under 5 minutes. Cache dependencies aggressively. Use environment-specific secrets stored in your CI provider, never in code. Add a manual approval step before production deploys on critical systems.
At EkamOps, we build pipelines that give teams confidence to ship fast. Get in touch if you want us to review or build yours.