Final Submission (#128) #19
This file contains 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
# 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: 'Production Environment CI/CD Pipeline' | |
on: | |
push: | |
branches: | |
- main | |
pull_request: | |
branches: | |
- main | |
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 | |
env: | |
ACCESS_TOKEN_SECRET: ${{ secrets.ACCESS_TOKEN_SECRET }} | |
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 Gen AI Service | |
working-directory: gen-ai-service | |
run: | | |
npm ci | |
npm run test | |
build: | |
# build container for both x86 and arm platforms | |
environment: production | |
needs: test | |
name: Build Production 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 | |
continue-on-error: true | |
with: | |
username: ${{ secrets.DOCKERHUB_USERNAME }} | |
password: ${{ secrets.DOCKERHUB_TOKEN }} | |
- name: Set up Docker Buildx | |
continue-on-error: true | |
uses: docker/setup-buildx-action@v3 | |
- name: Build Frontend Image | |
continue-on-error: true | |
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:latest | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-frontend:${{ vars.DOCKER_IMAGE_VERSION }} | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-frontend:${{ github.sha }} | |
- name: Build User Service Image | |
continue-on-error: true | |
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:latest | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-user-service:${{ vars.DOCKER_IMAGE_VERSION }} | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-user-service:${{ github.sha }} | |
- name: Build Question Service Image | |
continue-on-error: true | |
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-question-service:latest | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-question-service:${{ vars.DOCKER_IMAGE_VERSION }} | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-question-service:${{ github.sha }} | |
- name: Build Matching Service Image | |
continue-on-error: true | |
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:latest | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-matching-service:${{ vars.DOCKER_IMAGE_VERSION }} | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-matching-service:${{ github.sha }} | |
- name: Build Collaboration Service Image | |
continue-on-error: true | |
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:latest | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-collaboration-service:${{ vars.DOCKER_IMAGE_VERSION }} | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-collaboration-service:${{ github.sha }} | |
- name: Build Communication Service Image | |
continue-on-error: true | |
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:latest | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-communication-service:${{ vars.DOCKER_IMAGE_VERSION }} | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-communication-service:${{ github.sha }} | |
- name: Build Run Service Image | |
continue-on-error: true | |
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:latest | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-run-service:${{ vars.DOCKER_IMAGE_VERSION }} | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-run-service:${{ github.sha }} | |
- name: Build History Service Image | |
continue-on-error: true | |
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:latest | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-history-service:${{ vars.DOCKER_IMAGE_VERSION }} | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-history-service:${{ github.sha }} | |
- name: Build Gen AI Service Image | |
continue-on-error: true | |
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:latest | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-gen-ai-service:${{ vars.DOCKER_IMAGE_VERSION }} | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-gen-ai-service:${{ github.sha }} | |
deploy: | |
needs: test | |
environment: production | |
name: Deploy Production 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@v1.1.0 | |
env: | |
# References https://stackoverflow.com/questions/58033366/how-to-get-the-current-branch-within-github-actions | |
CURR_BRANCH: ${{ github.head_ref || github.ref_name }} | |
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 }} | |
script_stop: true | |
envs: CURR_BRANCH,USER_SERVICE_SECRETS,QUESTION_SERVICE_SECRETS,MATCHING_SERVICE_SECRETS,COLLABORATION_SERVICE_SECRETS,COMMUNICATION_SERVICE_SECRETS,HISTORY_SERVICE_SECRETS,RUN_SERVICE_SECRETS,FRONTEND_SECRETS,GEN_AI_SERVICE_SECRETS | |
script: | | |
. .nvm/nvm.sh | |
nvm use 20 | |
cd cs3219-ay2425s1-project-g05 | |
git checkout $CURR_BRANCH | |
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.production | |
npm install | |
npm run build | |
# copy files using rsync | |
rsync -a --no-owner --no-times --no-group --no-perms --delete dist/ /var/www/peerprep.marcussoh.com/ | |
cd .. | |
# handle docker compose | |
docker compose down | |
docker compose up --build -d |