Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
name: 🐛 버그 리포트
about: 버그를 발견했을 때 사용해주세요
title: '[BUG] '
labels: bug
assignees: ''
---

# 🐛 개요
여기에 작업해주세요.

## 🔍 상세 버그 내용

### 📝 버그 설명 1
- [ ] 어떤 상황에서 발생하는지
- [ ] 어떤 오류가 나타나는지
- [ ] 예상과 다른 동작은 무엇인지

### 📝 재현 방법
- [ ] 1. 특정 페이지로 이동
- [ ] 2. 특정 버튼 클릭
- [ ] 3. 오류 발생 확인

## 📄 더 꼼꼼히 확인할 부분

- [ ] 브라우저 콘솔 에러 메시지
- [ ] 네트워크 요청 상태
- [ ] 로그 파일 내용

## 💻 환경 정보

- [ ] OS: [예: Windows 11]
- [ ] 브라우저: [예: Chrome 118]
- [ ] 버전: [예: v1.0.0]
- [ ] 기기: [예: Desktop/Mobile]
34 changes: 34 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
name: ✨ 기능 요청
about: 새로운 기능을 제안할 때 사용해주세요
title: '[FEATURE] '
labels: enhancement
assignees: ''
---

# ✨ 개요
여기에 작업해주세요.

## 💡 상세 기능 내용

### 📝 기능 설명 1
- [ ] 어떤 기능인지 설명
- [ ] 왜 필요한지 이유
- [ ] 어떻게 동작해야 하는지

### 📝 사용자 시나리오
- [ ] 1. 사용자가 어떤 상황에서
- [ ] 2. 이 기능을 사용하게 되고
- [ ] 3. 어떤 결과를 얻는지

## 📄 더 꼼꼼히 확인할 부분

- [ ] 기존 기능과의 호환성
- [ ] 성능에 미치는 영향
- [ ] 보안 고려사항

## 🎯 대안 및 참고사항

- [ ] 고려해본 다른 해결책
- [ ] 비슷한 기능을 가진 다른 서비스
- [ ] 참고할 만한 자료나 링크
39 changes: 39 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
## 개요
<!---- 변경 사항 및 관련 이슈에 대해 간단하게 작성해주세요. 어떻게보다 무엇을 왜 수정했는지 설명해주세요. -->

> GitHub 개발 워크플로우를 체계화하고 자동화하기 위한 템플릿과 CI/CD 시스템을 구축했습니다.
> 효율적인 협업과 코드 품질 관리를 위해 이슈 관리, PR 검토, 릴리즈 과정을 자동화했습니다.

## PR 유형
어떤 변경 사항이 있나요?

- [x] 새로운 기능 추가
- [ ] 버그 수정
- [ ] CSS 등 사용자 UI 디자인 변경
- [x] 코드에 영향을 주지 않는 변경사항(오타 수정, 탭 사이즈 변경, 변수명 변경)
- [ ] 코드 리팩토링
- [x] 주석 추가 및 수정
- [x] 문서 수정
- [x] 파일 혹은 폴더명 수정
- [x] 파일 혹은 폴더 삭제

## 작업 상세 내용

### 🚀 새로 추가된 기능
1. **GitHub Actions 워크플로우 구축**
- `ci-cd.yml`: 코드 품질 검사, 테스트, 자동 배포
- `pr-review.yml`: PR 자동 검토 및 라벨링
- `issue-management.yml`: 이슈 자동 관리 및 응답
- `release.yml`: 릴리즈 자동화 및 변경사항 생성

2. **체계적인 템플릿 시스템**
- 버그 리포트 템플릿 (`bug_report.md`)
- 기능 요청 템플릿 (`feature_request.md`)
- PR 템플릿 개선 (체크리스트 및 구조화)

3. **자동화 기능**
- 이슈/PR 자동 라벨링
- 커밋 규칙 검증
- 보안 검사 (하드코딩된 시크릿 탐지)
- 코드 품질 검사 (Black, isort, Flake8)

33 changes: 33 additions & 0 deletions .github/template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# 🚀 개요
여기에 작업해주세요.

## ⏰ 작업 상세 내용

### 📝 작업 내용 1
- [ ] 첫 번째 작업 내용
- [ ] 두 번째 작업 내용
- [ ] 세 번째 작업 내용

### � 작업 내용 2
- [ ] 첫 번째 작업 내용
- [ ] 두 번째 작업 내용
- [ ] 세 번째 작업 내용

## 📄 더 꼼꼼히 확인할 부분

- [ ] 없을 경우 체크

## 🔍 반드시 참고해야하는 변경 사항

- [ ] 없을 경우 체크

## 🔗 관련 이슈
- Closes #(이슈 번호)
- Related to #(이슈 번호)

## ✅ 최종 체크리스트
- [ ] 코드가 정상적으로 동작합니다
- [ ] 테스트를 작성하고 통과했습니다
- [ ] 코드 리뷰를 요청했습니다
- [ ] 문서를 업데이트했습니다
- [ ] 브레이킹 체인지가 있다면 명시했습니다
93 changes: 93 additions & 0 deletions .github/workflows/ci-cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
name: 🚀 CI/CD Pipeline

on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]

jobs:
# 📝 코드 품질 검사
code-quality:
name: ✅ 코드 품질 검사
runs-on: ubuntu-latest

steps:
- name: 📥 코드 체크아웃
uses: actions/checkout@v4

