Merge pull request #97 from UTSC-CSCC01-Software-Engineering-I/hotfix… #50
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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/[email protected] | |
| 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 |