Skip to content

Commit 43ce570

Browse files
Honghyeonjilee0jae330inhachoiUjaachichoc
authored
[release] dev -> main 브랜치 merge / 1.1.0version upgrade (#39)
* 🔨 refactor: Docker 이미지 최적화를 위한 코드 리팩토링 * 🙀 chore: 오타 수정 * 🐛 fix: COPY 경로 수정 * 🐛 fix: swagger-auto 명령어 추가 * 🙀 chore: 오타수정 * 🐛 fix: backend 이미지가 base-image를 사용하지 않으므로 새로운 패키지 매니저 설치 및 추가 파일 복사하는 로직 추가 * 🐛 fix: pnpm-lock 복사 코드 추가 * 🐛 fix: 서버 패키지 설치 안되는 오류 해결하기 위해 코드 수정 * 🐛 fix: eslint 경로 체크용 package 폴더 추가 복사 * 🐛 fix: 의존성을 복사해오고 dev용을 지우는 방식으로 수정 * 🐛 fix: pnpm-workspace 파일 복사 * 🙀 chore: cicd 스크립트 오타 수정 * 🙀 chore: copy 명령어 합침 * 🙀 chore: 코드 구조 변경 * 🐛 fix: COPY 경로 수정 * 🙀 chore: 경로 오타 수정 * 🔨 refactor: 배포시 swagger-auto 안 하게 로직 수정 및 prod 종속성에 필요한 패키지 dev 종속성에서 이동 * 🙀 chore: 경로 오타 수정 * 🙀 chore: 안쓰는 라이브러리 삭제 * 🚨 !HOTFIX!: env 설정 누락된 코드 추가 * 🚨 !HOTFIX!: env 설정 누락된 코드 추가 * [#10] 홈페이지 가상스크롤 적용 (#14) * ✨ feat: scroll의 Y 좌표를 리턴하는 useScroll 커스텀 훅 추가 * 🚚 rename: hooks/css에 있던 useWindowSize 훅 폴더 위치 변경 * ✨ feat: 가상스크롤 구현 중 * 🙀 chore: 함수명 오타 수정 * ✨ feat: 가상스크롤 커스텀훅 추가 * ✨ feat: WorkspaceGrid 컴포넌트에 가상스크롤 적용 * 🙀 chore: grid의 총 높이 계산할 때 반올림 적용 * [#11] Google Analytics 적용 (#15) * ✨ feat: ga4 코드 추가 * 🔨 refactor: 로컬 환경 디버깅용 코드로 전환 * 🙀 chore: GA 디버깅 코드 삭제 * 🔨 refactor: workflow 에 dockerhub 사용하는 코드 제거 * ✨ feat: 이벤트 트레이싱 * 🔨 refactor: docker hub 로그인 부분 삭제 * 🔨 refactor: workflow와 compose 파일 dockerhub 쓰는 스크립트로 수정 * 🐛 fix: dockerhub 쓰는 버전에서는 build단계에서 pnpm 설치가 필요 없으니 해당 코드 삭제 * 🔨 refactor: deploy단계에서 docker hub 로그인 하는 부분 이동 * 🙀 chore: git 상태 확인하는 코드 추가 * 🙀 chore: docker compose cache_from 부분 삭제(dockerhub에서 가져올 땐 필요 없음) * 🙀 chore: docker hub 로그인 방식 수정 * 🙀 chore: 안쓰는 옵션 삭제 * 🐛 fix: base-image 이름 변경 * 🙀 chore: 언더바 하이픈으로 수정 * 🙀 chore: 안쓰는 코드 삭제 * 🐛 fix: dockercompose 코드에서 build내에 image 잘 못 넣은 코드 수정 * 🙀 chore: docker 로그인 확인을 위한 docker info 코드 추가 * 🔨 refactor: docker compose에서 base 이미지 가져오는 것을 명시적으로 표시 * 🙀 chore: docker compose config 확인을 위한 코드 추가 * 🙀 chore: docker compose 체크를 위한 경로 수정 * 🙀 chore: 필요없는 코드 삭제 * 🐛 fix: compose 파일에서 base 부분 삭제 * 🔨 refactor: docker 캐시 이용하는 방법으로 변경 * 🔨 refactor: docker tag 설정해주는 코드 추가 * 🙀 chore: 코드 변경 * 🔨 refactor: github actions 캐시사용하는 방식으로 변경 * 🔨 refactor: docker build 코드 cache 가져오게 수정 * 🔨 refactor: buildx 코드 추가 * 🔨 refactor: docker buildx 사용하는 방식 수정 * 🔨 refactor: base 이미지에 로컬태그를 붙여주는 방식 대신 레지스트리 경로를 명시적으로 표시하는 방식으로 수정 * 🔨 refactor: docker 이미지 빌드 때 사용하는 cache from-to 원격주소로 변경 * 🔨 refactor: github action 캐싱키 변경 및 docker 이미지 빌드 시 cache 주소 잘못 쓴 것 수정 * 🙀 chore: docker image output 명시적으로 작성 * 🔨 refactor: base image를 hub에 push하지 않고 로컬에서 빌드해서 그대로 사용하는 방식으로 수정 * 🙀 chore: latest 태그 제거 * 🙀 chore: 베이스 이미지 빌드할 때 load: true 옵션 추가 * 🔨 refactor: base-image도 docker hub에 올리는 방법으로 재수정 * 🙀 chore: username 잘 나오는지 확인 * 🙀 chore: set up docker buildx 에서 with 설정 추가 * 🙀 chore: 캐시 초기화 코드 추가 * 🙀 chore: build-args 넣어주는 방식 수정 * 🙀 chore: build-args 넣어주는 방식 수정 * Update boolock-dev-cicd.yml * Update boolock-dev-cicd.yml * 🙀 chore: 디버깅용 코드 추가 * 🔨 refactor: base image 로컬 빌드 및 사용으로 방법 변경 * 🔨 refactor: cache-from 타입 inline으로 변경 * 🙀 chore: github actions 로컬에 base-image가 잘 남겨져 있는지 확인하는 코드 추가 * [#18] useQuery, useInfiniteQuery -> useSuspenseQuery, useSuspenseInfiniteQuery 교체 (#19) * 🔨 refactor: useQuery를 useSuspenseQuery로 교체 및 error 처러 코드 삭제 * 🔨 refactor: 로딩 UI 및 에러 처리 코드 삭제 * 🔨 refactor: suspense 적용 및 error boundy fallback에 workspace 에러 페이지 설정 * 🔨 refactor: useInfinityQuery -> useSuspenseQuery로 교체 * 🙀 chore: 400 에러와 404에러의 에러 코드 및 상태 메세지가 잘못 설정 되어 있어 올바르게 수정 * 🐛 fix: 기존 에러 발생 시 500 에러로만 응답하는 문제 해결 * 🔨 refactor: workspaceContainer에서 워크스페이스 데이터를 렌더링하고 페칭하는 부분을 분리함 * 🙀 chore: 컴포넌트 분리에 따른 코드 수정 * 🙀 chore: github action 에서 파일명 변경을 감지하지 못한 문제로 인해 파일명 변경 * 🙀 chore: 불필요한 console.log 삭제 * 🔨 refactor: base-image cache 루트 변경 * 🔨 refactor: type=local로 재변경 * 🔨 refactor: base-image load단계 추가 * 🙀 chore: 이미지 태그 삭제 * 🙀 chore: 이전 코드에서 캐싱 잘 되는지 확인용 * 🙀 chore: dockerhub_username arg 추가 * 🔨 refactor: 이전버전에 cache 경로만 수정 * 🙀 chore: build-args 추가 * 🔨 refactor: buildx 플러그인 초기화 옵션 + cache에서 이미지 사용시 모든 캐시 데이터를 최대한 활용하는 mode=max 옵션 추가 * 🙀 chore: base-image 캐싱 추가 * 🔨 refactor: base image 로컬 저장 및 hub push 둘 다 되게 수정 * 🙀 chore: verify 스텝 추가 * [#21] 홈페이지 로딩 시 스켈레톤UI에 그리드가 적용되지 않는 문제 해결, 워크스페이스 로딩 화면 조건부 렌더링 (#22) * 🐛 fix: 스켈레톤UI에 그리드가 안되는 문제 해결 * ✨ feat: 워크스페이스 로딩 시간이 0.05초 이상일 때만 로딩 화면이 렌더링되도록 변경 * 🙀 chore: 오타 수정 * 🙀 chore: 아ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ * 🔨 refactor: 원격에서 base-image 가져와서 load하는 방식으로 수정 * 🙀 chore: 경로 명시적으로 쓰기 * 🙀 chore: docker 네트워크 연결 테스트 코드 추가 * 🙀 chore: docker login 스텝 이동 * 🙀 chore: 토큰 코드 추가 * 🙀 chore: token 발급받는 부분 추가 * 🚨 !HOTFIX!: error가 발생할 때 return 해야하는데 그렇지 않을 때 return 하여 workspace가 초기화되지않는 문제 해결 * 🙀 chore: dockerfile FROM base image 경로를 직접적으로 입력하는 버전 * 🙀 chore: base-image outputs 타입을 oci로 변경 * 🙀 chore: docker 이미지 빌드 platform을 linux/amd64로 명시 * 🙀 chore: 타입 명시 * 🚨 !HOTFIX!: workflow on 설정 main push 일 경우로 수정 * ✨ feat: 서버 분할로 인해 cicd dev버전과 main 버전 분리 및 배포를 위한 설정 이분할 * 🙀 chore: 워크플로우 이름 변경 * 🙀 chore: 병합하면서 사라진 dev cicd의 on 조건 추가 * 🙀 chore: docker hub password token으로 변경 * 🙀 chore: client dockerfile 오타 수정 * 🙀 chore: dockerfile.test 오타 수정 * 🔨 refactor: cache type gha로 변경 * 🙀 chore: compose 배포 명령어 수정 * 🙀 chore: 두번 쓴 명령어 삭제 * 🙀 chore: env 설정 확인용 스크립트 추가 * 🙀 chore: cache docker layers 단계 없어도 동작하는지 확인 * 🙀 chore: 주석 제거 * 🔨 refactor: cache-from/to registry type으로 변경 * 🙀 chore: docker chche 타입 gha 타입으로 변경 * 🔨 refactor: github action deploy 과정 push에서만 사용되게 코드 추가 * 🔨 refactor: 브랜치별 워크플로우 시나리오 분리 * 🙀 chore: docker arg 선언 줄분리 * 🔨 refactor: docker compose 파일 type env 설정에 따른 port 설정해주는 코드 추가 * 🔨 refactor: HTTP/1.1 -> HTTP/2.0 개선 설정 추가 * 🔨 refactor: HTTP/2.0 -> HTTP/3.0 개선 설정 추가 * [HOTFIX] cicd 및 docker-compose 코드 수정 (#29) * 🙀 chore: compose 코드 수정 * 🙀 chore: 현재 브랜치에서 deploy 체크하게 브랜치 설정코드 수정 * 🙀 chore: ssl_port 빈칸 표시 * 🙀 chore: # 처리 삭제 * 🙀 chore: 아예 SSL_PORT 설정 없애보기 * 🙀 chore: 우회방식 사용 * 🔨 refactor: docker compose 파일 test 버전 추가 및 cicd 코드 수정 * 🙀 chore: 합치기 전 설정 수정 * [#31] “Code 하이라이팅” 코드 품질 개선 (#36) * 🔨 refactor: 변수 유틸함수로 분리 * 🔨 refactor: 애니메이션 코드 커스텀 훅으로 분리 * 🙀 chore: 훅에 주석 처리 * 🔨 refactor: 애니메이션 지속 시간 (매직넘버) 상수화 * 🙀 chore: 오타 수정 * 🔨 refactor: 클래스명 계산 로직 추상화 * 🔨 refactor: 마우스 호버 이벤트 훅 관리 + 라인클래스이름 추상화 * 🔨 refactor: 파싱 코드 추상화 + 함수 설명 주석 추가 * 🔨 refactor: Props Drilling이 나타나는 컴포넌트를 삭제하고 부모 컴포넌트로 이전. * 🔨 refactor: viewer 클래스명 생성 함수 분리 * 🔨 refactor: 타입 분리 + index.ts로 import 문 간소화하여 가독성 개선 * [#26] 워크스페이스 페이지의 불필요한 리렌더링 개선 (#35) * ✨ feat: css 속성 물음표 아이콘 좌표를 전역 상태로 관리하는 것이 아닌 local 상태 변수를 통해 관리하도록 변경 * Revert "✨ feat: css 속성 물음표 아이콘 좌표를 전역 상태로 관리하는 것이 아닌 local 상태 변수를 통해 관리하도록 변경" This reverts commit b4409ef. * 🔨 refactor: css속성 물음표 아이콘 좌표를 전역상태가 아닌 local 상태로 관리 * 🔨 refactor: 기존에 사용하던 매직넘버를 삭제하고 useLayoutEffect를 통해 툴팁의 높이를 직접 측정하고 툴팁의 좌표를 계산하는 방식으로 변경 * 🔨 refactor: css item 물음표 아이콘 위치를 전역 상태가 아닌 로컬 상태변수로 관리하도록 변경, 불필요한 cssTooltiptore 삭제 * 🔨 refactor: useCssTooltip 훅을 통해 좌표 계산을 하도록 변경 * 🙀 chore: 타입 단언 대신 타입 선언으로 변경경 * 🙀 chore: 불필요한 변수 및 반환값 삭제 * 🙀 chore: 커스텀 select에서 사용하는 type 및 enum type 폴더로 분리 * 🔨 refactor: css 클래스 리스트를 만드는 로직을 커스텀 훅으로 분리 * 🔨 refactor: useCssPropsStore에서 각 상태를 구조분해할당으로 사용하여 모든 상태를 구독하여 불필요한 리렌더링이 발생하는 문제를 해결함 * 🎨 style: 불필요한 스타일 코드 삭제 * 🙀 chore: 변경된 props 반영 * [#25] 사용자가이드 단계 이동시 헤더 내 모든 요소 리렌더링 개선 (#37) * 🎨 style: 도움말버튼 컴포넌트 분리 (HelpButton) * 🔨 refactor: 코치마크 단계 이동시 도움말버튼 리렌더링 개선 * 🔨 refactor: 헤더 상단 버튼 각각 메모이제이션 * 🔨 refactor: 코치마크 4단계로 이동하거나 4단계 였던 경우에만 HeaderButtons 리렌더링 되도록 메모이제이션 * 🔨 refactor: 워크스페이스 헤더 리렌더링 개선 완료 * 🐛 fix: 대소문자 오타 수정 * 📝 docs: README 수정 * [#34] 수동 저장 -> 자동 저장으로 변경 (#38) * 🙀 chore: build시 오류 생기는 코드 제거 --------- Co-authored-by: YEONGJAE LEE <71895560+lee0jae330@users.noreply.github.com> Co-authored-by: Gyeungil Choi <chlruddlf73@naver.com> Co-authored-by: Yujin <yujinyll9148@gmail.com> Co-authored-by: lee0jae330 <xingxing2001@cau.ac.kr> Co-authored-by: chichoc <chichoc.dev@gmail.com>
1 parent f2d576c commit 43ce570

File tree

67 files changed

+901
-576
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+901
-576
lines changed
+59-79
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: ci/cd action
1+
name: dev ci/cd action
22

33
on:
44
push:
@@ -10,110 +10,90 @@ jobs:
1010

1111
steps:
1212
- uses: actions/checkout@v4
13-
- name: Set up Node.js
14-
uses: actions/setup-node@v4
15-
with:
16-
node-version: '20.x'
17-
18-
- name: Install Pnpm
19-
run: npm install -g pnpm
2013

21-
- name: Package install with pnpm
22-
run: pnpm install:all
14+
- name: Set up Docker Buildx
15+
uses: docker/setup-buildx-action@v2
16+
with:
17+
buildkitd-flags: --debug
2318

2419
- name: Set BE .env
2520
run: |
26-
echo "MONGO_URI=${{ secrets.MONGO_URI }}" > apps/server/.env
27-
echo "SSH_HOST=${{ secrets.SSH_HOST }}" >> apps/server/.env
28-
echo "SSH_PORT=${{ secrets.SSH_PORT }}" >> apps/server/.env
29-
echo "SSH_USER=${{ secrets.SSH_USER }}" >> apps/server/.env
30-
echo "SSH_PASSWORD=${{ secrets.SSH_PASSWORD }}" >> apps/server/.env
31-
echo "SSH_DATABASE_HOST=${{ secrets.SSH_DATABASE_HOST }}" >> apps/server/.env
32-
echo "SSH_DATABASE_PORT=${{ secrets.SSH_DATABASE_PORT }}" >> apps/server/.env
33-
echo "LOCAL_PORT=${{ secrets.LOCAL_PORT }}" >> apps/server/.env
34-
echo "IS_LOCAL=true" >> apps/server/.env
35-
echo "SERVER_CORS_ACCEPT=http://localhost:5173" >> apps/server/.env
21+
echo "MONGO_URI=${{ secrets.TEST_MONGO_URI }}" > apps/server/.env
22+
echo "IS_LOCAL=false" >> apps/server/.env
23+
echo "SERVER_CORS_ACCEPT=${{ secrets.TEST_SERVER_CORS_ACCEPT }}" >> apps/server/.env
3624
echo "S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }}" >> apps/server/.env
3725
echo "S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }}" >> apps/server/.env
3826
echo "S3_BUCKET_NAME=${{ secrets.S3_BUCKET_NAME }}" >> apps/server/.env
39-
27+
echo "NODE_ENV=production" >> apps/server/.env
28+
4029
- name: Set FE .env
4130
run: |
42-
echo "VITE_SERVER_URL=http://localhost:3000" > apps/client/.env
31+
echo "VITE_SERVER_URL=${{ secrets.DEPLOY_VITE_SERVER_URL }}" > apps/client/.env
4332
echo "VITE_MIXPANEL_TOKEN=${{ secrets.VITE_MIXPANEL_TOKEN }}" >> apps/client/.env
4433
echo "VITE_STATIC_STORAGE_URL=${{ secrets.VITE_STATIC_STORAGE_URL }}" >> apps/client/.env
4534
46-
- name: Set Nginx SSL files
47-
run: |
48-
mkdir -p apps/client/ssl
49-
echo "${{ secrets.SSL_FULLCHAIN }}" > apps/client/ssl/fullchain.pem
50-
echo "${{ secrets.SSL_PRIVKEY }}" > apps/client/ssl/privkey.pem
51-
52-
- name: Buld Frontend
53-
run: |
54-
cd apps/client
55-
pnpm run build
56-
57-
- name: Build Backend
58-
run: |
59-
cd apps/server
60-
pnpm run swagger-auto
61-
pnpm run build
62-
63-
- name: Build base image
64-
run: |
65-
docker build . --file Dockerfile.base --tag ${{ secrets.DOCKERHUB_USERNAME }}/boolock_base_test:1.0
66-
docker tag ${{ secrets.DOCKERHUB_USERNAME }}/boolock_base_test:1.0 base-image
67-
68-
- name: Build frontend and backend images
69-
run: |
70-
docker build . --file apps/client/Dockerfile --tag ${{ secrets.DOCKERHUB_USERNAME }}/boolock_client_test:1.0
71-
docker build . --file apps/server/Dockerfile --tag ${{ secrets.DOCKERHUB_USERNAME }}/boolock_server_test:1.0
72-
7335
- name: Login to Docker Hub
7436
uses: docker/login-action@v2
7537
with:
7638
username: ${{ secrets.DOCKERHUB_USERNAME }}
77-
password: ${{ secrets.DOCKERHUB_PASSWORD }}
39+
password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }}
7840