- name: 🐍 Python 환경 설정
uses: actions/setup-python@v4
with:
python-version: '3.11'

- name: 📦 의존성 설치
run: |
python -m pip install --upgrade pip
pip install flake8 black isort
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi

- name: 🎨 코드 포맷팅 검사 (Black)
run: black --check .

- name: 📐 Import 정렬 검사 (isort)
run: isort --check-only .

- name: 🔍 코드 스타일 검사 (Flake8)
run: flake8 .

# 🧪 테스트 실행
test:
name: 🧪 테스트 실행
runs-on: ubuntu-latest
needs: code-quality

strategy:
matrix:
python-version: ['3.9', '3.10', '3.11']

steps:
- name: 📥 코드 체크아웃
uses: actions/checkout@v4

- name: 🐍 Python ${{ matrix.python-version }} 설정
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}

- name: 📦 의존성 설치
run: |
python -m pip install --upgrade pip
pip install pytest pytest-cov
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi

- name: 🧪 테스트 실행
run: |
pytest --cov=. --cov-report=xml

- name: 📊 코드 커버리지 업로드
uses: codecov/codecov-action@v3
with:
file: ./coverage.xml
flags: unittests
name: codecov-umbrella

# 🚀 배포 (main 브랜치만)
deploy:
name: 🚀 배포
runs-on: ubuntu-latest
needs: [code-quality, test]
if: github.ref == 'refs/heads/main' && github.event_name == 'push'

steps:
- name: 📥 코드 체크아웃
uses: actions/checkout@v4

- name: 🚀 배포 준비
run: |
echo "배포 준비 중..."
# 여기에 실제 배포 로직 추가

- name: ✅ 배포 완료 알림
run: |
echo "배포가 완료되었습니다! 🎉"
114 changes: 114 additions & 0 deletions .github/workflows/issue-management.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
name: 📋 이슈 관리

on:
issues:
types: [opened, labeled, assigned]
issue_comment:
types: [created]

jobs:
# 🎯 이슈 자동 처리
issue-automation:
name: 🎯 이슈 자동 처리
runs-on: ubuntu-latest

steps:
- name: 🏷️ 새 이슈 자동 라벨링
if: github.event.action == 'opened'
uses: actions/github-script@v6
with:
script: |
const issue = context.payload.issue;
const title = issue.title.toLowerCase();
const body = issue.body.toLowerCase();

const labels = ['triage'];

// 제목 기반 라벨링
if (title.includes('[bug]') || body.includes('bug') || body.includes('error')) {
labels.push('bug');
}
if (title.includes('[feature]') || body.includes('feature') || body.includes('enhancement')) {
labels.push('enhancement');
}
if (title.includes('[docs]') || body.includes('documentation')) {
labels.push('documentation');
}

// 우선순위 라벨링
if (body.includes('urgent') || body.includes('critical')) {
labels.push('priority-high');
} else if (body.includes('important')) {
labels.push('priority-medium');
} else {
labels.push('priority-low');
}

await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
labels: labels
});

- name: 🤖 이슈 응답 자동화
if: github.event.action == 'opened'
uses: actions/github-script@v6
with:
script: |
const issue = context.payload.issue;

let response = `👋 안녕하세요! 이슈를 등록해주셔서 감사합니다.\n\n`;

if (issue.title.includes('[BUG]')) {
response += `🐛 **버그 리포트**\n`;
response += `- 재현 방법을 자세히 기록해주세요\n`;
response += `- 환경 정보를 명시해주세요\n`;
response += `- 스크린샷이나 로그가 있다면 첨부해주세요\n\n`;
} else if (issue.title.includes('[FEATURE]')) {
response += `✨ **기능 요청**\n`;
response += `- 어떤 문제를 해결하려는지 설명해주세요\n`;
response += `- 예상되는 사용자 시나리오를 공유해주세요\n`;
response += `- 구현 우선순위를 고려해서 검토하겠습니다\n\n`;
}

response += `⏰ **처리 예상 시간**\n`;
response += `- 검토: 1-2일 이내\n`;
response += `- 답변: 3-5일 이내\n\n`;
response += `🔔 궁금한 점이 있으시면 언제든 댓글로 문의해주세요!`;

await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: response
});

# 📊 이슈 통계
issue-stats:
name: 📊 이슈 통계 업데이트
runs-on: ubuntu-latest
if: github.event.action == 'opened' || github.event.action == 'closed'

steps:
- name: 📈 이슈 통계 계산
uses: actions/github-script@v6
with:
script: |
const { data: issues } = await github.rest.issues.listForRepo({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'all',
per_page: 100
});

const openIssues = issues.filter(issue => issue.state === 'open' && !issue.pull_request).length;
const closedIssues = issues.filter(issue => issue.state === 'closed' && !issue.pull_request).length;
const bugIssues = issues.filter(issue => issue.labels.some(label => label.name === 'bug')).length;
const featureIssues = issues.filter(issue => issue.labels.some(label => label.name === 'enhancement')).length;

console.log(`📊 이슈 현황:`);
console.log(`🔓 열린 이슈: ${openIssues}개`);
console.log(`✅ 닫힌 이슈: ${closedIssues}개`);
console.log(`🐛 버그: ${bugIssues}개`);
console.log(`✨ 기능 요청: ${featureIssues}개`);
Loading
Loading