Skip to content

Merge pull request #99 from UTSC-CSCC01-Software-Engineering-I/omarhx… #57

Merge pull request #99 from UTSC-CSCC01-Software-Engineering-I/omarhx…

Merge pull request #99 from UTSC-CSCC01-Software-Engineering-I/omarhx… #57

name: CI
on:
push:
branches: [ "*" ]
tags:
- 'v*'
pull_request:
branches: [ "*" ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 20
- name: Install and test backend
working-directory: BackEnd
run: |
mkdir -p ./secrets
touch ./secrets/cscc01-79d1d-firebase-adminsdk-fbsvc-e140a87629.json
echo "$FIREBASE_SERVICE_ACCOUNT" | base64 --decode > ./secrets/cscc01-79d1d-firebase-adminsdk-fbsvc-e140a87629.json
npm ci
npm run test
env:
FIREBASE_SERVICE_ACCOUNT: ${{ secrets.FIREBASE_SERVICE_ACCOUNT }}
- name: Install and test frontend
working-directory: FrontEnd
run: |
npm ci
npm run test
docker:
needs: build-and-test
if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push backend image
working-directory: BackEnd
run: |
TAG_NAME=$(echo "${GITHUB_REF}" | sed -n 's|refs/tags/||p')
if [[ -n "$TAG_NAME" ]]; then
docker build \
--build-arg INCLUDE_DEPENDENCIES=true \
-t ${{ secrets.DOCKER_USERNAME }}/cscc01-backend:${TAG_NAME} \
-t ${{ secrets.DOCKER_USERNAME }}/cscc01-backend:latest \
.
docker push ${{ secrets.DOCKER_USERNAME }}/cscc01-backend:${TAG_NAME}
else
docker build \
--build-arg INCLUDE_DEPENDENCIES=false \
-t ${{ secrets.DOCKER_USERNAME }}/cscc01-backend:latest \
.
fi
docker push ${{ secrets.DOCKER_USERNAME }}/cscc01-backend:latest
- name: Build and push frontend image
working-directory: FrontEnd
run: |
TAG_NAME=$(echo "${GITHUB_REF}" | sed -n 's|refs/tags/||p')
if [[ -n "$TAG_NAME" ]]; then
docker build \
--build-arg INCLUDE_DEPENDENCIES=true \
-t ${{ secrets.DOCKER_USERNAME }}/cscc01-frontend:${TAG_NAME} \
-t ${{ secrets.DOCKER_USERNAME }}/cscc01-frontend:latest \
.
docker push ${{ secrets.DOCKER_USERNAME }}/cscc01-frontend:${TAG_NAME}
else
docker build \
--build-arg INCLUDE_DEPENDENCIES=false \
-t ${{ secrets.DOCKER_USERNAME }}/cscc01-frontend:latest \
.
fi
docker push ${{ secrets.DOCKER_USERNAME }}/cscc01-frontend:latest
- name: Build and push database image
working-directory: BackEnd/sql
run: |
TAG_NAME=$(echo "${GITHUB_REF}" | sed -n 's|refs/tags/||p')
if [[ -n "$TAG_NAME" ]]; then
docker build \
-t ${{ secrets.DOCKER_USERNAME }}/cscc01-db:${TAG_NAME} \
-t ${{ secrets.DOCKER_USERNAME }}/cscc01-db:latest \
.
docker push ${{ secrets.DOCKER_USERNAME }}/cscc01-db:${TAG_NAME}
else
docker build \
-t ${{ secrets.DOCKER_USERNAME }}/cscc01-db:latest \
.
fi
docker push ${{ secrets.DOCKER_USERNAME }}/cscc01-db:latest
deploy-and-test:
needs: docker
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
steps:
- name: Set up SSH
uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.DEPLOY_KEY }}
- name: Deploy to server
run: |
ssh -vvv -o StrictHostKeyChecking=no ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} << EOF
echo "Logging into Docker Hub..."
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
echo "Pulling latest images..."
docker pull $DOCKER_USERNAME/cscc01-backend:latest
docker pull $DOCKER_USERNAME/cscc01-frontend:latest
docker pull $DOCKER_USERNAME/cscc01-db:latest
echo "Stopping and removing old containers..."
docker stop backend || true && docker rm backend || true
docker stop frontend || true && docker rm frontend || true
docker stop db || true && docker rm db || true
echo "Starting new containers..."
docker network create cscc01-net || true
docker run -d --name db \
--network cscc01-net \
-e POSTGRES_PASSWORD=mysecret \
$DOCKER_USERNAME/cscc01-db:latest
docker run -d --name backend \
--network cscc01-net \
-p 3000:3000 \
-v ~/firebase.json:/app/secrets/cscc01-79d1d-firebase-adminsdk-fbsvc-e140a87629.json \
-e DB_HOST=db \
$DOCKER_USERNAME/cscc01-backend:latest
docker run -d --name frontend \
--network cscc01-net \
-p 80:80 \
$DOCKER_USERNAME/cscc01-frontend:latest
EOF
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
- name: Wait for app to boot
run: sleep 20
- name: Run health checks
run: |
curl --fail http://${{ secrets.DEPLOY_HOST }}:3000/api/health || exit 1
curl --fail http://${{ secrets.DEPLOY_HOST }} || exit 1
- name: Run performance test (optional)
run: |
npm install -g autocannon
autocannon http://${{ secrets.DEPLOY_HOST }}:3000/api/events