79-
- name: Docker Hub push
80-
run: |
81-
docker push ${{ secrets.DOCKERHUB_USERNAME }}/boolock_base_test:1.0
82-
docker push ${{ secrets.DOCKERHUB_USERNAME }}/boolock_client_test:1.0
83-
docker push ${{ secrets.DOCKERHUB_USERNAME }}/boolock_server_test:1.0
41+
- name: Build and Push Base Image
42+
uses: docker/build-push-action@v4
43+
with:
44+
context: .
45+
file: Dockerfile.base
46+
push: true
47+
tags: ${{ secrets.DOCKERHUB_USERNAME }}/base-image-test:latest
48+
cache-from: type=gha,scope=base-image-test
49+
cache-to: type=gha,mode=max,scope=base-image-test
50+
51+
- name: Build and Push Frontend Image
52+
uses: docker/build-push-action@v4
53+
with:
54+
context: .
55+
file: apps/client/Dockerfile.test
56+
push: true
57+
tags: ${{ secrets.DOCKERHUB_USERNAME }}/boolock_client_test:latest
58+
cache-from: type=gha,scope=frontend-test
59+
cache-to: type=gha,mode=max,scope=frontend-test
60+
build-args: |
61+
DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }}
62+
TYPE=test
63+
64+
- name: Build and Push Backend Image
65+
uses: docker/build-push-action@v4
66+
with:
67+
context: .
68+
file: apps/server/Dockerfile
69+
push: true
70+
tags: ${{ secrets.DOCKERHUB_USERNAME }}/boolock_server_test:latest
71+
cache-from: type=gha,scope=backend-test
72+
cache-to: type=gha,mode=max,scope=backend-test
73+
build-args: |
74+
DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }}
75+
TYPE=test
8476
8577
deploy:
78+
if: github.event_name == 'push'
8679
needs: build
8780
runs-on: ubuntu-latest
8881
steps:
89-
- name: Login to Docker Hub
90-
run: sudo docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_PASSWORD }}
91-
9282
- name: Deploy with docker
9383
uses: appleboy/ssh-action@v0.1.6
9484
with:
95-
host: ${{ secrets.SSH_HOST }}
96-
username: ${{ secrets.SSH_USER }}
97-
password: ${{ secrets.SSH_PASSWORD }}
98-
port: ${{ secrets.SSH_PORT }}
85+
host: ${{ secrets.TEST_SSH_HOST }}
86+
username: ${{ secrets.TEST_SSH_USER }}
87+
password: ${{ secrets.TEST_SSH_PASSWORD }}
88+
port: ${{ secrets.TEST_SSH_PORT }}
9989
script: |
10090
cd boolock/refactor-web31-BooLock
101-
git checkout main
102-
git pull origin main
103-
104-
echo "MONGO_URI=${{ secrets.DEPLOY_MONGO_URI }}" > apps/server/.env
105-
echo "IS_LOCAL=false" >> apps/server/.env
106-
echo "SERVER_CORS_ACCEPT=${{ secrets.DEPLOY_SERVER_CORS_ACCEPT }}" >> apps/server/.env
107-
echo "S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }}" >> apps/server/.env
108-
echo "S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }}" >> apps/server/.env
109-
echo "S3_BUCKET_NAME=${{ secrets.S3_BUCKET_NAME }}" >> apps/server/.env
110-
echo "NODE_ENV=production" >> apps/server/.env
91+
git fetch origin
92+
git checkout dev
93+
git pull origin dev
11194
112-
echo "VITE_SERVER_URL=${{ secrets.DEPLOY_VITE_SERVER_URL }}" > apps/client/.env
113-
echo "VITE_MIXPANEL_TOKEN=${{ secrets.VITE_MIXPANEL_TOKEN }}" >> apps/client/.env
114-
echo "VITE_STATIC_STORAGE_URL=${{ secrets.VITE_STATIC_STORAGE_URL }}" >> apps/client/.env
95+
echo "DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }}" > .env
96+
echo "${{ secrets.DOCKERHUB_ACCESS_TOKEN }}" | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin
11597
116-
sudo docker compose pull
117-
sudo docker compose down
118-
sudo docker compose up -d --build
119-
sudo docker image prune -f
98+
sudo docker compose -f docker-compose.test.yml pull
99+
sudo docker compose -f docker-compose.test.yml up -d --force-recreate --remove-orphans
+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
name: main ci/cd action
2+
3+
on:
4+
push:
5+
branches: ['main']
6+
7+
jobs:
8+
build:
9+
runs-on: ubuntu-latest
10+
11+
steps:
12+
- uses: actions/checkout@v4
13+
14+
- name: Set up Docker Buildx
15+
uses: docker/setup-buildx-action@v2
16+
with:
17+
buildkitd-flags: --debug
18+
19+
- name: Set BE .env
20+
run: |
21+
echo "MONGO_URI=${{ secrets.DEPLOY_MONGO_URI }}" > apps/server/.env
22+
echo "IS_LOCAL=false" >> apps/server/.env
23+
echo "SERVER_CORS_ACCEPT=${{ secrets.DEPLOY_SERVER_CORS_ACCEPT }}" >> apps/server/.env
24+
echo "S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }}" >> apps/server/.env
25+
echo "S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }}" >> apps/server/.env
26+
echo "S3_BUCKET_NAME=${{ secrets.S3_BUCKET_NAME }}" >> apps/server/.env
27+
echo "NODE_ENV=production" >> apps/server/.env
28+
29+
- name: Set FE .env
30+
run: |
31+
echo "VITE_SERVER_URL=${{ secrets.DEPLOY_VITE_SERVER_URL }}" > apps/client/.env
32+
echo "VITE_MIXPANEL_TOKEN=${{ secrets.VITE_MIXPANEL_TOKEN }}" >> apps/client/.env
33+
echo "VITE_STATIC_STORAGE_URL=${{ secrets.VITE_STATIC_STORAGE_URL }}" >> apps/client/.env
34+
35+
- name: Set Nginx SSL files
36+
run: |
37+
mkdir -p apps/client/ssl
38+
echo "${{ secrets.SSL_FULLCHAIN }}" > apps/client/ssl/fullchain.pem
39+
echo "${{ secrets.SSL_PRIVKEY }}" > apps/client/ssl/privkey.pem
40+
41+
- name: Login to Docker Hub
42+
uses: docker/login-action@v2
43+
with:
44+
username: ${{ secrets.DOCKERHUB_USERNAME }}
45+
password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }}
46+
47+
- name: Build and Push Base Image
48+
uses: docker/build-push-action@v4
49+
with:
50+
context: .
51+
file: Dockerfile.base
52+
push: true
53+
tags: ${{ secrets.DOCKERHUB_USERNAME }}/base-image-prod:latest
54+
cache-from: type=gha,scope=base-image-prod
55+
cache-to: type=gha,mode=max,scope=base-image-prod
56+
57+
- name: Build and Push Frontend Image
58+
uses: docker/build-push-action@v4
59+
with:
60+
context: .
61+
file: apps/client/Dockerfile
62+
push: true
63+
tags: ${{ secrets.DOCKERHUB_USERNAME }}/boolock_client_prod:latest
64+
cache-from: type=gha,scope=frontend
65+
cache-to: type=gha,mode=max,scope=frontend
66+
build-args: |
67+
DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }}
68+
TYPE=prod
69+
70+
- name: Build and Push Backend Image
71+
uses: docker/build-push-action@v4
72+
with:
73+
context: .
74+
file: apps/server/Dockerfile
75+
push: true
76+
tags: ${{ secrets.DOCKERHUB_USERNAME }}/boolock_server_prod:latest
77+
cache-from: type=gha,scope=backend
78+
cache-to: type=gha,mode=max,scope=backend
79+
build-args: |
80+
DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }}
81+
TYPE=prod
82+
83+
deploy:
84+
needs: build
85+
runs-on: ubuntu-latest
86+
steps:
87+
- name: Login to Docker Hub
88+
run: sudo docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_PASSWORD }}
89+
90+
- name: Deploy with docker
91+
uses: appleboy/ssh-action@v0.1.6
92+
with:
93+
host: ${{ secrets.SSH_HOST }}
94+
username: ${{ secrets.SSH_USER }}
95+
password: ${{ secrets.SSH_PASSWORD }}
96+
port: ${{ secrets.SSH_PORT }}
97+
script: |
98+
cd boolock/refactor-web31-BooLock
99+
git fetch origin
100+
git checkout main
101+
git pull origin main
102+
103+
echo "DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }}" > .env
104+
echo "${{ secrets.DOCKERHUB_ACCESS_TOKEN }}" | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin
105+
106+
sudo docker compose pull
107+
sudo docker compose up -d --force-recreate --remove-orphans

