Skip to content

Push changes to Staging In Preparation for Final Submission #91

Push changes to Staging In Preparation for Final Submission

Push changes to Staging In Preparation for Final Submission #91

Workflow file for this run

# References https://docs.docker.com/build/ci/github-actions/
# https://stackoverflow.com/questions/77740410/github-docker-build-push-action-with-multiple-architectures-is-slow
name: 'Staging Environment CI/CD Pipeline'
on:
push:
branches:
- frontend-staging
- staging
pull_request:
branches:
- frontend-staging
- staging
workflow_dispatch:
jobs:
test:
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
node: [20, 22]
name: Run Tests on ${{ matrix.os }} with Node ${{ matrix.node }}
runs-on: ${{ matrix.os }}
steps:
- name: Checkout Codebase
uses: actions/checkout@v4
- name: Setup Node ${{ matrix.node }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
- name: Test Build Frontend
working-directory: peer-prep
run: |
npm ci
npm run build
- name: Test User Service
working-directory: user-service
run: |
npm ci
npm run test
- name: Test Question Service
working-directory: question-service
run: |
npm ci
npm run test
- name: Test Matching Service
working-directory: matching-service
run: |
npm ci
npm run test
- name: Test Collaboration Service
working-directory: collaboration-service
run: |
npm ci
npm run test
- name: Test Communication Service
working-directory: communication-service
run: |
npm ci
npm run test
- name: Test Run Service
working-directory: run-service
run: |
npm ci
npm run test
- name: Test History Service
working-directory: history-service
run: |
npm ci
npm run test
- name: Test AI Chat Service
working-directory: ai-chat-service
run: |
npm ci
npm run test
build:
# build container for both x86 and arm platforms
needs: test
name: Build Staging Containers and Push to Docker Hub
runs-on: ubuntu-latest
strategy:
matrix:
arch: [amd64, arm64]
steps:
- name: Checkout Codebase
uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Frontend Image
uses: docker/build-push-action@v6
with:
context: ./peer-prep
file: ./peer-prep/Dockerfile
push: true
platforms: linux/${{ matrix.arch }}
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-frontend:staging-latest
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-frontend:staging-${{ vars.DOCKER_IMAGE_VERSION }}
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-frontend:staging-${{ github.sha }}
- name: Build User Service Image
uses: docker/build-push-action@v6
with:
context: ./user-service
file: ./user-service/Dockerfile
push: true
platforms: linux/${{ matrix.arch }}
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-user-service:staging-latest
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-user-service:staging-${{ vars.DOCKER_IMAGE_VERSION }}
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-user-service:staging-${{ github.sha }}
- name: Build Question Service Image
uses: docker/build-push-action@v6
with:
context: ./question-service
file: ./question-service/Dockerfile
push: true
platforms: linux/${{ matrix.arch }}
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-question-service:staging-latest
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-question-service:staging-${{ vars.DOCKER_IMAGE_VERSION }}
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-question-service:staging-${{ github.sha }}
- name: Build Matching Service Image
uses: docker/build-push-action@v6
with:
context: ./matching-service
file: ./matching-service/Dockerfile
push: true
platforms: linux/${{ matrix.arch }}
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-matching-service:staging-latest
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-matching-service:staging-${{ vars.DOCKER_IMAGE_VERSION }}
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-matching-service:staging-${{ github.sha }}
- name: Build Collaboration Service Image
uses: docker/build-push-action@v6
with:
context: ./collaboration-service
file: ./collaboration-service/Dockerfile
push: true
platforms: linux/${{ matrix.arch }}
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-collaboration-service:staging-latest
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-collaboration-service:staging-${{ vars.DOCKER_IMAGE_VERSION }}
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-collaboration-service:staging-${{ github.sha }}
- name: Build Communication Service Image
uses: docker/build-push-action@v6
with:
context: ./communication-service
file: ./communication-service/Dockerfile
push: true
platforms: linux/${{ matrix.arch }}
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-communication-service:staging-latest
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-communication-service:staging-${{ vars.DOCKER_IMAGE_VERSION }}
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-communication-service:staging-${{ github.sha }}
- name: Build Run Service Image
uses: docker/build-push-action@v6
with:
context: ./run-service
file: ./run-service/Dockerfile
push: true
platforms: linux/${{ matrix.arch }}
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-run-service:staging-latest
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-run-service:staging-${{ vars.DOCKER_IMAGE_VERSION }}
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-run-service:${{ github.sha }}
- name: Build History Service Image
uses: docker/build-push-action@v6
with:
context: ./history-service
file: ./history-service/Dockerfile
push: true
platforms: linux/${{ matrix.arch }}
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-history-service:staging-latest
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-history-service:staging-${{ vars.DOCKER_IMAGE_VERSION }}
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-history-service:${{ github.sha }}
- name: Build Gen AI Service Image
uses: docker/build-push-action@v6
with:
context: ./gen-ai-service
file: ./gen-ai-service/Dockerfile
push: true
platforms: linux/${{ matrix.arch }}
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-gen-ai-service:staging-latest
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-gen-ai-service:staging-${{ vars.DOCKER_IMAGE_VERSION }}
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-gen-ai-service:${{ github.sha }}
deploy:
needs: build
environment: staging
name: Deploy Staging Environment
runs-on: ubuntu-latest
steps:
- name: Checkout Codebase
uses: actions/checkout@v4
- name: Setup Node 20
uses: actions/setup-node@v4
with:
node-version: 20
- name: Deploy to VPS
uses: appleboy/ssh-action@1.1.0
env:
USER_SERVICE_SECRETS: ${{ secrets.USER_SERVICE_SECRETS }}
QUESTION_SERVICE_SECRETS: ${{ secrets.QUESTION_SERVICE_SECRETS }}
MATCHING_SERVICE_SECRETS: ${{ secrets.MATCHING_SERVICE_SECRETS }}
COLLABORATION_SERVICE_SECRETS: ${{ secrets.COLLABORATION_SERVICE_SECRETS }}
COMMUNICATION_SERVICE_SECRETS: ${{ secrets.COMMUNICATION_SERVICE_SECRETS }}
HISTORY_SERVICE_SECRETS: ${{ secrets.HISTORY_SERVICE_SECRETS }}
RUN_SERVICE_SECRETS: ${{ secrets.RUN_SERVICE_SECRETS }}
GEN_AI_SERVICE_SECRETS: ${{ secrets.GEN_AI_SERVICE_SECRETS }}
FRONTEND_SECRETS: ${{ secrets.FRONTEND_SECRETS }}
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_KEY }}
port: ${{ secrets.SSH_PORT }}
envs: USER_SERVICE_SECRETS,QUESTION_SERVICE_SECRETS,MATCHING_SERVICE_SECRETS,COLLABORATION_SERVICE_SECRETS,COMMUNICATION_SERVICE_SECRETS,HISTORY_SERVICE_SECRETS,RUN_SERVICE_SECRETS,FRONTEND_SECRETS,AI_CHAT_SERVICE_SECRETS
script: |
cd cs3219-ay2425s1-project-g05
git checkout -b staging
git pull
# echo in .env vars and save them into the directories
cd question-service
echo "$QUESTION_SERVICE_SECRETS" | base64 --decode > .env
cd ..
cd matching-service
echo "$MATCHING_SERVICE_SECRETS" | base64 --decode > .env
cd ..
cd collaboration-service
echo "$COLLABORATION_SERVICE_SECRETS" | base64 --decode > .env
cd ..
cd communication-service
echo "$COMMUNICATION_SERVICE_SECRETS" | base64 --decode > .env
cd ..
cd history-service
echo "$HISTORY_SERVICE_SECRETS" | base64 --decode > .env
cd ..
cd run-service
echo "$RUN_SERVICE_SECRETS" | base64 --decode > .env
cd ..
cd gen-ai-service
echo "$GEN_AI_SERVICE_SECRETS" | base64 --decode > .env
cd ..
cd user-service
echo "$USER_SERVICE_SECRETS" | base64 --decode > .env
cd ..
cd peer-prep
echo "$FRONTEND_SECRETS" | base64 --decode > .env
npm install
npm run build
mv dist/* /var/www/peerprep.marcussoh.com/
# delete to prevent node module conflicts
rm -rf node_modules
cd ..
# handle docker compose
docker compose down
docker compose up --build -d