From 43ce570f1bc0da813c476cb781933fcd3bbf8e41 Mon Sep 17 00:00:00 2001 From: Honghyeonji <66579773+Honghyeonji@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:05:44 +0900 Subject: [PATCH] =?UTF-8?q?[release]=20dev=20->=20main=20=EB=B8=8C?= =?UTF-8?q?=EB=9E=9C=EC=B9=98=20merge=20/=201.1.0version=20upgrade=20(#39)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * πŸ”¨ 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 b4409efc9409f65ab7ef76221c77e75b155b3666. * πŸ”¨ 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 Co-authored-by: Yujin Co-authored-by: lee0jae330 Co-authored-by: chichoc --- .github/workflows/boolock-dev-cicd.yml | 138 ++++++++---------- .github/workflows/boolock-main-cicd.yml | 107 ++++++++++++++ README.md | 6 +- apps/client/Dockerfile | 7 +- apps/client/Dockerfile.test | 19 +++ apps/client/{ => production}/nginx.conf | 8 + apps/client/src/entities/index.ts | 1 + .../CodeExportButton/CodeExportButton.tsx | 6 +- .../CssCategoryButton/CssCategoryButton.tsx | 4 +- .../workspace/CssOptionItem/CssOptionItem.tsx | 22 ++- .../CssTooltip/CssTooltip.stories.tsx | 18 +-- .../workspace/CssTooltip/CssTooltip.tsx | 16 +- .../workspace/HelpButton/HelpButton.tsx | 22 +++ .../workspace/RedoButton/RedoButton.tsx | 5 +- .../workspace/SaveButton/SaveButton.tsx | 44 +----- .../workspace/UndoButton/UndoButton.tsx | 5 +- .../WorkspaceNameInput/WorkspaceNameInput.tsx | 6 +- .../src/pages/Workspacepage/WorkspacePage.tsx | 15 +- .../CodeContent/CodeContent.stories.tsx | 44 ------ .../components/CodeContent/CodeContent.tsx | 76 ---------- .../components/CodeViewer/CodeViewer.tsx | 56 +++---- .../components/LineNumbers/LineNumbers.tsx | 26 ++-- .../code-highlighter/components/index.ts | 2 + .../code-highlighter/constants/index.ts | 6 + .../shared/code-highlighter/hooks/index.ts | 2 + .../hooks/useDiffCodeAnimate.ts | 32 ++++ .../hooks/useHoverLineNumber.ts | 20 +++ .../shared/code-highlighter/types/index.ts | 43 ++++++ .../code-highlighter/utils/getClassNames.ts | 29 ++++ .../utils/getLineNumberClass.ts | 13 ++ .../utils/getParsedCodeLineList.ts | 21 +++ .../utils/getViewerClassNames.ts | 10 ++ .../shared/code-highlighter/utils/index.ts | 6 + .../utils/parseHighlightCss.ts | 8 +- .../utils/parseHighlightHtml.ts | 5 + .../src/shared/hooks/capturePreview.worker.ts | 32 ++++ .../src/shared/hooks/css/useCssClassList.ts | 23 +++ .../src/shared/hooks/css/useCssOptionItem.ts | 12 +- .../src/shared/hooks/css/useCssOptions.ts | 5 +- .../src/shared/hooks/css/useCssTooltip.ts | 36 +++-- apps/client/src/shared/hooks/index.ts | 1 + .../shared/hooks/queries/useGetWorkspace.ts | 6 +- .../shared/hooks/queries/useSaveWorkspace.ts | 1 - .../hooks/usePreventLeaveWorkspacePage.ts | 34 ++--- .../src/shared/hooks/useWorkspaceSave.ts | 82 +++++++++++ apps/client/src/shared/store/index.ts | 1 - .../src/shared/store/useCssPropsStore.ts | 3 +- .../src/shared/store/useCssTooptipStore.ts | 24 --- .../src/shared/types/customSelectType.ts | 10 ++ apps/client/src/shared/types/index.ts | 2 + apps/client/src/shared/ui/index.ts | 3 +- apps/client/src/shared/ui/logo/Logo.tsx | 5 +- apps/client/src/shared/ui/select/Select.tsx | 18 +-- .../client/src/shared/utils/capturePreview.ts | 57 -------- .../src/shared/utils/convertToCanvas.ts | 36 +++++ apps/client/src/shared/utils/index.ts | 2 +- .../workspace/PreviewBox/PreviewBox.tsx | 35 ++++- .../WorkspaceContent/WorkspaceContent.tsx | 34 +++-- .../WorkspaceHeaderButtons.tsx | 18 ++- .../WorkspacePageHeader.tsx | 49 ++++--- .../CssOptionItemList/CssOptionItemList.tsx | 2 +- .../CssPropsSelectBoxHeader.tsx | 26 +--- apps/client/test/nginx.conf | 28 ++++ apps/client/vite.config.ts | 3 + apps/server/Dockerfile | 4 +- docker-compose.test.yml | 12 ++ docker-compose.yml | 25 +--- 67 files changed, 901 insertions(+), 576 deletions(-) create mode 100644 .github/workflows/boolock-main-cicd.yml create mode 100644 apps/client/Dockerfile.test rename apps/client/{ => production}/nginx.conf (87%) create mode 100644 apps/client/src/entities/workspace/HelpButton/HelpButton.tsx delete mode 100644 apps/client/src/shared/code-highlighter/components/CodeContent/CodeContent.stories.tsx delete mode 100644 apps/client/src/shared/code-highlighter/components/CodeContent/CodeContent.tsx create mode 100644 apps/client/src/shared/code-highlighter/components/index.ts create mode 100644 apps/client/src/shared/code-highlighter/constants/index.ts create mode 100644 apps/client/src/shared/code-highlighter/hooks/index.ts create mode 100644 apps/client/src/shared/code-highlighter/hooks/useDiffCodeAnimate.ts create mode 100644 apps/client/src/shared/code-highlighter/hooks/useHoverLineNumber.ts create mode 100644 apps/client/src/shared/code-highlighter/types/index.ts create mode 100644 apps/client/src/shared/code-highlighter/utils/getClassNames.ts create mode 100644 apps/client/src/shared/code-highlighter/utils/getLineNumberClass.ts create mode 100644 apps/client/src/shared/code-highlighter/utils/getParsedCodeLineList.ts create mode 100644 apps/client/src/shared/code-highlighter/utils/getViewerClassNames.ts create mode 100644 apps/client/src/shared/code-highlighter/utils/index.ts create mode 100644 apps/client/src/shared/hooks/capturePreview.worker.ts create mode 100644 apps/client/src/shared/hooks/css/useCssClassList.ts create mode 100644 apps/client/src/shared/hooks/useWorkspaceSave.ts delete mode 100644 apps/client/src/shared/store/useCssTooptipStore.ts create mode 100644 apps/client/src/shared/types/customSelectType.ts delete mode 100644 apps/client/src/shared/utils/capturePreview.ts create mode 100644 apps/client/src/shared/utils/convertToCanvas.ts create mode 100644 apps/client/test/nginx.conf create mode 100644 docker-compose.test.yml diff --git a/.github/workflows/boolock-dev-cicd.yml b/.github/workflows/boolock-dev-cicd.yml index 51cd35b..c703073 100644 --- a/.github/workflows/boolock-dev-cicd.yml +++ b/.github/workflows/boolock-dev-cicd.yml @@ -1,4 +1,4 @@ -name: ci/cd action +name: dev ci/cd action on: push: @@ -10,110 +10,90 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20.x' - - - name: Install Pnpm - run: npm install -g pnpm - - name: Package install with pnpm - run: pnpm install:all + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + with: + buildkitd-flags: --debug - name: Set BE .env run: | - echo "MONGO_URI=${{ secrets.MONGO_URI }}" > apps/server/.env - echo "SSH_HOST=${{ secrets.SSH_HOST }}" >> apps/server/.env - echo "SSH_PORT=${{ secrets.SSH_PORT }}" >> apps/server/.env - echo "SSH_USER=${{ secrets.SSH_USER }}" >> apps/server/.env - echo "SSH_PASSWORD=${{ secrets.SSH_PASSWORD }}" >> apps/server/.env - echo "SSH_DATABASE_HOST=${{ secrets.SSH_DATABASE_HOST }}" >> apps/server/.env - echo "SSH_DATABASE_PORT=${{ secrets.SSH_DATABASE_PORT }}" >> apps/server/.env - echo "LOCAL_PORT=${{ secrets.LOCAL_PORT }}" >> apps/server/.env - echo "IS_LOCAL=true" >> apps/server/.env - echo "SERVER_CORS_ACCEPT=http://localhost:5173" >> apps/server/.env + echo "MONGO_URI=${{ secrets.TEST_MONGO_URI }}" > apps/server/.env + echo "IS_LOCAL=false" >> apps/server/.env + echo "SERVER_CORS_ACCEPT=${{ secrets.TEST_SERVER_CORS_ACCEPT }}" >> apps/server/.env echo "S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }}" >> apps/server/.env echo "S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }}" >> apps/server/.env echo "S3_BUCKET_NAME=${{ secrets.S3_BUCKET_NAME }}" >> apps/server/.env - + echo "NODE_ENV=production" >> apps/server/.env + - name: Set FE .env run: | - echo "VITE_SERVER_URL=http://localhost:3000" > apps/client/.env + echo "VITE_SERVER_URL=${{ secrets.DEPLOY_VITE_SERVER_URL }}" > apps/client/.env echo "VITE_MIXPANEL_TOKEN=${{ secrets.VITE_MIXPANEL_TOKEN }}" >> apps/client/.env echo "VITE_STATIC_STORAGE_URL=${{ secrets.VITE_STATIC_STORAGE_URL }}" >> apps/client/.env - - name: Set Nginx SSL files - run: | - mkdir -p apps/client/ssl - echo "${{ secrets.SSL_FULLCHAIN }}" > apps/client/ssl/fullchain.pem - echo "${{ secrets.SSL_PRIVKEY }}" > apps/client/ssl/privkey.pem - - - name: Buld Frontend - run: | - cd apps/client - pnpm run build - - - name: Build Backend - run: | - cd apps/server - pnpm run swagger-auto - pnpm run build - - - name: Build base image - run: | - docker build . --file Dockerfile.base --tag ${{ secrets.DOCKERHUB_USERNAME }}/boolock_base_test:1.0 - docker tag ${{ secrets.DOCKERHUB_USERNAME }}/boolock_base_test:1.0 base-image - - - name: Build frontend and backend images - run: | - docker build . --file apps/client/Dockerfile --tag ${{ secrets.DOCKERHUB_USERNAME }}/boolock_client_test:1.0 - docker build . --file apps/server/Dockerfile --tag ${{ secrets.DOCKERHUB_USERNAME }}/boolock_server_test:1.0 - - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_PASSWORD }} + password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }} - - name: Docker Hub push - run: | - docker push ${{ secrets.DOCKERHUB_USERNAME }}/boolock_base_test:1.0 - docker push ${{ secrets.DOCKERHUB_USERNAME }}/boolock_client_test:1.0 - docker push ${{ secrets.DOCKERHUB_USERNAME }}/boolock_server_test:1.0 + - name: Build and Push Base Image + uses: docker/build-push-action@v4 + with: + context: . + file: Dockerfile.base + push: true + tags: ${{ secrets.DOCKERHUB_USERNAME }}/base-image-test:latest + cache-from: type=gha,scope=base-image-test + cache-to: type=gha,mode=max,scope=base-image-test + + - name: Build and Push Frontend Image + uses: docker/build-push-action@v4 + with: + context: . + file: apps/client/Dockerfile.test + push: true + tags: ${{ secrets.DOCKERHUB_USERNAME }}/boolock_client_test:latest + cache-from: type=gha,scope=frontend-test + cache-to: type=gha,mode=max,scope=frontend-test + build-args: | + DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }} + TYPE=test + + - name: Build and Push Backend Image + uses: docker/build-push-action@v4 + with: + context: . + file: apps/server/Dockerfile + push: true + tags: ${{ secrets.DOCKERHUB_USERNAME }}/boolock_server_test:latest + cache-from: type=gha,scope=backend-test + cache-to: type=gha,mode=max,scope=backend-test + build-args: | + DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }} + TYPE=test deploy: + if: github.event_name == 'push' needs: build runs-on: ubuntu-latest steps: - - name: Login to Docker Hub - run: sudo docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_PASSWORD }} - - name: Deploy with docker uses: appleboy/ssh-action@v0.1.6 with: - host: ${{ secrets.SSH_HOST }} - username: ${{ secrets.SSH_USER }} - password: ${{ secrets.SSH_PASSWORD }} - port: ${{ secrets.SSH_PORT }} + host: ${{ secrets.TEST_SSH_HOST }} + username: ${{ secrets.TEST_SSH_USER }} + password: ${{ secrets.TEST_SSH_PASSWORD }} + port: ${{ secrets.TEST_SSH_PORT }} script: | cd boolock/refactor-web31-BooLock - git checkout main - git pull origin main - - echo "MONGO_URI=${{ secrets.DEPLOY_MONGO_URI }}" > apps/server/.env - echo "IS_LOCAL=false" >> apps/server/.env - echo "SERVER_CORS_ACCEPT=${{ secrets.DEPLOY_SERVER_CORS_ACCEPT }}" >> apps/server/.env - echo "S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }}" >> apps/server/.env - echo "S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }}" >> apps/server/.env - echo "S3_BUCKET_NAME=${{ secrets.S3_BUCKET_NAME }}" >> apps/server/.env - echo "NODE_ENV=production" >> apps/server/.env + git fetch origin + git checkout dev + git pull origin dev - echo "VITE_SERVER_URL=${{ secrets.DEPLOY_VITE_SERVER_URL }}" > apps/client/.env - echo "VITE_MIXPANEL_TOKEN=${{ secrets.VITE_MIXPANEL_TOKEN }}" >> apps/client/.env - echo "VITE_STATIC_STORAGE_URL=${{ secrets.VITE_STATIC_STORAGE_URL }}" >> apps/client/.env + echo "DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }}" > .env + echo "${{ secrets.DOCKERHUB_ACCESS_TOKEN }}" | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin - sudo docker compose pull - sudo docker compose down - sudo docker compose up -d --build - sudo docker image prune -f + sudo docker compose -f docker-compose.test.yml pull + sudo docker compose -f docker-compose.test.yml up -d --force-recreate --remove-orphans diff --git a/.github/workflows/boolock-main-cicd.yml b/.github/workflows/boolock-main-cicd.yml new file mode 100644 index 0000000..44508d7 --- /dev/null +++ b/.github/workflows/boolock-main-cicd.yml @@ -0,0 +1,107 @@ +name: main ci/cd action + +on: + push: + branches: ['main'] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + with: + buildkitd-flags: --debug + + - name: Set BE .env + run: | + echo "MONGO_URI=${{ secrets.DEPLOY_MONGO_URI }}" > apps/server/.env + echo "IS_LOCAL=false" >> apps/server/.env + echo "SERVER_CORS_ACCEPT=${{ secrets.DEPLOY_SERVER_CORS_ACCEPT }}" >> apps/server/.env + echo "S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }}" >> apps/server/.env + echo "S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }}" >> apps/server/.env + echo "S3_BUCKET_NAME=${{ secrets.S3_BUCKET_NAME }}" >> apps/server/.env + echo "NODE_ENV=production" >> apps/server/.env + + - name: Set FE .env + run: | + echo "VITE_SERVER_URL=${{ secrets.DEPLOY_VITE_SERVER_URL }}" > apps/client/.env + echo "VITE_MIXPANEL_TOKEN=${{ secrets.VITE_MIXPANEL_TOKEN }}" >> apps/client/.env + echo "VITE_STATIC_STORAGE_URL=${{ secrets.VITE_STATIC_STORAGE_URL }}" >> apps/client/.env + + - name: Set Nginx SSL files + run: | + mkdir -p apps/client/ssl + echo "${{ secrets.SSL_FULLCHAIN }}" > apps/client/ssl/fullchain.pem + echo "${{ secrets.SSL_PRIVKEY }}" > apps/client/ssl/privkey.pem + + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }} + + - name: Build and Push Base Image + uses: docker/build-push-action@v4 + with: + context: . + file: Dockerfile.base + push: true + tags: ${{ secrets.DOCKERHUB_USERNAME }}/base-image-prod:latest + cache-from: type=gha,scope=base-image-prod + cache-to: type=gha,mode=max,scope=base-image-prod + + - name: Build and Push Frontend Image + uses: docker/build-push-action@v4 + with: + context: . + file: apps/client/Dockerfile + push: true + tags: ${{ secrets.DOCKERHUB_USERNAME }}/boolock_client_prod:latest + cache-from: type=gha,scope=frontend + cache-to: type=gha,mode=max,scope=frontend + build-args: | + DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }} + TYPE=prod + + - name: Build and Push Backend Image + uses: docker/build-push-action@v4 + with: + context: . + file: apps/server/Dockerfile + push: true + tags: ${{ secrets.DOCKERHUB_USERNAME }}/boolock_server_prod:latest + cache-from: type=gha,scope=backend + cache-to: type=gha,mode=max,scope=backend + build-args: | + DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }} + TYPE=prod + + deploy: + needs: build + runs-on: ubuntu-latest + steps: + - name: Login to Docker Hub + run: sudo docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_PASSWORD }} + + - name: Deploy with docker + uses: appleboy/ssh-action@v0.1.6 + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USER }} + password: ${{ secrets.SSH_PASSWORD }} + port: ${{ secrets.SSH_PORT }} + script: | + cd boolock/refactor-web31-BooLock + git fetch origin + git checkout main + git pull origin main + + echo "DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }}" > .env + echo "${{ secrets.DOCKERHUB_ACCESS_TOKEN }}" | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin + + sudo docker compose pull + sudo docker compose up -d --force-recreate --remove-orphans \ No newline at end of file diff --git a/README.md b/README.md index 8d7ef2a..7d868ea 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,11 @@

BooLock

-Frame 2016 - - +![image](https://github.com/user-attachments/assets/c58af651-8a5d-4b09-a98e-04ce50f27fca)


- μ›Ή 개발, λΈ”λ‘μœΌλ‘œ 쉽고 즐겁게!
+ μ›Ή 개발, 블둝 쑰립으둜 쉽고 재밌게!
HTMLκ³Ό CSSλ₯Ό λ°°μš°λŠ” 블둝코딩 ν”Œλž«νΌ

λ‚˜λ§Œμ˜ μ°½μž‘λ¬Όμ„ μ™„μ„±ν•˜κ³ , μƒˆλ‘œμš΄ μ›Ή 개발의 κ°€λŠ₯성을 κ²½ν—˜ν•΄λ³΄μ„Έμš”. β™₯️

πŸ‘‡ 배포 μ‚¬μ΄νŠΈ
diff --git a/apps/client/Dockerfile b/apps/client/Dockerfile index 6f9915d..c234586 100644 --- a/apps/client/Dockerfile +++ b/apps/client/Dockerfile @@ -1,4 +1,7 @@ -FROM base-image AS frontend-build + +ARG DOCKERHUB_USERNAME +ARG TYPE +FROM ${DOCKERHUB_USERNAME}/base-image-${TYPE} AS frontend-build WORKDIR /app/apps/client COPY ./apps/client . @@ -7,7 +10,7 @@ RUN pnpm install --offline --frozen-lockfile &&\ FROM nginx:alpine AS frontend -COPY /apps/client/nginx.conf /etc/nginx/conf.d/default.conf +COPY /apps/client/production/nginx.conf /etc/nginx/conf.d/default.conf COPY /apps/client/ssl /etc/nginx/ssl RUN chmod 644 /etc/nginx/ssl/fullchain.pem &&\ chmod 600 /etc/nginx/ssl/privkey.pem &&\ diff --git a/apps/client/Dockerfile.test b/apps/client/Dockerfile.test new file mode 100644 index 0000000..1270603 --- /dev/null +++ b/apps/client/Dockerfile.test @@ -0,0 +1,19 @@ +ARG DOCKERHUB_USERNAME +ARG TYPE +FROM ${DOCKERHUB_USERNAME}/base-image-${TYPE} AS frontend-build + +WORKDIR /app/apps/client +COPY ./apps/client . +RUN pnpm install --offline --frozen-lockfile &&\ + pnpm run build + +FROM nginx:alpine AS frontend + +COPY /apps/client/test/nginx.conf /etc/nginx/conf.d/default.conf +RUN chown -R nginx:nginx /usr/share/nginx/html + +COPY --from=frontend-build /app/apps/client/dist /usr/share/nginx/html/ +RUN chmod -R 755 /usr/share/nginx/html + +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/apps/client/nginx.conf b/apps/client/production/nginx.conf similarity index 87% rename from apps/client/nginx.conf rename to apps/client/production/nginx.conf index 3bb2383..50b2bcb 100644 --- a/apps/client/nginx.conf +++ b/apps/client/production/nginx.conf @@ -9,10 +9,18 @@ server { server { listen 443 ssl; + http2 on; + http3 on; + quic_retry off; + server_name boolock.site; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; + ssl_protocols TLSv1.3; + ssl_prefer_server_ciphers off; + + add_header Alt-Svc 'h3-23=":443"; ma=86400'; location / { root /usr/share/nginx/html; diff --git a/apps/client/src/entities/index.ts b/apps/client/src/entities/index.ts index adb8eeb..7d89b56 100644 --- a/apps/client/src/entities/index.ts +++ b/apps/client/src/entities/index.ts @@ -19,3 +19,4 @@ export { ImageTagModalImg } from './workspace/ImageTagModalImg/ImageTagModalImg' export { ImageTagModalButton } from './workspace/ImageTagModalButton/ImageTagModalButton'; export { ImageTagModalListItem } from './workspace/ImageTagModalListItem/ImageTagModalListItem'; export { CodeExportButton } from './workspace/CodeExportButton/CodeExportButton'; +export { HelpButton } from './workspace/HelpButton/HelpButton'; diff --git a/apps/client/src/entities/workspace/CodeExportButton/CodeExportButton.tsx b/apps/client/src/entities/workspace/CodeExportButton/CodeExportButton.tsx index f407d8e..112c3c0 100644 --- a/apps/client/src/entities/workspace/CodeExportButton/CodeExportButton.tsx +++ b/apps/client/src/entities/workspace/CodeExportButton/CodeExportButton.tsx @@ -1,9 +1,9 @@ import { Spinner } from '@/shared/ui'; import { exportPreviewHtml } from '@/shared/utils'; import toast from 'react-hot-toast'; -import { useState } from 'react'; +import { memo, useState } from 'react'; -export const CodeExportButton = () => { +export const CodeExportButton = memo(() => { const [isLoading, setIsLoading] = useState(false); const handleClick = () => { @@ -32,4 +32,4 @@ export const CodeExportButton = () => { )} ); -}; +}); diff --git a/apps/client/src/entities/workspace/CssCategoryButton/CssCategoryButton.tsx b/apps/client/src/entities/workspace/CssCategoryButton/CssCategoryButton.tsx index 2a94421..f0ec73e 100644 --- a/apps/client/src/entities/workspace/CssCategoryButton/CssCategoryButton.tsx +++ b/apps/client/src/entities/workspace/CssCategoryButton/CssCategoryButton.tsx @@ -1,6 +1,5 @@ import { TCssCategory } from '@/shared/types'; import { useCssPropsStore } from '@/shared/store'; - type CssCategoryButtonProps = { cssCategory: TCssCategory; }; @@ -11,7 +10,8 @@ type CssCategoryButtonProps = { * CSS μΉ΄ν…Œκ³ λ¦¬λ₯Ό 선택할 수 μžˆλŠ” λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈ */ export const CssCategoryButton = ({ cssCategory }: CssCategoryButtonProps) => { - const { selectedCssCategory, setSelectedCssCategory } = useCssPropsStore(); + const selectedCssCategory = useCssPropsStore((state) => state.selectedCssCategory); + const setSelectedCssCategory = useCssPropsStore((state) => state.setSelectedCssCategory); return ( + ); +}); diff --git a/apps/client/src/entities/workspace/RedoButton/RedoButton.tsx b/apps/client/src/entities/workspace/RedoButton/RedoButton.tsx index 6c708e0..5807cc7 100644 --- a/apps/client/src/entities/workspace/RedoButton/RedoButton.tsx +++ b/apps/client/src/entities/workspace/RedoButton/RedoButton.tsx @@ -1,12 +1,13 @@ import { CircleButton } from '@/shared/ui'; import RightArrow from '@/shared/assets/arrow_right.svg?react'; import { useWorkspaceStore } from '@/shared/store'; +import { memo } from 'react'; /** * @description * μ›Œν¬μŠ€νŽ˜μ΄μŠ€ μΊ”λ²„μŠ€μ—μ„œ redo κΈ°λŠ₯을 μ‹€ν–‰μ‹œν‚€λŠ” λ²„νŠΌμž…λ‹ˆλ‹€. */ -export const RedoButton = () => { +export const RedoButton = memo(() => { const { workspace } = useWorkspaceStore(); const handleRedo = () => { @@ -20,4 +21,4 @@ export const RedoButton = () => { ); -}; +}); diff --git a/apps/client/src/entities/workspace/SaveButton/SaveButton.tsx b/apps/client/src/entities/workspace/SaveButton/SaveButton.tsx index 3a8dda9..dca5134 100644 --- a/apps/client/src/entities/workspace/SaveButton/SaveButton.tsx +++ b/apps/client/src/entities/workspace/SaveButton/SaveButton.tsx @@ -1,14 +1,5 @@ -import * as Blockly from 'blockly/core'; - -import { useCssPropsStore, useResetCssStore, useWorkspaceStore } from '@/shared/store'; - +import { useWorkspaceSave } from '@/shared/hooks/useWorkspaceSave'; import { Spinner } from '@/shared/ui'; -import { capturePreview, trackEvent } from '@/shared/utils'; -import { cssStyleToolboxConfig } from '@/shared/blockly'; -import toast from 'react-hot-toast'; -import { useParams } from 'react-router-dom'; -import { useSaveWorkspace } from '@/shared/hooks'; -import { useState } from 'react'; /** * @@ -17,40 +8,13 @@ import { useState } from 'react'; * μ €μž₯ ν•­λͺ© : css 속성, μΊ”λ²„μŠ€ 블둝 μƒνƒœ, css class 블둝, css 리셋 μ—¬λΆ€, 미리보기 썸넀일 */ export const SaveButton = () => { - const workspaceId = useParams().workspaceId as string; - const { mutate: saveWorkspace, isPending } = useSaveWorkspace(workspaceId); - const { totalCssPropertyObj } = useCssPropsStore(); - const { workspace } = useWorkspaceStore(); - const { isResetCssChecked } = useResetCssStore(); - const [isCapture, setIsCapture] = useState(false); - - const handleClick = async () => { - trackEvent('workspace_saved'); - try { - const canvas = Blockly.serialization.workspaces.save(workspace!) as any; - setIsCapture(true); - const thumbnail = await capturePreview(); - saveWorkspace({ - totalCssPropertyObj, - canvas, - classBlockList: cssStyleToolboxConfig.contents, - cssResetStatus: isResetCssChecked, - thumbnail, - }); - setIsCapture(false); - } catch (error) { - if (error instanceof Error) { - toast.error(error.message); - } - } finally { - setIsCapture(false); - } - }; + const { handleSave, isCapture, isPending } = useWorkspaceSave(); return ( <> +

{isPending || isCapture ? 'μ €μž₯ 쀑' : 'μ €μž₯ μ™„λ£Œ'}