Push changes to Staging In Preparation for Final Submission #85
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: '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: Install Frontend Node Dependencies | |
working-directory: peer-prep | |
run: npm ci | |
- name: Test Build on Frontend | |
working-directory: peer-prep | |
run: npm run build | |
- name: Test User Service | |
working-directory: user-sevice | |
run: | | |
npm ci | |
npm run test | |
- name: Upload User Service Coverage | |
uses: codecov/codecov-action@v4 | |
with: | |
directory: ./user-service/coverage | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
- name: Test Question Service | |
working-directory: question-sevice | |
run: | | |
npm ci | |
npm run test | |
- name: Upload Question Service Coverage | |
uses: codecov/codecov-action@v4 | |
with: | |
directory: ./question-service/coverage | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
- name: Test Matching Service | |
working-directory: matching-sevice | |
run: | | |
npm ci | |
npm run test | |
- name: Upload Matching Service Coverage | |
uses: codecov/codecov-action@v4 | |
with: | |
directory: ./matching-service/coverage | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
- name: Test Collaboration Service | |
working-directory: collaboration-sevice | |
run: | | |
npm ci | |
npm run test | |
- name: Upload Collaboration Service Coverage | |
uses: codecov/codecov-action@v4 | |
with: | |
directory: ./collaboration-service/coverage | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
- name: Test Communication Service | |
working-directory: communication-sevice | |
run: | | |
npm ci | |
npm run test | |
- name: Upload Communication Service Coverage | |
uses: codecov/codecov-action@v4 | |
with: | |
directory: ./communication-service/coverage | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
- name: Test Run Service | |
working-directory: run-sevice | |
run: | | |
npm ci | |
npm run test | |
- name: Upload Run Service Coverage | |
uses: codecov/codecov-action@v4 | |
with: | |
directory: ./run-service/coverage | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
- name: Test History Service | |
working-directory: history-sevice | |
run: | | |
npm ci | |
npm run test | |
- name: Upload History Service Coverage | |
uses: codecov/codecov-action@v4 | |
with: | |
directory: ./history-service/coverage | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
- name: Test AI Chat Service | |
working-directory: ai-chat-sevice | |
run: | | |
npm ci | |
npm run test | |
- name: Upload AI Chat Service Coverage | |
uses: codecov/codecov-action@v4 | |
with: | |
directory: ./ai-chat-service/coverage | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
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-${{ 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-${{ 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-${{ 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-${{ 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-${{ 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-${{ 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:${{ 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:${{ github.sha }} | |
- name: Build AI Chat Service Image | |
uses: docker/build-push-action@v6 | |
with: | |
context: ./ai-chat-service | |
file: ./ai-chat-service/Dockerfile | |
push: true | |
platforms: linux/${{ matrix.arch }} | |
tags: | | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-ai-chat-service:staging-latest | |
${{ secrets.DOCKERHUB_USERNAME }}/peerprep-ai-chat-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/[email protected] | |
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 }} | |
AI_CHAT_SERVICE_SECRETS: ${{ secrets.AI_CHAT_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 ai-chat-service | |
echo "$AI_CHAT_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 |