README.md

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
<h1>BooLock</h1>
22

3-
<img width="1704" alt="Frame 2016" src="https://github.com/user-attachments/assets/74cc69d6-7d6f-48ed-9e06-1d6d5f6a5c43">
4-
5-
</div>
3+
![image](https://github.com/user-attachments/assets/c58af651-8a5d-4b09-a98e-04ce50f27fca)
64

75
<br/>
86

97
<p align="center"> <br/>
10-
<strong>웹 개발, 블록으로 쉽고 즐겁게!</strong> <br />
8+
<strong>웹 개발, 블록 조립으로 쉽고 재밌게!</strong> <br />
119
<strong>HTML과 CSS를 배우는 블록코딩 플랫폼</strong> <br /> <br />
1210
나만의 창작물을 완성하고, 새로운 웹 개발의 가능성을 경험해보세요. ♥️ <br /> <br />
1311
<strong>👇 배포 사이트</strong> <br />

apps/client/Dockerfile

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
FROM base-image AS frontend-build
1+
2+
ARG DOCKERHUB_USERNAME
3+
ARG TYPE
4+
FROM ${DOCKERHUB_USERNAME}/base-image-${TYPE} AS frontend-build
25

36
WORKDIR /app/apps/client
47
COPY ./apps/client .
@@ -7,7 +10,7 @@ RUN pnpm install --offline --frozen-lockfile &&\
710

811
FROM nginx:alpine AS frontend
912

10-
COPY /apps/client/nginx.conf /etc/nginx/conf.d/default.conf
13+
COPY /apps/client/production/nginx.conf /etc/nginx/conf.d/default.conf
1114
COPY /apps/client/ssl /etc/nginx/ssl
1215
RUN chmod 644 /etc/nginx/ssl/fullchain.pem &&\
1316
chmod 600 /etc/nginx/ssl/privkey.pem &&\

apps/client/Dockerfile.test

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
ARG DOCKERHUB_USERNAME
2+
ARG TYPE
3+
FROM ${DOCKERHUB_USERNAME}/base-image-${TYPE} AS frontend-build
4+
5+
WORKDIR /app/apps/client
6+
COPY ./apps/client .
7+
RUN pnpm install --offline --frozen-lockfile &&\
8+
pnpm run build
9+
10+
FROM nginx:alpine AS frontend
11+
12+
COPY /apps/client/test/nginx.conf /etc/nginx/conf.d/default.conf
13+
RUN chown -R nginx:nginx /usr/share/nginx/html
14+
15+
COPY --from=frontend-build /app/apps/client/dist /usr/share/nginx/html/
16+
RUN chmod -R 755 /usr/share/nginx/html
17+
18+
EXPOSE 80
19+
CMD ["nginx", "-g", "daemon off;"]

apps/client/nginx.conf renamed to apps/client/production/nginx.conf

+8
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,18 @@ server {
99

1010
server {
1111
listen 443 ssl;
12+
http2 on;
13+
http3 on;
14+
quic_retry off;
15+
1216
server_name boolock.site;
1317

1418
ssl_certificate /etc/nginx/ssl/fullchain.pem;
1519
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
20+
ssl_protocols TLSv1.3;
21+
ssl_prefer_server_ciphers off;
22+
23+
add_header Alt-Svc 'h3-23=":443"; ma=86400';
1624

1725
location / {
1826
root /usr/share/nginx/html;

apps/client/src/entities/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ export { ImageTagModalImg } from './workspace/ImageTagModalImg/ImageTagModalImg'
1919
export { ImageTagModalButton } from './workspace/ImageTagModalButton/ImageTagModalButton';
2020
export { ImageTagModalListItem } from './workspace/ImageTagModalListItem/ImageTagModalListItem';
2121
export { CodeExportButton } from './workspace/CodeExportButton/CodeExportButton';
22+
export { HelpButton } from './workspace/HelpButton/HelpButton';

apps/client/src/entities/workspace/CodeExportButton/CodeExportButton.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Spinner } from '@/shared/ui';
22
import { exportPreviewHtml } from '@/shared/utils';
33
import toast from 'react-hot-toast';
4-
import { useState } from 'react';
4+
import { memo, useState } from 'react';
55

6-
export const CodeExportButton = () => {
6+
export const CodeExportButton = memo(() => {
77
const [isLoading, setIsLoading] = useState(false);
88

99
const handleClick = () => {
@@ -32,4 +32,4 @@ export const CodeExportButton = () => {
3232
)}
3333
</button>
3434
);
35-
};
35+
});

apps/client/src/entities/workspace/CssCategoryButton/CssCategoryButton.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { TCssCategory } from '@/shared/types';
22
import { useCssPropsStore } from '@/shared/store';
3-
43
type CssCategoryButtonProps = {
54
cssCategory: TCssCategory;
65
};
@@ -11,7 +10,8 @@ type CssCategoryButtonProps = {
1110
* CSS 카테고리를 선택할 수 있는 버튼 컴포넌트
1211
*/
1312
export const CssCategoryButton = ({ cssCategory }: CssCategoryButtonProps) => {
14-
const { selectedCssCategory, setSelectedCssCategory } = useCssPropsStore();
13+
const selectedCssCategory = useCssPropsStore((state) => state.selectedCssCategory);
14+
const setSelectedCssCategory = useCssPropsStore((state) => state.setSelectedCssCategory);
1515

1616
return (
1717
<button

0 commit comments

Comments
 (0)