In this workshop, you’ll collaborate on a real-world CI/CD workflow using GitHub, Vercel, PostgreSQL, and the Person App (CRUD) project.
One student (the Branch Owner) has already forked Callum's Person App repo, deployed the main branch to Vercel Production, and connected it to a PostgreSQL database on Vercel Storage using Neon Postgres.
The team will use GitHub for version control and collaboration, Vercel for deployments, and Prisma ORM for database access and schema migrations.
RoleResponsibilities
Branch Owner
Manages the GitHub repo, creates the dev branch, connects and deploys to Vercel (Production and Staging), configures environments, handles PR approvals, and controls database access for UAT and Production.
Collaborators
Each creates their own local Postgres DB via Neon (Vercel Storage), implements features, raises and revises PRs, and handles their own Prisma migrations locally.
Each team member completes one of the following tasks using a feature branch:
TaskBranch Example
Add current year in footer
feat/footer-year
Enhance nav bar
feat/nav-enhancement
Update landing page
feat/landing-page
Improve login page UI
feat/login-page
Enhance dashboard
feat/dashboard-ui
Remove unused variables
chore/cleanup-vars
Refactor functions to typed declarations
refactor/typed-functions
Create your own Postgres DB instance using Vercel Storage (Neon):
Go to your Vercel dashboard → Storage → Neon → Create new project.
Copy the database connection URL.
Add your DB URL to .env (or .env.local):
1DATABASE_URL=postgresql://<your-credentials>@<your-db>.neon.tech/<db-name>Install dependencies:
1npm installRun your own Prisma migrations locally:
1npx prisma migrate dev --name init⚠️ You are responsible for managing your own schema locally using your own DB.
EnvironmentWho ManagesShareable?
Local (.env.local)
Each developer
✅ (your own instance)
Staging/UAT (.env.staging)
Branch Owner
❌
Production (.env.production)
Branch Owner
❌
⚠️ Only the Branch Owner has access to UAT and Production DB credentials.
🔧 If your feature requires schema changes (Prisma migration) on UAT or Production, the Branch Owner must perform the migration after merging.
1# Checkout dev2git checkout dev3git pull origin dev4
5
6# Create feature branch7git checkout -b feat/<task>8
9# Push branch10git push origin feat/<task>On GitHub → Pull Requests → New Pull Request
Base branch: dev, compare with your feat/<task> branch
Add a clear title and description
Tag a peer reviewer
Submit PR for review
As a reviewer:
View Files changed tab on the PR
Add inline comments or suggestions
Under Review changes, select:
✅ Approve
🔁 Request changes
💬 Comment only
Stay on your feature branch
Apply the requested changes
Push updates:
1git add .2git commit -m "fix: addressed PR feedback"3git push origin feat/<your-task>GitHub will automatically update the existing PR
Close the existing PR on GitHub
Create a new feature branch from dev:
1git checkout dev2git pull origin dev3git checkout -b feat/<task>-v2Reapply your changes, commit, and push
Raise a new PR and link the previous one for context
1git checkout main2# Make fix3git commit -am "fix: urgent production issue"4git push origin main1git checkout dev2git fetch origin3git rebase origin/main4# Resolve conflicts if needed5git push origin dev --force1git checkout feat/<your-task>2git fetch origin3git rebase origin/dev4# Resolve conflicts5git add .6git rebase --continue7git push origin feat/<your-task> --forceBranchDeployment
dev
Vercel Staging
main
Vercel Production
TypePrefixExample
Feature
feat:
feat: add footer year
Chore
chore:
chore: remove unused imports
Fix
fix:
fix: redirect issue
Refactor
refactor:
refactor: use typed function
Each dev created a Postgres DB via Neon and set .env.local
Prisma migration performed on local Neon instance
PR raised to dev
Peer review completed or feedback given
PR revised or resubmitted if needed
Branch Owner reviewed and merged PR
Prisma migration done on UAT/Prod by Branch Owner (if required)
Vercel Staging and Production deployments verified