Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1384 commits
Select commit Hold shift + click to select a range
fadd12a
Update src/services/supabase/server.ts
obtuse-triangle Nov 24, 2025
9923b50
[I25-345] feat: Use environment variable for Sentry DSN across all co…
obtuse-triangle Nov 24, 2025
8bac109
[I25-345] docs: Add JSDoc for `fetchWithRetry` function.
obtuse-triangle Nov 24, 2025
f8ad7e7
[I25-340] feat : 최적화
jaehwan02 Nov 24, 2025
424c97d
[I25-350] chore: Add Docker builder cache pruning to Jenkinsfile clea…
obtuse-triangle Nov 24, 2025
c533808
Merge pull request #208 from insert-intern-24/I25-340-프로젝트-등록이-안되어-있을…
GAMZAMANDU Nov 24, 2025
fc0febf
Merge pull request #209 from insert-intern-24/I25-350-fix-jenkins-sto…
GAMZAMANDU Nov 24, 2025
7608d18
[I25-338] [I25-321] feat: Update profile competition handling to incl…
GAMZAMANDU Nov 24, 2025
44aa921
[I25-337] feat : 미등록 스킬 예외처리
jaehwan02 Nov 24, 2025
fffc685
Merge branch 'I25-345-refactor-supabase-query' into I25-349-fix-remot…
obtuse-triangle Nov 24, 2025
d079da9
[I25-338] fix: Update error handling for refresh token in SupabaseSes…
GAMZAMANDU Nov 24, 2025
2142477
Merge pull request #211 from insert-intern-24/(I25-338)-feat/특정-수상이력-…
GAMZAMANDU Nov 24, 2025
781deee
Merge branch 'release/v2' into I25-345-refactor-supabase-query
obtuse-triangle Nov 24, 2025
c215119
Merge pull request #207 from insert-intern-24/I25-345-refactor-supaba…
GAMZAMANDU Nov 24, 2025
4c851a2
Merge remote-tracking branch 'origin/I25-345-refactor-supabase-query'…
obtuse-triangle Nov 24, 2025
6bb0e24
Merge pull request #210 from insert-intern-24/I25-349-fix-remote-image
GAMZAMANDU Nov 24, 2025
adba82e
[I25-349] feat: Differentiate Supabase host replacement for SVG files…
obtuse-triangle Nov 24, 2025
1735138
[I25-330] feat: Implement Zod-based validation for modal inputs and r…
GAMZAMANDU Nov 24, 2025
3245c49
Merge remote-tracking branch 'origin/release/v2' into I25-349-fix-rem…
obtuse-triangle Nov 24, 2025
d2d89af
[I25-330] docs: update pull request guidelines
GAMZAMANDU Nov 24, 2025
ba472e3
[I25-330] feat: implement requested functionality across specified files
GAMZAMANDU Nov 24, 2025
84fe191
Merge pull request #206 from insert-intern-24/I25-337-skilltag-입력-시-매…
obtuse-triangle Nov 24, 2025
2589153
[I25-333] fix: 프로필 조회 함수의 코드 정리 및 오류 처리 개선
hanjiwon1108 Nov 24, 2025
9205fa4
[I25-330] feat : 프로필 및 프로젝트 이름 필드에 정규식 검증 추가
GAMZAMANDU Nov 25, 2025
65e445e
[I25-330] feat : 모달 폼 에러 발생 시 해당 필드로 자동 스크롤 기능 추가
GAMZAMANDU Nov 25, 2025
0e4fcf9
Update src/services/profile/getProfile.server.ts
obtuse-triangle Nov 25, 2025
8a8990f
Update src/app/components/ui/input/InputOfModal.tsx
GAMZAMANDU Nov 25, 2025
3bc8b69
Update src/app/components/ui/input/InputOfModal.tsx
GAMZAMANDU Nov 25, 2025
0a3fe11
Merge pull request #214 from insert-intern-24/I25-333-fix/TeamExcepti…
obtuse-triangle Nov 25, 2025
d2745d5
[I25-331] feat: 팀원 프로필에 툴팁 표시 추가
hanjiwon1108 Nov 25, 2025
44fbd39
[I25-331] feat: 프로필 이미지에 호버 시 툴팁 표시 기능 추가
hanjiwon1108 Nov 25, 2025
74e006c
Merge branch 'release/v2' into I25-331-feat/HoverToolTip
hanjiwon1108 Nov 25, 2025
65c6131
Merge pull request #212 from insert-intern-24/(I25-330)-feat/링크-정규식-필요
GAMZAMANDU Nov 25, 2025
827d94e
Merge pull request #215 from insert-intern-24/I25-331-feat/HoverToolTip
obtuse-triangle Nov 25, 2025
0a8e648
[I25-331] feat: 프로필 이미지에 학생 이름 및 툴팁 기능 추가
GAMZAMANDU Nov 25, 2025
aa349bf
[I25-324] feat : google a
jaehwan02 Nov 25, 2025
846692a
Initial plan
Copilot Nov 25, 2025
1fe15f7
refactor: ProfileImage 컴포넌트에서 중복 studentName prop 제거
Copilot Nov 25, 2025
a143183
Merge pull request #217 from insert-intern-24/copilot/sub-pr-216
obtuse-triangle Nov 25, 2025
ccd17cf
[I25-345] CI: 환경 변수 추가
obtuse-triangle Nov 25, 2025
6c90f0c
Merge pull request #218 from insert-intern-24/I25-345-refactor-supaba…
obtuse-triangle Nov 25, 2025
55bac07
Merge pull request #216 from insert-intern-24/I25-331-feat/HoverToolTip
obtuse-triangle Nov 25, 2025
ea9a0e2
[I25-349] fix: exclude svg, ico, bmp from next/image optimization
obtuse-triangle Nov 25, 2025
b9f0358
Update src/services/supabase/imageHostConverter.ts
obtuse-triangle Nov 25, 2025
7da0315
Merge pull request #219 from insert-intern-24/I25-349-fix-remote-image
obtuse-triangle Nov 25, 2025
4753290
Merge remote-tracking branch 'origin/release/v2' into I25-324-로딩-프로그레스
obtuse-triangle Nov 25, 2025
b42c8d9
[I25-324] feat: add nprogress dependency, update build and lint scrip…
obtuse-triangle Nov 25, 2025
f81c312
[I25-351] fix: Robustify input filtering by explicitly converting val…
GAMZAMANDU Nov 25, 2025
b6d7567
[I25-351] refactor: Simplify effect dependencies and enhance input ch…
GAMZAMANDU Nov 25, 2025
7897b83
[I25-351] refactor: Remove unused import for getOrCreateSkillId in Sk…
GAMZAMANDU Nov 25, 2025
b08ba84
Merge pull request #220 from insert-intern-24/I25-351-e-to-lower-case…
GAMZAMANDU Nov 25, 2025
b291bb0
[I25-322] fix: 모바일에서 에디터 툴바 비정상 표기 수정
GAMZAMANDU Nov 25, 2025
686354c
[I25-322] chore : 에디터 폰트 프리텐다드 적용
GAMZAMANDU Nov 25, 2025
aca8449
[I25-322] chore : 에디터의 글자 크기를 전반적으로 키움.
GAMZAMANDU Nov 25, 2025
83a7763
[I25-322] feat: Add Notion-style Link Card feature to Tiptap editor
GAMZAMANDU Nov 25, 2025
d6c816e
[I25-322] feat: Add Link Card support to reader mode
GAMZAMANDU Nov 25, 2025
33a625c
[I25-322] feat: Add a new `MyComponent` and integrate it with a new A…
GAMZAMANDU Nov 25, 2025
7532d12
[I25-322] feat: Add "Stop Generating" button and streaming UI state t…
GAMZAMANDU Nov 25, 2025
3baac3f
[I25-322] feat: Update ProjectMainContent button label and enhance ed…
GAMZAMANDU Nov 25, 2025
9da69d5
[I25-356] fix: Update ProjectCard and ProjectCardMetadata to require …
GAMZAMANDU Nov 25, 2025
4bf1c5c
[I25-322] Remove height and overflow styles from simple editor wrapper.
obtuse-triangle Nov 25, 2025
1d1f2dd
[I25-356] fix: Update transformTeamToCard to ensure title is set to a…
GAMZAMANDU Nov 25, 2025
bc9cd45
Merge pull request #222 from insert-intern-24/I25-356-project-card에-이…
GAMZAMANDU Nov 25, 2025
d9c68c4
Merge branch 'release/v2' into I25-324-로딩-프로그레스
obtuse-triangle Nov 25, 2025
c7cdf34
Merge pull request #204 from insert-intern-24/I25-324-로딩-프로그레스
obtuse-triangle Nov 25, 2025
e361339
[I25-322] refactor: Update LinkCardNode to use unknown type for HTMLA…
GAMZAMANDU Nov 25, 2025
1dfbf63
Update src/app/components/tiptap/tiptap-templates/simple/simple-edito…
GAMZAMANDU Nov 25, 2025
9239c9a
Update src/app/components/tiptap/tiptap-templates/simple/simple-edito…
GAMZAMANDU Nov 25, 2025
4209504
Update src/app/components/tiptap/tiptap-node/link-card-node/LinkCardC…
GAMZAMANDU Nov 25, 2025
a34e50c
Update src/app/components/tiptap/tiptap-node/link-card-node/link-card…
GAMZAMANDU Nov 25, 2025
c0467fb
Update src/app/components/tiptap/tiptap-node/link-card-node/LinkCardC…
GAMZAMANDU Nov 25, 2025
207078a
Update src/app/components/tiptap/tiptap-node/link-card-node/LinkCardC…
GAMZAMANDU Nov 25, 2025
e7c8ba6
Update src/app/components/tiptap/tiptap-node/heading-node/heading-nod…
GAMZAMANDU Nov 25, 2025
73714b9
Update src/app/components/tiptap/tiptap-templates/simple/simple-edito…
GAMZAMANDU Nov 25, 2025
3d068e0
[I25-357] refactor: Update SearchTab component to wrap PortfolioCard …
GAMZAMANDU Nov 25, 2025
e3548f4
[I25-357] chore: Enhance ProfileInfo component with improved styling …
GAMZAMANDU Nov 25, 2025
7e81f51
Update src/app/components/portfolio/SearchTab.tsx
obtuse-triangle Nov 25, 2025
e39fe25
Update src/app/components/ui/profile/portfolio/ProfileInfo.tsx
obtuse-triangle Nov 25, 2025
a53c8c0
Merge pull request #223 from insert-intern-24/I25-357-포트폴리오-2-열으로-만들기
GAMZAMANDU Nov 25, 2025
27910fc
[I25-322] chore : Update package dependencies to include new Tiptap e…
GAMZAMANDU Nov 25, 2025
f109926
Merge pull request #221 from insert-intern-24/I25-322-모바일에서-html-에디터-…
GAMZAMANDU Nov 25, 2025
158fad0
[I25-358] feat : AutoCarousel to support clickable slides with option…
GAMZAMANDU Nov 25, 2025
9acabb3
Update src/app/components/card/home/AutoCarousel.tsx
GAMZAMANDU Nov 25, 2025
36d7991
[I25-358] feat: Introduce carouselLinkMap for dynamic slide linking
GAMZAMANDU Nov 25, 2025
aac7ecb
Merge pull request #224 from insert-intern-24/I25-358-케러셀-클릭-시-리다이렉트
GAMZAMANDU Nov 25, 2025
8e42771
[I25-359] chore : toast의 손 그림자 추가
GAMZAMANDU Nov 25, 2025
0631025
[I25-322] fix: Update toolbar positioning from fixed to sticky and ad…
obtuse-triangle Nov 25, 2025
7cce06e
Merge branch 'I25-322-모바일에서-html-에디터-제한-또는-해결' into release/v2
obtuse-triangle Nov 25, 2025
5cc9f82
[I25-359] chore : 링크가 외부 링크로 변환되도록 작업 및 링크 컴포넌트 통일화.
GAMZAMANDU Nov 25, 2025
2eb1d5d
[I25-359] chore : 프로젝트 카드에 이름 제거
GAMZAMANDU Nov 25, 2025
6126cad
[I25-359] chore : 정규식 관련 자잘한 수정
GAMZAMANDU Nov 25, 2025
03bed22
feat: Add dynamic height attribute for Figma embed iframe
obtuse-triangle Nov 25, 2025
7628b17
[I25-359] fix : 명함을 내미는 손의 구멍을 메움
GAMZAMANDU Nov 25, 2025
dfd8415
[I25-359] chore : 사용되지 않는 title props 삭제
GAMZAMANDU Nov 25, 2025
65d66de
[I25-359] chore : 외부 링크 검증 로직 수정 및 관련 주석 업데이트
GAMZAMANDU Nov 25, 2025
9a4f255
[I25-359] chore : 외부 링크에 'nofollow' 속성 추가
GAMZAMANDU Nov 25, 2025
9b40817
Update src/app/components/ui/input/LabelOfInputs.tsx
GAMZAMANDU Nov 25, 2025
5ea5b5d
Update src/services/config/projectConfig.ts
GAMZAMANDU Nov 25, 2025
cf5f550
[I25-355] feat : 프로젝투 타이틀 기준으로 집합
jaehwan02 Nov 25, 2025
fdaefc0
[I25-355] feat : 코파일럿 코멘트 반영
jaehwan02 Nov 25, 2025
e33272f
Merge pull request #225 from insert-intern-24/I25-359-링크-클릭-시-사이트-내-리…
obtuse-triangle Nov 25, 2025
e44be45
Merge pull request #226 from insert-intern-24/I25-355-프로젝트가-2-개인데-같은게…
obtuse-triangle Nov 25, 2025
91575f6
[I25-352] feat : img 5mb+ 예외처리
jaehwan02 Nov 25, 2025
ae36e03
[I25-352] feat : 코파일럿 리뷰 반영
jaehwan02 Nov 25, 2025
ca59f87
[I25-352] feat : 빌드 오류 해결
jaehwan02 Nov 25, 2025
f624dc7
[I25-362] feat: Implement rich text content editing for profiles and …
obtuse-triangle Nov 26, 2025
fb757b6
[I25-362] feat: update display profile description.
obtuse-triangle Nov 26, 2025
78bb126
[I25-362] feat: Update database types with new tables and company loc…
obtuse-triangle Nov 26, 2025
95970c4
[I25-362] feat: Extend team and profile types with `profile_html_desc…
obtuse-triangle Nov 26, 2025
9999cd8
Initial plan
Copilot Nov 26, 2025
be3715d
Update src/app/components/portfolio/Portfolio.tsx
obtuse-triangle Nov 26, 2025
0426522
Update src/services/profile/updateProfileContent.client.ts
obtuse-triangle Nov 26, 2025
83f56ca
이미지 업로드 함수 통합: uploadProfileImage와 uploadProjectImage를 공통 uploadImage…
Copilot Nov 26, 2025
4237d20
Merge pull request #229 from insert-intern-24/copilot/sub-pr-227
obtuse-triangle Nov 26, 2025
ae12ebf
Merge pull request #227 from insert-intern-24/I25-352-이미지가-5-mb-이상일-때…
obtuse-triangle Nov 26, 2025
a4c99c3
Merge pull request #228 from insert-intern-24/I25-362-feat-profile-html
obtuse-triangle Nov 26, 2025
da08f0e
style: 사이드바 레이아웃 height full 추가
hanjiwon1108 Nov 26, 2025
dfe1ef7
[I25-366] NProgress CSS 모듈 선언 추가 및 ProgressBar 구성 수정
obtuse-triangle Nov 26, 2025
b080c26
Merge pull request #230 from insert-intern-24/hotfix/ProjectSideBarSt…
hanjiwon1108 Nov 26, 2025
e25d716
Merge pull request #231 from insert-intern-24/I25-366-hotfix-progress
obtuse-triangle Nov 26, 2025
9698e75
[I25-368] fix: 이미지 노드 등록 및 URL 변환 로직 추가
obtuse-triangle Nov 26, 2025
1f21190
Merge pull request #232 from insert-intern-24/I25-368-hotifx-editor-i…
GAMZAMANDU Nov 26, 2025
e08da95
[I25-370] feat: team owner를 항상 팀원으로 표기
obtuse-triangle Nov 26, 2025
bc8b784
[I25-371] fix: 포트폴리오 프로젝트 레이아웃 수정
hanjiwon1108 Nov 26, 2025
88b0aea
[I25-371] fix: tiptap 기본 템플릿 무력화
obtuse-triangle Nov 26, 2025
248d4d6
[I25-371] fix: home 에서 editor 표시 안 되도록 변경
obtuse-triangle Nov 26, 2025
c0ee1a3
Apply suggestion from @Copilot
obtuse-triangle Nov 26, 2025
58173cb
Merge pull request #234 from insert-intern-24/I25-371-fix/PortfolioPr…
obtuse-triangle Nov 26, 2025
360727b
Merge pull request #233 from insert-intern-24/I25-370-feat-team-owner…
obtuse-triangle Nov 26, 2025
15d3f89
fix: createClient 호출 시 인자 수정
obtuse-triangle Nov 26, 2025
20a264a
[I25-378] fix: Figma URL 처리 개선 및 팀 데이터에 프로필 HTML 설명 추가
obtuse-triangle Nov 26, 2025
48581ed
Initial plan
Copilot Nov 26, 2025
e31c7dc
fix: 원본 URL과 임베드 URL 분리 관리 및 공통 유틸리티 추출
Copilot Nov 26, 2025
96ce43d
fix: 리뷰 피드백 반영 - URL 유효성 검사 및 정규식 패턴 수정
Copilot Nov 26, 2025
c42fa59
[I25-377] feat: 버튼 비활성화 기능 추가 및 제출 상태 관리
hanjiwon1108 Nov 26, 2025
e086927
[I25-377] style: 제출하기 색깔 변경
hanjiwon1108 Nov 26, 2025
2e7d3cc
[I25-380] feat: 팀 프로젝트의 기여자 목록에서 팀 소속 오너 제외 및 중복 프로필 제거
hanjiwon1108 Nov 26, 2025
0bd333b
[I25-377] feat: 제출 버튼 타이머 정리 및 상태 관리 개선
hanjiwon1108 Nov 26, 2025
c3da4e7
Merge pull request #237 from insert-intern-24/I25-377-feat/SubmitButt…
obtuse-triangle Nov 26, 2025
76816a2
Merge pull request #236 from insert-intern-24/copilot/sub-pr-235
obtuse-triangle Nov 26, 2025
e02c8cb
Initial plan
Copilot Nov 26, 2025
5afd218
fix: CodeQL 보안 이슈 해결 - Figma URL 검증 강화
Copilot Nov 26, 2025
895f9b6
[I25-381] fix: 세션 업데이트시 INTERNAL URL을 통한 supabase client사용
obtuse-triangle Nov 26, 2025
b3ec9fc
Merge pull request #240 from insert-intern-24/copilot/sub-pr-235-again
obtuse-triangle Nov 26, 2025
78d4698
[I25-379] feat: 목데이터 제거 및 예외처리 로직 개발, 프로젝트 profile_id로 필터 및 구분
hanjiwon1108 Nov 26, 2025
82da2cb
Merge pull request #241 from insert-intern-24/I25-379-fix/BusinessCar…
obtuse-triangle Nov 26, 2025
13ecf71
Merge pull request #239 from insert-intern-24/I25-380-feat/MetaInfoSet
obtuse-triangle Nov 26, 2025
5822ac9
[I25-375] fix: 붙여넣기 이미지 업로드 핸들러 개선
obtuse-triangle Nov 26, 2025
c442373
Update src/services/supabase/middleware.server.ts
obtuse-triangle Nov 26, 2025
2a96972
Initial plan
Copilot Nov 26, 2025
39120f9
Merge pull request #235 from insert-intern-24/I25-378-fix-figma-embed
obtuse-triangle Nov 26, 2025
d54e3db
fix: 미들웨어에서 createServerClient 직접 호출로 롤백, INTERNAL_URL 사용 및 쿠키 복사 로직 적용
Copilot Nov 26, 2025
7e4024b
Merge pull request #244 from insert-intern-24/copilot/sub-pr-242
obtuse-triangle Nov 26, 2025
58268c4
Initial plan
Copilot Nov 26, 2025
df413a4
Merge pull request #242 from insert-intern-24/I25-381-fix-performance
obtuse-triangle Nov 26, 2025
9593a66
[I25-383] style: h2 스타일 수정 및 첫 번째 자식 선택자 제거
hanjiwon1108 Nov 26, 2025
5f4592a
refactor: 이미지 업로드 핸들러 개선 - 리뷰 피드백 반영
Copilot Nov 26, 2025
fbdc469
refactor: 한번에 업로드되는 이미지 개수 제한 제거
Copilot Nov 26, 2025
a5d9888
Initial plan
Copilot Nov 26, 2025
9af5dbc
Merge pull request #246 from insert-intern-24/I25-383-feat/EditorH2
hanjiwon1108 Nov 26, 2025
e119829
refactor: 쿠키 프리픽스 변환 로직을 공통 유틸리티로 추출
Copilot Nov 26, 2025
0aa2216
fix: 환경 변수 검증 및 옵셔널 체이닝 제거
Copilot Nov 26, 2025
59d535a
Revert "refactor: 한번에 업로드되는 이미지 개수 제한 제거"
obtuse-triangle Nov 26, 2025
cdf9ef5
Update src/services/supabase/cookieUtils.ts
obtuse-triangle Nov 26, 2025
bf66b94
Update src/services/supabase/server.ts
obtuse-triangle Nov 26, 2025
8184c3c
Update src/services/supabase/server.ts
obtuse-triangle Nov 26, 2025
e880bec
perf: getCookiePrefixes 함수에 캐시 추가
Copilot Nov 26, 2025
632977f
fix: 이미지 업로드 후 무한 로딩 버그 수정
Copilot Nov 26, 2025
ec35dba
Merge pull request #247 from insert-intern-24/copilot/fix-cookie-stor…
obtuse-triangle Nov 26, 2025
8398f40
Merge pull request #243 from insert-intern-24/I25-375-feat-editor-ima…
obtuse-triangle Nov 26, 2025
b70eef6
fix: 이미지 업로드 후 무한 로딩 버그 수정 - src로 플레이스홀더 매칭
Copilot Nov 26, 2025
5b42d29
[I25-384] fix: 로그인 박스 설명 수정
hanjiwon1108 Nov 26, 2025
3b2212a
[I25-385] fix: 편집 모드에 따라 콘텐츠 패딩 조정
hanjiwon1108 Nov 26, 2025
6473ccc
[I25-385] fix: 프로젝트 목록이 없을 때 '아직 등록되지 않았습니다.' 메시지 추가
hanjiwon1108 Nov 26, 2025
3d15fc1
Merge pull request #248 from insert-intern-24/I25-385-fix/EditorPadding
GAMZAMANDU Nov 29, 2025
cc7e77b
[I25-394] feat : viewer page만의 그룹 라우트 생성
GAMZAMANDU Nov 30, 2025
be8a79d
[I25-394] feat : viewer 퍼블리싱
GAMZAMANDU Nov 30, 2025
9d4b2a3
[I25-394] feat : viewer에 실제 데이터 바인딩
GAMZAMANDU Nov 30, 2025
36c15bb
[I25-394] feat : 정확환 타입 사용하도록 함
GAMZAMANDU Nov 30, 2025
0d9f558
[I25-394] feat : 웹에서 뷰어는 두줄로 보여야한다
GAMZAMANDU Nov 30, 2025
c4663d4
[I25-394] chore : 불필요한 js코드를 css로 변경
GAMZAMANDU Nov 30, 2025
bb3f555
[I25-394] feat : 프로젝트 및 경험은 링크로 어갈 수 있다
GAMZAMANDU Nov 30, 2025
52252fb
[I25-394] feat : 소개과, 임베과 나누는 배너 추가
GAMZAMANDU Nov 30, 2025
1678f27
[I25-395] [I25-394] feat: 프로필 구성에 이메일 필드 추가
GAMZAMANDU Nov 30, 2025
28d8811
Merge pull request #251 from insert-intern-24/I25-395-프로필-모달에-이메일-넣을-…
GAMZAMANDU Nov 30, 2025
9959e0c
[I25-394] refactor: remove unused variables from BulletList and Portf…
GAMZAMANDU Nov 30, 2025
deb4d84
[I25-394] feat : 이름 클릭 시 포트폴리오로 보냄
GAMZAMANDU Nov 30, 2025
c601285
[I25-394] chore: add border, padding, and background color to Portfol…
GAMZAMANDU Nov 30, 2025
0b7e589
[I25-394] feat : viewer의 모바일 환경 UI/UX 개선
GAMZAMANDU Nov 30, 2025
0798781
[I25-394] feat : 뷰어 페이지네이션 제거
GAMZAMANDU Nov 30, 2025
56f828a
[I25-394] feat: add full route cache configuration for viewer page wi…
GAMZAMANDU Nov 30, 2025
58357ac
[I25-394] fix: add smooth scrolling to main layout in viewer component
GAMZAMANDU Nov 30, 2025
9817760
[I25-394] feat : 사용하지 않는 패키지 제거 (page-flip, turn.js)
GAMZAMANDU Nov 30, 2025
dcf6853
[I25-394] feat : 사용하지 않는 ViewerPagination 컴포넌트 제거
GAMZAMANDU Nov 30, 2025
f0b2159
Update src/app/(viewer)/layout.tsx
GAMZAMANDU Nov 30, 2025
bd875af
Update src/app/(viewer)/layout.tsx
GAMZAMANDU Nov 30, 2025
6098369
[I25-394] feat : getAllViewerPortfolioData 함수에서 사용하지 않는 페이지네이션 파라미터 제거
GAMZAMANDU Nov 30, 2025
0b42779
[I25-394] feat : 뷰어 컴포넌트 이름을 PascalCase로 변경 및 레이아웃 함수명 명확화
GAMZAMANDU Nov 30, 2025
48747ab
Update src/services/portfolio/getAllViewerPortfolioData.server.ts
GAMZAMANDU Nov 30, 2025
4057aab
Update src/app/(viewer)/viewer/page.tsx
GAMZAMANDU Nov 30, 2025
bfe1a0b
[I25-394] Refactor: Move utility functions to portfolioUtils.ts for b…
GAMZAMANDU Nov 30, 2025
8dedd4e
[I25-394] fix : Remove deprecated packages (page-flip, turn.js, jquer…
GAMZAMANDU Nov 30, 2025
c77c640
Merge pull request #252 from insert-intern-24/I25-394-viewer-만들기
GAMZAMANDU Nov 30, 2025
2eea661
Merge pull request #245 from insert-intern-24/copilot/sub-pr-243
GAMZAMANDU Nov 30, 2025
5995117
[I25-394] feat : 포트폴리오 필터 사이드바 컴포넌트 분리 및 재사용성 개선
GAMZAMANDU Dec 1, 2025
f364629
[I25-394] feat : ViewerPortfolioData 타입에 status와 role 필드 추가
GAMZAMANDU Dec 1, 2025
02d7f0a
[I25-394] feat : viewer 페이지에 필터 기능 추가 및 (box-layout)으로 이동
GAMZAMANDU Dec 1, 2025
4528462
[I25-394] feat : viewer 페이지 로딩 스켈레톤 컴포넌트 추가
GAMZAMANDU Dec 1, 2025
3abd596
[I25-394] feat : 2학년 필터링 기능 추가 및 생년월일로 학년 계산 함수 구현
GAMZAMANDU Dec 1, 2025
8a76a14
Initial plan
Copilot Dec 1, 2025
ecedb50
Update src/app/(box-layout)/viewer/page.tsx
GAMZAMANDU Dec 1, 2025
b909d08
Update src/app/components/portfolio/SearchTab.tsx
GAMZAMANDU Dec 1, 2025
0b17ff5
Update src/app/(box-layout)/viewer/ViewerContent.tsx
GAMZAMANDU Dec 1, 2025
2720640
refactor: 학과 목록 추출 로직을 공통 유틸리티 함수로 분리 (DRY 원칙 적용)
Copilot Dec 1, 2025
bf7ccb0
Merge pull request #254 from insert-intern-24/copilot/sub-pr-253
GAMZAMANDU Dec 1, 2025
1240cb4
Initial plan
Copilot Dec 1, 2025
b99453a
refactor: 필터링 로직을 공통 유틸리티 함수로 분리 (DRY 원칙 적용)
Copilot Dec 1, 2025
a7826a6
fix: SearchTab에서 filteredData를 useMemo로 감싸 성능 최적화
Copilot Dec 1, 2025
1aa793b
Merge pull request #256 from insert-intern-24/copilot/sub-pr-253-anot…
GAMZAMANDU Dec 1, 2025
76d4c1c
Merge pull request #253 from insert-intern-24/I25-394-viewer-만들기
GAMZAMANDU Dec 1, 2025
f419e32
[I25-394] fix : topLabelText 오류 수정
GAMZAMANDU Dec 1, 2025
d65b92e
Merge pull request #257 from insert-intern-24/I25-394-viewer-만들기
GAMZAMANDU Dec 1, 2025
247fd45
[I25-394] feat : 뷰어에서 링크를 새 창 열기로 변경
GAMZAMANDU Dec 2, 2025
0261cb9
Merge pull request #258 from insert-intern-24/I25-394-viewer-만들기
GAMZAMANDU Dec 2, 2025
1c95d1e
fix: team owner도 project 추가 가능하도록 변경
obtuse-triangle Dec 2, 2025
1620333
fix: sitemap base url 기본값 변경
obtuse-triangle Dec 2, 2025
435943e
Merge pull request #259 from insert-intern-24/hotfix/project_profile_…
obtuse-triangle Dec 2, 2025
059a557
[I25-405] feat : 모달에 사진 미리보기 추가
GAMZAMANDU Dec 2, 2025
ffa8d22
[I25-405] feat : Account.tsx에 프로필 이미지를 띄우도록 변경
GAMZAMANDU Dec 2, 2025
1e9733e
[I25-405] refactor: Update types in InputOfModal, dataService, and us…
GAMZAMANDU Dec 2, 2025
14366a7
Update src/app/components/ui/input/PictureUpload.tsx
GAMZAMANDU Dec 2, 2025
afa0b3a
[I25-405] feat: Add cleanup for preview URL on component unmount in P…
GAMZAMANDU Dec 2, 2025
55975e4
[I25-405] refactor: Update form data types in ProjectEditModal and Pr…
GAMZAMANDU Dec 2, 2025
745dd96
Merge pull request #260 from insert-intern-24/I25-405-사진-업로드에-임시사진-뜨게…
obtuse-triangle Dec 2, 2025
9349682
[I25-412] feat : 포트폴리오 데이터 1시간 캐시 및 서버 사이드 셔플 적용
GAMZAMANDU Dec 2, 2025
58ec3a1
[I25-412] feat : 페이지네이션 훅 단순화 (재시도 로직 제거, hasMore 판단 통합)
GAMZAMANDU Dec 2, 2025
13adc38
[I25-412] feat : AutoSlidingBusinessCard를 서버 컴포넌트로 변경하여 내부에서 데이터 페칭
GAMZAMANDU Dec 2, 2025
c6e09df
[I25-412] feat : 명함을 넘기는 손 순서 역정렬
GAMZAMANDU Dec 3, 2025
3219ec7
Update src/app/components/card/home/AutoSlidingBusinessCardClient.tsx
GAMZAMANDU Dec 6, 2025
2cad0d0
Update src/app/api/portfolio/paginated/route.ts
GAMZAMANDU Dec 6, 2025
13ec745
Update src/app/api/portfolio/paginated/route.ts
GAMZAMANDU Dec 6, 2025
63f7f16
Update src/utils/hook/useInfinitePortfolio.ts
GAMZAMANDU Dec 6, 2025
9d88be6
[I25-412] refactor: Optimize displayCards computation using useMemo f…
GAMZAMANDU Dec 6, 2025
9fca9c5
[I25-412] feat : 셔플 로직을 서버에서 클라이언트로 이동하여 성능 개선
GAMZAMANDU Dec 6, 2025
88744b4
[I25-412] feat : 명함 캐러셀 접근성 개선 및 코드 리팩토링
GAMZAMANDU Dec 6, 2025
a5c2cd8
[I25-412] [I25-300] feat: Remove profile modal feature for job select…
GAMZAMANDU Dec 6, 2025
13866c0
[I25-412] feat: Enhance data handling in AutoSlidingBusinessCardClien…
GAMZAMANDU Dec 6, 2025
21e568f
Merge pull request #262 from insert-intern-24/I25-412-명함을-넘기는-손-성능-개선
GAMZAMANDU Dec 6, 2025
c761178
Bump next from 15.5.6 to 15.5.9
dependabot[bot] Dec 12, 2025
23a822d
Merge pull request #263 from insert-intern-24/dependabot/npm_and_yarn…
obtuse-triangle Dec 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 5 additions & 2 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
{
"extends": ["next/core-web-vitals", "next/typescript"]
}
"extends": [
"next/core-web-vitals",
"next/typescript"
]
}
70 changes: 70 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# Copilot 지침 (AI 코딩 에이전트용)

## 개요

이 BSMHub 프로젝트는 Next.js 기반 모노레포이며, 학교 학생들의 포트폴리오, 프로젝트를 전시하는 온라인 공간입니다. TypeScript, Tailwind CSS, PNPM 워크스페이스를 사용합니다. UI 컴포넌트, 페이지, 서비스, 유틸리티가 명확하게 분리되어 있습니다.

## 아키텍처 및 주요 패턴

- **앱 디렉터리 구조**: 주요 페이지와 레이아웃은 `src/app/`에 위치하며, 파일 기반 라우팅(`page.tsx`, `route.ts`)을 사용합니다.
- **컴포넌트**: UI 컴포넌트는 도메인별(`card/`, `modal/`, `layout/` 등)로 그룹화되어 있고, 여러 페이지에서 재사용됩니다.
- **서비스**: API/데이터 로직은 `src/app/services/`와 `src/app/mocks/services/`에 있습니다. 실제/모의 데이터 처리는 이곳에서 합니다.
- **유틸리티**: 날짜, 변환, Supabase 관련 함수는 `src/app/utils/`에 위치하며, 전역적으로 import하여 사용합니다.
- **스타일링**: Tailwind CSS는 `tailwind.config.ts`에서 설정하며, 전역 스타일은 `src/app/globals.css`에, 도메인별 스타일은 각 폴더에 있습니다.
- **상태 관리**: 교차 컴포넌트 상태는 React Context(`ModalContext.tsx` 등)로 관리합니다. 외부 상태 라이브러리보다 Context를 우선 사용합니다.
- **네비게이션**: Next.js의 `usePathname`, `useRouter` 훅을 사용하며, `Navigator.tsx`에서 현재 경로 하이라이트 예시를 볼 수 있습니다.

## 개발 워크플로우

- **개발 서버 실행**: `pnpm dev`(또는 `npm/yarn/bun dev`)로 로컬 실행
- **빌드**: `pnpm build`로 프로덕션 빌드
- **포맷팅**: Prettier(`prettier.config.js`) 사용, 커스텀 린트 규칙 없음
- **테스트**: 별도 테스트 설정 없음, 필요시 `src/`에 테스트 추가
- **배포**: 커스텀 CI/CD(`Jenkinsfile`)로 배포

## 코드 작성 원칙 및 스타일

- **DRY(Do not Repeat Yourself)**: 중복 코드를 최대한 피하고, 재사용 가능한 컴포넌트/함수로 분리합니다. 동일한 UI/로직이 반복될 경우 반드시 추상화하여 재사용하세요.
- **YAGNI(You Aren't Gonna Need It)**: 실제로 필요하지 않은 기능이나 복잡한 추상화는 도입하지 않습니다. 당장 요구되는 기능만 구현하고, 불필요한 확장/예상 코드는 작성하지 않습니다.
- **KISS(Keep It Simple, Stupid)**: 복잡한 구조나 과도한 추상화보다, 명확하고 간결한 코드를 우선합니다.
- **일관된 네이밍**: 컴포넌트, 함수, 변수명은 역할이 명확하게 드러나도록 작성하며, 영어로 통일합니다. 예시: `PortfolioCard`, `getProfileDetail`, `mockProjects` 등.
- **폴더/파일 구조**: 도메인별로 폴더를 나누고, 각 폴더 내에서 역할별로 파일을 분리합니다. 예시: `card/`, `modal/`, `services/`, `utils/` 등.
- **스타일 일관성**: Tailwind CSS를 기본으로 사용하며, 커스텀 스타일은 최소화합니다. 전역 스타일은 `globals.css`, 도메인별 스타일은 각 폴더에 위치시킵니다.
- **함수형 컴포넌트**: React 함수형 컴포넌트와 훅을 기본으로 사용합니다. 상태 관리는 Context를 우선 적용하며, 불필요한 외부 라이브러리 사용을 지양합니다.
- **명확한 책임 분리**: UI, 데이터, 유틸리티, 상태 관리 등 각 역할별로 코드를 분리하여, 한 파일/컴포넌트가 여러 책임을 가지지 않도록 합니다.
- **외부 링크**: 새 탭에서 열리도록 `target="_blank"`와, `rel="noopener noreferrer nofollow"` 속성을 추가합니다.
- **접근성 고려**: 시맨틱 HTML 요소 사용, ARIA 속성 추가 등 접근성 향상을 위한 코딩을 지향합니다.
- **예외 처리**: API 호출 및 비동기 작업 시 적절한 에러 처리를 구현하여, 사용자에게 명확한 피드백을 제공합니다.
Always use context7 when I need code generation, setup or configuration steps, or
library/API documentation. This means you should automatically use the Context7 MCP
tools to resolve library id and get library docs without me having to explicitly ask.

## 커뮤니케이션 및 메시지 작성

- **주석, 코드 리뷰, 커밋 메시지, PR 메시지**는 모두 한국어로 작성합니다. 코드 내 설명, 변경 내역, 리뷰 의견 등 모든 커뮤니케이션은 한국어를 사용하세요.

## 관례 및 통합

- **TypeScript**: 모든 신규 코드는 TypeScript로 작성, 각 도메인별 `types.d.ts`에 타입 정의
- **모의 데이터**: 로컬 개발/테스트용 데이터는 `src/app/project/[project_name]/mock-data.json` 및 `src/app/data/mockProjects.ts` 활용
- **외부 서비스**: Supabase 연동은 `src/app/utils/supabase/`의 헬퍼를 사용
- **아이콘**: `@tabler/icons-react`로 통일
- **폰트**: Geist 폰트는 Next.js 폰트 최적화 기능으로 적용

## 예시

- **새 페이지 추가**: `src/app/`에 폴더 생성 후 `page.tsx` 추가
- **새 모달 추가**: `src/app/components/modal/Modal.tsx` 작성 후 `modal/index.ts`에 등록
- **새 서비스 추가**: API 로직은 `src/app/services/`, 모의 데이터는 `src/app/mocks/services/`에 작성

## 참고

- [README.md] 기본 설정 및 워크플로우
- [Jenkinsfile] CI/CD 파이프라인
- [tailwind.config.ts] 스타일 규칙
- [src/app/components/] UI 패턴
- [src/app/services/] 데이터/API 로직

---

관례나 워크플로우가 불명확하다면 유지보수자에게 문의하거나 예시를 요청하세요.
26 changes: 26 additions & 0 deletions .github/workflows/lighthouse.ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: CI
on:
push:
branches: ["develop", "release/v2"]
permissions:
contents: read
jobs:
lighthouseci:
runs-on: ubuntu-latest
env:
NEXT_PUBLIC_SUPABASE_URL: ${{ secrets.NEXT_PUBLIC_SUPABASE_URL }}
NEXT_PUBLIC_SUPABASE_ANON_KEY: ${{ secrets.NEXT_PUBLIC_SUPABASE_ANON_KEY }}
NEXT_PUBLIC_GOOGLE_CLIENT_ID: ${{ secrets.NEXT_PUBLIC_GOOGLE_CLIENT_ID }}
NEXT_PUBLIC_SUPABASE_INTERNAL_URL: ${{ secrets.NEXT_PUBLIC_SUPABASE_URL }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18
- run: npm install && npm install -g @lhci/[email protected] && npm install tsx
- run: npx tsx ./generate-lighthouserc.ts
- run: npm run build
- run: npx lhci autorun
env:
LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_GITHUB_APP_TOKEN }}
LHCI_TOKEN: ${{ secrets.LHCI_TOKEN }}
7 changes: 4 additions & 3 deletions .github/workflows/node.js.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ name: Node.js CI

on:
push:
branches: ['develop']
branches: ["develop"]
pull_request:
branches: ['develop']
branches: ["develop"]

jobs:
build:
Expand All @@ -17,6 +17,7 @@ jobs:
NEXT_PUBLIC_SUPABASE_URL: ${{ secrets.NEXT_PUBLIC_SUPABASE_URL }}
NEXT_PUBLIC_SUPABASE_ANON_KEY: ${{ secrets.NEXT_PUBLIC_SUPABASE_ANON_KEY }}
NEXT_PUBLIC_GOOGLE_CLIENT_ID: ${{ secrets.NEXT_PUBLIC_GOOGLE_CLIENT_ID }}
NEXT_PUBLIC_SUPABASE_INTERNAL_URL: ${{ secrets.NEXT_PUBLIC_SUPABASE_URL }}

strategy:
matrix:
Expand All @@ -28,7 +29,7 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
cache: "npm"
- run: npm ci
- run: npm install --platform=linuxmusl --arch=x64 sharp
- run: npm run build
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,15 @@ yarn-error.log*
# typescript
*.tsbuildinfo
next-env.d.ts

#local file
*.local

# lighthouse ci
.lighthouseci/
.lighthouserc.json

# storybook
storybook-static
# Sentry Config File
.env.sentry-build-plugin
1 change: 0 additions & 1 deletion .husky/pre-commit

This file was deleted.

8 changes: 8 additions & 0 deletions .vscode/mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"servers": {
"Sentry": {
"url": "https://mcp.sentry.dev/mcp/junho-lee-r0/javascript-nextjs",
"type": "http"
}
}
}
12 changes: 7 additions & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
# Build Stage
FROM node:23-alpine AS builder
WORKDIR /app
RUN apk add --no-cache vips-dev
COPY package*.json ./
RUN npm ci
RUN npm install --platform=linuxmusl --arch=x64 sharp
RUN npm install -g pnpm
RUN apk add --no-cache vips-dev git
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
# RUN npm_config_platform=linuxmusl npm_config_arch=x64 pnpm add sharp
COPY . .
RUN npm run build
RUN --mount=type=cache,target=/app/.next/cache \
pnpm run build

# Production Stage
FROM node:23-alpine AS runner
Expand Down
145 changes: 119 additions & 26 deletions Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,66 @@ pipeline {
IMAGE_NAME = 'bsmhub'
SUPABASE_KEY = credentials('NEXT_PUBLIC_SUPABASE_ANON_KEY')
GOOGLE_CLIENT = credentials('NEXT_PUBLIC_GOOGLE_CLIENT_ID')
NEXT_PUBLIC_SUPABASE_URL = 'https://bsmhubsp.obtuse.kr'
CONTAINER_NAME = "bsmhub-${env.BRANCH_NAME}"
DEPLOY_SERVER = '10.3.0.127'
NEXT_PUBLIC_SUPABASE_URL = 'https://bsmhubsp.insert.team'
NEXT_PUBLIC_SUPABASE_INTERNAL_URL = 'http://10.59.0.103:8000'
DEPLOY_SERVER = '10.59.0.106'
DEPLOY_CREDS = credentials('DEPLOY_SERVER_CREDS')
REPO_OWNER = 'insert-intern-24'
REPO_NAME = 'bsmhub'
GITHUB_APP = credentials('GITHUB_APP_CREDENTIALS')
}
stages {
stage('Find Available Port') {
stage('Setup Names and Port') {
steps {
script {
PORT = sh(script: '''
for port in $(seq 4000 4999); do
if ! netstat -tna | grep -q ":$port "; then
echo "$port"
exit 0
fi
done
echo "4000" # Fallback port if none found
''', returnStdout: true).trim()
if (env.CHANGE_ID != null) {
// PR인 경우: PR-숫자 형식 사용
CONTAINER_NAME = "bsmhub-PR-${env.CHANGE_ID}"
IMAGE_TAG = "${env.REGISTRY}/${env.IMAGE_NAME}:PR-${env.CHANGE_ID}"

echo "Found port: ${PORT}"
// PR 번호를 기반으로 포트 계산 (4000 + PR번호)
def prNumber = env.CHANGE_ID as Integer
PORT = (4000 + (prNumber % 1000)).toString()
echo "PR #${env.CHANGE_ID} deployment:"
echo " Container: ${CONTAINER_NAME}"
echo " Image: ${IMAGE_TAG}"
echo " Port: ${PORT} (fixed)"

// 기존 컨테이너가 해당 포트를 사용 중인지 확인
def existingContainer = sh(script: "docker ps -q -f name=${CONTAINER_NAME}", returnStdout: true).trim()
if (existingContainer) {
echo '✅ Found existing container - will be replaced'
} else {
echo 'ℹ️ No existing container found - will create new one'
}
} else {
// 일반 브랜치인 경우: 브랜치명 정규화 후 사용
def normalizedBranch = env.BRANCH_NAME
.replaceAll('/', '-')
.replaceAll('[^a-zA-Z0-9._-]', '')
.toLowerCase()
.take(128)

CONTAINER_NAME = "bsmhub-${normalizedBranch}"
IMAGE_TAG = "${env.REGISTRY}/${env.IMAGE_NAME}:${normalizedBranch}"

// 사용 가능한 포트 찾기
PORT = sh(script: '''
for port in $(seq 4000 4999); do
if ! netstat -tna | grep -q ":$port "; then
echo "$port"
exit 0
fi
done
echo "4000" # Fallback port if none found
''', returnStdout: true).trim()

echo "Branch '${env.BRANCH_NAME}' deployment:"
echo " Normalized: ${normalizedBranch}"
echo " Container: ${CONTAINER_NAME}"
echo " Image: ${IMAGE_TAG}"
echo " Port: ${PORT} (available)"
}
}
}
}
Expand All @@ -39,22 +76,25 @@ pipeline {
NEXT_PUBLIC_SUPABASE_ANON_KEY=${SUPABASE_KEY}
NEXT_PUBLIC_GOOGLE_CLIENT_ID=${GOOGLE_CLIENT}
NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL}
NEXT_PUBLIC_SUPABASE_INTERNAL_URL=${NEXT_PUBLIC_SUPABASE_INTERNAL_URL}
NEXT_PUBLIC_SITE_URL=http://${DEPLOY_SERVER}:${PORT}
""".stripIndent()
sh 'cat .env.local'
}
}
}

stage('PR Preview') {
stage('PR Preview Comment') {
when {
expression { env.CHANGE_ID != null } // PR인 경우에만 실행
expression {
env.CHANGE_ID != null
}
}
steps {
script {
def comment = """🚀 배포 준비중
|
| 예상포트 : `${PORT}`
| 고정포트 : `${PORT}` (PR #${env.CHANGE_ID} 전용)
|""".stripMargin()
def payload = groovy.json.JsonOutput.toJson([body: comment])
sh """
Expand All @@ -71,38 +111,91 @@ pipeline {
stage('Build and Push Docker Image') {
steps {
script {
def imageTag = "${env.REGISTRY}/${env.IMAGE_NAME}:${env.BRANCH_NAME}"
sh "docker build -t ${imageTag} ."
echo "Building Docker image: ${IMAGE_TAG}"
sh "DOCKER_BUILDKIT=1 docker build -t ${IMAGE_TAG} ."
echo '✅ Docker image built successfully'

// PR이 아닌 경우 빌드 확인만 하고 종료
if (env.CHANGE_ID == null) {
echo 'ℹ️ Non-PR branch detected - skipping deployment'
echo '✅ Build verification completed successfully'
}
}
}
}

stage('Deploy to Remote Server') {
stage('Stop and Remove Existing Container') {
when {
expression {
env.CHANGE_ID != null
}
}
steps {
script {
def imageTag = "${env.REGISTRY}/${env.IMAGE_NAME}:${env.BRANCH_NAME}"
echo "Checking for existing container: ${CONTAINER_NAME}"
def existingContainer = sh(script: "docker ps -aq -f name=${CONTAINER_NAME}", returnStdout: true).trim()

if (existingContainer) {
echo "Found existing container: ${existingContainer}"
echo "Stopping and removing container: ${CONTAINER_NAME}"
sh """
docker stop ${CONTAINER_NAME} || true
docker rm ${CONTAINER_NAME} || true
"""
echo 'Successfully removed existing container'
} else {
echo "No existing container found with name: ${CONTAINER_NAME}"
}
}
}
}

stage('Deploy New Container') {
when {
expression {
env.CHANGE_ID != null
}
}
steps {
script {
echo "Deploying new container: ${CONTAINER_NAME} on port ${PORT}"
echo "Using image: ${IMAGE_TAG}"
sh """
docker rm -f ${env.CONTAINER_NAME} || true
docker run -d \\
--name ${env.CONTAINER_NAME} \\
--name ${CONTAINER_NAME} \\
-p ${PORT}:3000 \\
--restart unless-stopped \\
--env-file .env.local \\
${imageTag}
${IMAGE_TAG}
"""

// 컨테이너가 정상적으로 시작되었는지 확인
sh """
sleep 3
if docker ps | grep -q ${CONTAINER_NAME}; then
echo "✅ Container ${CONTAINER_NAME} is running successfully"
else
echo "❌ Container ${CONTAINER_NAME} failed to start"
docker logs ${CONTAINER_NAME}
exit 1
fi
"""
}
}
}

stage('Update PR') {
stage('Update PR Comment') {
when {
expression { env.CHANGE_ID != null } // PR인 경우에만 실행
expression {
env.CHANGE_ID != null
}
}
steps {
script {
def comment = """🚀 배포 완료!
|
|✨ 개발서버 프리뷰: http://${env.DEPLOY_SERVER}:${PORT}
|📌 고정포트: `${PORT}` (PR #${env.CHANGE_ID} 전용)
|
| Cloudflare WARP VPN을 통한 내부망 접근 필수, Google One Tab Login 사용 불가능
|""".stripMargin()
Expand Down
Loading
Loading