Revique Portal Infrastructure
Documentation
Complete CI/CD Pipeline & AWS Infrastructure Guide
Table of Contents
01
Architecture Overview
BOTH ENVSThe Revique Portal uses a fully automated CI/CD pipeline. Developers push code to Bitbucket, which automatically mirrors the code to AWS CodeCommit. AWS CodePipeline then detects the change, builds the application using CodeBuild, and deploys the output to an S3 bucket served via CloudFront with HTTPS.
Developer
Push
Push
→
Bitbucket
Repo
Repo
→
AWS
CodeCommit
CodeCommit
→
AWS
CodeBuild
CodeBuild
→
S3
Bucket
Bucket
→
CloudFront
CDN
CDN
→
Live
Website
Website
ℹ️ Auto-Trigger: AWS EventBridge monitors CodeCommit for branch updates and automatically starts CodePipeline — no manual intervention needed.
02
AWS Account Structure
ACCOUNTS
🟣
XXXXXXXXXXX
UAT Account
hptuat
| Profile Name | hptuat |
| Region | us-east-2 (Ohio) |
| CodeCommit Repo | Portal-UAT-Revique |
| Branch | uat_v2 |
| Domain | portal.uat.revique.io |
🔴
XXXXXXXXXXX
Production Account
hptprod
| Profile Name | hptprod |
| Region | us-east-2 (Ohio) |
| CodeCommit Repo | Portal-Prod-Revique |
| Branch | master_v2 |
| Domain | portal.revique.io |
03
UAT Environment
UAT ONLYComplete UAT Infrastructure
| Component | Name / Value | Details |
|---|---|---|
| AWS Account ID | XXXXXXXXXXX | hptuat profile |
| CodeCommit Repo | Portal-UAT-Revique | Source repository in AWS |
| Branch | uat_v2 | Triggers pipeline on push |
| CodeBuild Project | revique-ui-uat-build-project | Builds React app |
| CodePipeline | revique-ui-uat | Orchestrates Source→Build→Deploy |
| Artifact S3 Bucket | codepipeline-us-east-2-76a8443243b5-479b-bb96-e72bad77cef8 | Pipeline artifacts storage |
| Deploy S3 Bucket | portal.uat.revique.io | Static website hosting |
| CloudFront Distribution | XXXXXXXXXXX | XXXXXXXXXXX |
| SSL Certificate | ACM (us-east-1) | portal.uat.revique.io — ISSUED |
| Live URL | https://portal.uat.revique.io | Public HTTPS URL |
| API Backend | api.uat.hellopatients.com | API Gateway → Lambda |
| API Gateway ID | e5vhce1xnb | Stage: v1 |
| EventBridge Rule | Portal-UAT-CodeCommit-Trigger | Auto-triggers pipeline on push |
| CodePipeline Role | AWSCodePipelineServiceRole-us-east-2-Portal-UAT-Pipeline | IAM role for pipeline |
| CodeBuild Role | codebuild-Portal-UAT-Build-service-role | IAM role for build |
UAT Environment Variables (.env.uat)
.env.uat
VITE_AI_BASE_URL=https://sleepy-basin-33614-067a01f695d7.herokuapp.com VITE_BASE_URL=https://api.uat.hellopatients.com VITE_IOT_ENDPOINT=a1us6xreawsz2f-ats.iot.us-east-2.amazonaws.com VITE_REGION=us-east-2
UAT Pipeline Stages
Source
CodeCommit
CodeCommit
→
Build
CodeBuild
CodeBuild
→
Deploy
Amazon S3
Amazon S3
✅ No Manual Approval Required for UAT. Every push to uat_v2 branch automatically goes through Source → Build → Deploy without any manual intervention.
04
Production Environment
PROD ONLYComplete Production Infrastructure
| Component | Name / Value | Details |
|---|---|---|
| AWS Account ID | XXXXXXXXXXX | hptprod profile |
| CodeCommit Repo | Portal-Prod-Revique | Source repository in AWS |
| Branch | master_v2 | Triggers pipeline on push |
| CodeBuild Project | revique-ui-prod-build-project | Builds React app |
| CodePipeline | revique-ui-prod | Orchestrates Source→Build→Approve→Deploy |
| Artifact S3 Bucket | codepipeline-us-east-2-portal-prod-revique | Pipeline artifacts storage |
| Deploy S3 Bucket | portal.revique.io | Static website hosting |
| CloudFront Distribution | XXXXXXXXXXX | XXXXXXXXXXX |
| SSL Certificate | ACM (us-east-1) | portal.revique.io — ISSUED |
| Live URL | https://portal.revique.io | Public HTTPS URL |
| API Backend | api.hellopatients.com | Production API |
| EventBridge Rule | Portal-Prod-CodeCommit-Trigger | Auto-triggers pipeline on push |
| Manual Approval | ✅ ENABLED | Required before Deploy stage |
| CodePipeline Role | AWSCodePipelineServiceRole-us-east-2-Portal-Prod-Pipeline | IAM role for pipeline |
| CodeBuild Role | codebuild-Portal-Prod-Build-service-role | IAM role for build |
Production Environment Variables (.env.prod)
.env.prod
VITE_AI_BASE_URL=https://sleepy-basin-33614-067a01f695d7.herokuapp.com VITE_BASE_URL=https://api.hellopatients.com VITE_IOT_ENDPOINT=a1us6xreawsz2f-ats.iot.us-east-2.amazonaws.com VITE_REGION=us-east-2
Production Pipeline Stages (With Manual Approval)
Source
CodeCommit
CodeCommit
→
Build
CodeBuild
CodeBuild
→
Manual
Approval
Approval
→
Deploy
Amazon S3
Amazon S3
⚠️ Manual Approval Required for Production! After Build completes, someone must go to AWS Console → CodePipeline → revique-ui-prod → Click "Review" → Click "Approve" before the Deploy stage runs.
How to Approve Production Deployment
- Go to AWS Console → CodePipeline → revique-ui-prod
- Wait for Build stage to complete (green checkmark)
- In the Approve stage, click "Review" button
- Add a comment (optional) and click "Approve"
- Deploy stage will automatically start
- Verify on https://portal.revique.io
05
Bitbucket Pipeline Configuration
BOTH ENVSRepository Variables Required
| Variable Name | Value | Secured | Purpose |
|---|---|---|---|
| SSH_KEY_ID | XXXXXXXXXXXXXXXX | NO | IAM SSH Key ID for CodeCommit authentication |
| BITBUCKET_SSH_KEY_FILE | (auto-provided by Bitbucket) | YES | SSH private key file path |
Complete bitbucket-pipelines.yml
bitbucket-pipelines.yml
image: atlassian/default-image:2 pipelines: branches: # ── HPTUI-2.0 Branches (hptdev account) ── master: - step: name: Push to CodeCommit (master) script: - git fetch --unshallow - echo "Host git-codecommit.*.amazonaws.com" >> ~/.ssh/config - echo " User $SSH_KEY_ID" >> ~/.ssh/config - echo " IdentityFile $BITBUCKET_SSH_KEY_FILE" >> ~/.ssh/config - git remote add codecommit ssh://git-codecommit.us-east-2.amazonaws.com/v1/repos/HPTUI-2.0 - git push codecommit ${BITBUCKET_BRANCH} master_v2: - step: name: Push to CodeCommit (master_v2 → PROD) script: - git fetch --unshallow - echo "Host git-codecommit.*.amazonaws.com" >> ~/.ssh/config - echo " User $SSH_KEY_ID" >> ~/.ssh/config - echo " IdentityFile $BITBUCKET_SSH_KEY_FILE" >> ~/.ssh/config - git remote add codecommit ssh://git-codecommit.us-east-2.amazonaws.com/v1/repos/Portal-Prod-Revique - git push codecommit ${BITBUCKET_BRANCH} uat_v2: - step: name: Push to CodeCommit (uat_v2 → UAT) script: - git fetch --unshallow - echo "Host git-codecommit.*.amazonaws.com" >> ~/.ssh/config - echo " User $SSH_KEY_ID" >> ~/.ssh/config - echo " IdentityFile $BITBUCKET_SSH_KEY_FILE" >> ~/.ssh/config - git remote add codecommit ssh://git-codecommit.us-east-2.amazonaws.com/v1/repos/Portal-UAT-Revique - git push codecommit ${BITBUCKET_BRANCH}
Branch to Environment Mapping
| Bitbucket Branch | CodeCommit Repo | AWS Account | Environment |
|---|---|---|---|
| uat_v2 | Portal-UAT-Revique | hptuat (XXXXXXXXXXX) | UAT |
| master_v2 | Portal-Prod-Revique | hptprod (XXXXXXXXXXX) | PRODUCTION |
06
Complete CI/CD Flow
BOTH ENVS
🟣
UAT Flow
- Developer pushes to uat_v2 branch on Bitbucket
- Bitbucket Pipeline triggers automatically
- Pipeline runs
git fetch --unshallow - Code pushed to Portal-UAT-Revique CodeCommit
- EventBridge detects CodeCommit update
- CodePipeline revique-ui-uat starts
- CodeBuild runs
buildspec.yml - Runs
npm install && npm run builduat - Deploys
dist/to portal.uat.revique.io S3 - Live at https://portal.uat.revique.io
🔴
Production Flow
- Developer pushes to master_v2 branch on Bitbucket
- Bitbucket Pipeline triggers automatically
- Pipeline runs
git fetch --unshallow - Code pushed to Portal-Prod-Revique CodeCommit
- EventBridge detects CodeCommit update
- CodePipeline revique-ui-prod starts
- CodeBuild runs
buildspec.yml - Runs
npm install && npm run buildprod - PAUSES for Manual Approval!
- Approver clicks Approve in AWS Console
- Deploys
dist/to portal.revique.io S3 - Live at https://portal.revique.io
07
BuildSpec Configuration
BOTH ENVS
🟣
buildspec.yml (UAT)
yaml
version: 0.2 phases: pre_build: commands: - node -v - npm -v - rm -Rf node_modules/ - npm install build: commands: - echo "Building for $ENV" - "npm run build$ENV" artifacts: files: - '**/*' discard-paths: no base-directory: dist
🔴
buildspec.yml (PROD)
yaml
version: 0.2 phases: pre_build: commands: - node -v - npm -v - rm -Rf node_modules/ - npm install build: commands: - echo "Building for $ENV" - "npm run build$ENV" artifacts: files: - '**/*' discard-paths: no base-directory: dist
Build Commands Explanation
| Command | What it does |
|---|---|
| base-directory: dist | Only the dist/ folder is uploaded to S3 |
08
Domain & SSL Setup
GODADDY + AWSGoDaddy DNS Records
| Type | Name | Value | Environment |
|---|---|---|---|
| CNAME | portal.uat | XXXXXXXXXXX | UAT |
| CNAME | portal | XXXXXXXXXXX | PROD |
SSL Certificates (AWS ACM)
| Domain | Certificate ARN | Region | Status |
|---|---|---|---|
| portal.uat.revique.io | arn:aws:acm:us-east-1:XXXXXXXXXXX:certificate/XXXXXXXXXXX... | us-east-1 | ISSUED |
| portal.revique.io | arn:aws:acm:us-east-1:XXXXXXXXXXX:certificate/XXXXXXXXXXX... | us-east-1 | ISSUED |
ℹ️ Important: SSL Certificates MUST be in us-east-1 region for CloudFront to use them, even though all other resources are in us-east-2.
CloudFront Distributions
| Distribution ID | Domain | Origin (S3) | Environment |
|---|---|---|---|
| XXXXXXXXXXX | XXXXXXXXXXX | portal.uat.revique.io.s3-website.us-east-2.amazonaws.com | UAT |
| XXXXXXXXXXX | XXXXXXXXXXX | portal.revique.io.s3-website.us-east-2.amazonaws.com | PROD |
09
Developer Checklist
DEVELOPERS
🟣
Deploy to UAT
- Make your code changes locally
- Test locally with
npm run builduat - Commit your changes
- Push to uat_v2 branch on Bitbucket
- Bitbucket pipeline will auto-trigger
- Wait ~3-5 mins for build to complete
- Check https://portal.uat.revique.io
✅ No manual steps required!
🔴
Deploy to Production
- Ensure code is tested on UAT first
- Commit your changes
- Push to master_v2 branch on Bitbucket
- Bitbucket pipeline will auto-trigger
- Wait for Build stage to complete
- Go to AWS Console → CodePipeline
- Click Review → Approve
- Wait ~2 mins for deploy
- Check https://portal.revique.io
⚠️ Manual approval required before deploy!
Quick Reference Commands
CLI Reference
# Check UAT Pipeline Status aws codepipeline get-pipeline-state --name revique-ui-uat --profile hptuat # Manually Trigger UAT Pipeline aws codepipeline start-pipeline-execution --name revique-ui-uat --profile hptuat # Check PROD Pipeline Status aws codepipeline get-pipeline-state --name revique-ui-prod --profile hptprod # Manually Trigger PROD Pipeline aws codepipeline start-pipeline-execution --name revique-ui-prod --profile hptprod # Get Approval Token for PROD aws codepipeline get-pipeline-state \ --name revique-ui-prod --profile hptprod \ --query 'stageStates[?stageName==`Approve`].actionStates[0].latestExecution.token' \ --output text # Approve PROD Deployment via CLI aws codepipeline put-approval-result \ --pipeline-name revique-ui-prod \ --stage-name Approve \ --action-name ManualApproval \ --result '{"summary":"Approved","status":"Approved"}' \ --token YOUR_TOKEN \ --profile hptprod
Troubleshooting
| Issue | Cause | Fix |
|---|---|---|
| Bitbucket pipeline fails | SSH key issue | Check SSH_KEY_ID variable in Bitbucket settings |
| CodeBuild fails | Missing permissions | Check CodeBuild IAM role permissions |
| Deploy fails — S3 Access Denied | CodePipeline role missing S3 permissions | Add S3PutObject permission to pipeline role |
| Pipeline not auto-triggering | EventBridge rule not configured | Check EventBridge rule and target role |
| Wrong API URL in build | .env file not copied correctly in buildspec | Verify cp command in buildspec.yml pre_build |
| Site shows old content | CloudFront cache | Create CloudFront invalidation: /* |