-
Notifications
You must be signed in to change notification settings - Fork 0
DEV -> PROD #25
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
DEV -> PROD #25
Changes from all commits
08027d8
88f72a4
fa457ec
c9b6c8a
26de5bc
a4e928a
35a70d0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,72 @@ | ||
| # ========================= | ||
| # CodeRabbit Configuration (Frontend Repository) | ||
| # ========================= | ||
| language: ko | ||
|
|
||
| reviews: | ||
| auto_review: | ||
| enabled: true | ||
|
|
||
| # 모든 base/target 브랜치에서 자동 리뷰 수행 (정규식) | ||
| base_branches: | ||
| - ".*" | ||
|
|
||
| instructions: | | ||
| 이 저장소는 프론트엔드 저장소지만, 백엔드/안드로이드 팀원이 함께 작업할 수 있다. | ||
| 프론트엔드 숙련도가 낮을 수 있음을 전제로 하여, | ||
| 문제가 되는 부분이 있다면 단정적으로 지적하지 말고 | ||
| 왜 문제가 될 수 있는지와 맥락을 함께 설명한다. | ||
|
|
||
| 모든 리뷰 코멘트, 제안, 요약은 반드시 한국어로 작성한다. | ||
|
|
||
| 리뷰 범위 및 수준(큰그림 중심): | ||
| - 변수명, 함수명, 포맷팅, 사소한 코드 스타일은 리뷰하지 않는다. | ||
| - 다음 항목을 우선적으로 검토한다: | ||
| 1) 기존에 이미 존재하는 컴포넌트/훅/유틸이 있는데 새로 만들어 중복이 발생했는지 | ||
| 2) 컴포넌트 책임 분리가 부적절하거나 설계가 어색한지 | ||
| (과도한 props drilling, 상태 위치 부적절, 비대해진 컴포넌트 등) | ||
| 3) 화면 흐름, 상태 관리, 데이터 패칭, 에러/로딩 처리의 구조가 일관적인지 | ||
| 4) 성능, 접근성, 모바일 대응에 구조적으로 문제가 될 소지가 있는지 | ||
| 5) 보안, 권한, 민감 정보 노출 가능성이 있는지 | ||
|
|
||
| 장점/단점 및 트레이드오프 분석: | ||
| - 변경된 설계나 구현에 대해 반드시 장점과 단점을 모두 설명한다. | ||
| - 해당 선택이 어떤 트레이드오프를 가지는지 명확히 서술한다. | ||
| - 아래 사항을 질문 형태로 포함할 수 있다: | ||
| - 이 선택이 의도된 트레이드오프인지? | ||
| - 다른 대안과 비교해 현재 방식을 선택한 이유가 있는지? | ||
| - 특별한 이유 없이 선택된 구현이라면 개선 여지가 있는지? | ||
|
|
||
| 이슈 및 PR 의도 반영: | ||
| - PR 설명, 이슈, 커밋 메시지에 드러난 의도를 우선적으로 반영한다. | ||
| - 명시된 의도가 없을 경우, 코드만 보고 추론한 의도를 명확히 밝힌 후 리뷰한다. | ||
| - 구현이 의도를 충분히 충족하는지 여부를 기준으로 평가한다. | ||
|
|
||
| DEV -> PROD PR(릴리즈 PR) 리뷰 규칙: | ||
| - 배포 리스크, 장애 가능성, 사용자 영향이 큰 문제 위주로만 리뷰한다. | ||
| - 사소한 구조 개선이나 리팩터링 제안은 생략한다. | ||
| - 심각한 문제가 없다면 승인 또는 칭찬 위주의 짧은 리뷰로 마무리한다. | ||
|
|
||
| 리뷰 출력 형식(항상 포함): | ||
| 1) [작업 요약] | ||
| - 코드만 보고 이번 PR에서 수행된 작업을 3~7개 불릿으로 정리한다. | ||
| - 단순 나열이 아닌, 기능/구조 단위로 요약한다. | ||
|
|
||
| 2) [의도/목표] | ||
| - PR에서 달성하려는 의도를 정리한다. | ||
| - 명시된 의도 + 코드 기반 추론을 함께 포함한다. | ||
|
|
||
| 3) [설계 평가] | ||
| - 선택된 설계/구현의 장점과 단점을 모두 정리한다. | ||
| - 트레이드오프 관점에서 평가한다. | ||
|
|
||
| 4) [주요 리뷰] | ||
| - 큰그림 기준의 중요한 이슈만 다룬다. | ||
| - 각 항목은 다음 구조를 따른다: | ||
| - 문제 또는 관찰 사항 | ||
| - 영향 범위 | ||
| - 가능한 대안 또는 개선 방향 | ||
|
|
||
| 5) [릴리즈 PR인 경우] | ||
| - 심각한 문제 존재 여부 | ||
| - 문제가 없다면 승인 또는 긍정적 피드백으로 마무리한다. | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -5,6 +5,9 @@ on: | |
| branches: [prod] | ||
| workflow_dispatch: | ||
|
|
||
| permissions: | ||
| id-token: write | ||
|
Comment on lines
+8
to
+9
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add When you specify an explicit 🔎 Proposed fix permissions:
id-token: write
+ contents: read🤖 Prompt for AI Agents |
||
|
|
||
| jobs: | ||
| build-and-deploy: | ||
| runs-on: ubuntu-latest | ||
|
|
@@ -31,8 +34,8 @@ jobs: | |
| - name: Configure AWS credentials | ||
| uses: aws-actions/configure-aws-credentials@v4 | ||
| with: | ||
| aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} | ||
| aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | ||
| role-session-name: frontend-prod-council-deploy | ||
| role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} | ||
|
Comment on lines
+37
to
+38
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: cat -n .github/workflows/prod-cicd.ymlRepository: festabook/frontend Length of output: 1650 Excellent security improvement with OIDC authentication. The workflow correctly implements OIDC on the GitHub Actions side with the Before merging, verify the AWS infrastructure is configured:
🤖 Prompt for AI Agents |
||
| aws-region: ${{ secrets.AWS_REGION }} | ||
|
|
||
| - name: Upload build files to S3 | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -2,6 +2,7 @@ import React, { useState, useEffect, useCallback } from 'react'; | |||||||||||||||||||||||||||||
| import Modal from '../common/Modal'; | ||||||||||||||||||||||||||||||
| import AddImageModal from './AddImageModal'; | ||||||||||||||||||||||||||||||
| import { festivalAPI } from '../../utils/api'; | ||||||||||||||||||||||||||||||
| import { useIsMobile } from '../layout/UseIsMobile'; | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| const FestivalImagesModal = ({ isOpen, onClose, festival, showToast, onUpdate }) => { | ||||||||||||||||||||||||||||||
| const [selectedImage, setSelectedImage] = useState(null); | ||||||||||||||||||||||||||||||
|
|
@@ -11,6 +12,7 @@ const FestivalImagesModal = ({ isOpen, onClose, festival, showToast, onUpdate }) | |||||||||||||||||||||||||||||
| const [draggedItem, setDraggedItem] = useState(null); | ||||||||||||||||||||||||||||||
| const [selectedImageToDelete, setSelectedImageToDelete] = useState(null); | ||||||||||||||||||||||||||||||
| const [showAddImageModal, setShowAddImageModal] = useState(false); | ||||||||||||||||||||||||||||||
| const isMobile = useIsMobile(); | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| const handleCancelMode = useCallback(() => { | ||||||||||||||||||||||||||||||
| setIsReorderMode(false); | ||||||||||||||||||||||||||||||
|
|
@@ -193,11 +195,16 @@ const FestivalImagesModal = ({ isOpen, onClose, festival, showToast, onUpdate }) | |||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| return ( | ||||||||||||||||||||||||||||||
| <Modal isOpen={isOpen} onClose={onClose} maxWidth="max-w-7xl"> | ||||||||||||||||||||||||||||||
| <div className="p-6"> | ||||||||||||||||||||||||||||||
| <div className="flex justify-between items-center mb-6"> | ||||||||||||||||||||||||||||||
| <h2 className="text-2xl font-bold text-gray-900">축제 이미지 관리</h2> | ||||||||||||||||||||||||||||||
| <div className="flex space-x-2"> | ||||||||||||||||||||||||||||||
| <Modal | ||||||||||||||||||||||||||||||
| isOpen={isOpen} | ||||||||||||||||||||||||||||||
| onClose={onClose} | ||||||||||||||||||||||||||||||
| maxWidth={isMobile ? 'w-[92vw] max-w-[420px]' : 'max-w-7xl'} | ||||||||||||||||||||||||||||||
| enableMobileLayout={true} | ||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||
| <div className={`${isMobile ? 'p-4 max-h-[70vh] overflow-y-auto' : 'p-6 h-[800px]'} flex flex-col`}> | ||||||||||||||||||||||||||||||
|
Comment on lines
+198
to
+204
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: find . -name "FestivalImagesModal.jsx" -type fRepository: festabook/frontend Length of output: 109 🏁 Script executed: cat -n ./src/components/modals/FestivalImagesModal.jsx | sed -n '190,215p'Repository: festabook/frontend Length of output: 1456 🏁 Script executed: find . -name "Modal.jsx" -o -name "Modal.js" -o -name "Modal.tsx" -o -name "Modal.ts" | head -20Repository: festabook/frontend Length of output: 95 🏁 Script executed: cat -n ./src/components/common/Modal.jsxRepository: festabook/frontend Length of output: 4018 🏁 Script executed: find . -name "PlaceImagesModal.jsx" -o -name "LostItemModal.jsx" -o -name "LostItemGuideModal.jsx"Repository: festabook/frontend Length of output: 195 🏁 Script executed: cat -n ./src/components/modals/PlaceImagesModal.jsx | head -100Repository: festabook/frontend Length of output: 4561 🏁 Script executed: cat -n ./src/components/modals/PlaceImagesModal.jsx | grep -A 15 "return ("Repository: festabook/frontend Length of output: 2883 🏁 Script executed: cat -n ./src/components/modals/LostItemModal.jsx | grep -A 15 "return ("Repository: festabook/frontend Length of output: 1555 🏁 Script executed: cat -n ./src/components/modals/LostItemGuideModal.jsx | grep -A 15 "return ("Repository: festabook/frontend Length of output: 1051 Remove double padding in FestivalImagesModal inner div. The Modal component with <Modal
isOpen={isOpen}
onClose={onClose}
maxWidth={isMobile ? 'w-[92vw] max-w-[420px]' : 'max-w-7xl'}
enableMobileLayout={true}
>
- <div className={`${isMobile ? 'p-4 max-h-[70vh] overflow-y-auto' : 'p-6 h-[800px]'} flex flex-col`}>
+ <div className={`${isMobile ? 'max-h-[70vh] overflow-y-auto' : 'h-[800px]'} flex flex-col`}>Additionally, the 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||
| <div className={`flex ${isMobile ? 'flex-col gap-3 items-start' : 'justify-between items-center mb-6'}`}> | ||||||||||||||||||||||||||||||
| <h2 className={`${isMobile ? 'text-xl' : 'text-2xl'} font-bold text-gray-900`}>축제 이미지 관리</h2> | ||||||||||||||||||||||||||||||
| <div className={isMobile ? 'grid grid-cols-2 gap-2 w-full' : 'flex space-x-2'}> | ||||||||||||||||||||||||||||||
| {!isReorderMode && !isDeleteMode && ( | ||||||||||||||||||||||||||||||
| <> | ||||||||||||||||||||||||||||||
| <button | ||||||||||||||||||||||||||||||
|
|
@@ -251,7 +258,7 @@ const FestivalImagesModal = ({ isOpen, onClose, festival, showToast, onUpdate }) | |||||||||||||||||||||||||||||
| )} | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| {images && images.length > 0 ? ( | ||||||||||||||||||||||||||||||
| <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4 max-h-[600px] overflow-y-auto"> | ||||||||||||||||||||||||||||||
| <div className={`grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4 flex-1 overflow-y-auto ${isMobile ? 'mt-4' : ''}`}> | ||||||||||||||||||||||||||||||
| {images.map((image, index) => { | ||||||||||||||||||||||||||||||
| const imageId = image.festivalImageId || image.id || `temp-${index}`; | ||||||||||||||||||||||||||||||
| return ( | ||||||||||||||||||||||||||||||
|
|
@@ -366,14 +373,16 @@ const FestivalImagesModal = ({ isOpen, onClose, festival, showToast, onUpdate }) | |||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||
| )} | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| <div className="flex justify-end mt-6"> | ||||||||||||||||||||||||||||||
| <button | ||||||||||||||||||||||||||||||
| onClick={onClose} | ||||||||||||||||||||||||||||||
| className="bg-gray-300 text-gray-700 px-4 py-2 rounded-lg hover:bg-gray-400 transition-colors" | ||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||
| 닫기 | ||||||||||||||||||||||||||||||
| </button> | ||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||
| {!isReorderMode && !isDeleteMode && ( | ||||||||||||||||||||||||||||||
| <div className={`mt-auto pt-6 ${isMobile ? 'flex flex-col gap-3' : 'flex justify-end space-x-3'}`}> | ||||||||||||||||||||||||||||||
| <button | ||||||||||||||||||||||||||||||
| onClick={onClose} | ||||||||||||||||||||||||||||||
| className={`${isMobile ? 'w-full' : ''} bg-gray-300 text-gray-700 font-bold py-2 px-4 rounded-lg hover:bg-gray-400 transition-all duration-200`} | ||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||
| 닫기 | ||||||||||||||||||||||||||||||
| </button> | ||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||
| )} | ||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| {/* 새 이미지 추가 모달 (중첩) */} | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
커밋 메시지와 실제 설정의 불일치
커밋 메시지에는 "Fix: removed auto_review"라고 명시되어 있지만, 실제 설정 파일에서는
auto_review.enabled가true로 설정되어 있습니다.배포 전에 의도를 명확히 할 필요가 있습니다:
enabled: false로 변경해야 합니다🤖 Prompt for AI Agents