diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 5865fab..86692f2 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,23 +1,37 @@ --- name: πŸ› 버그 리포트 about: 버그λ₯Ό λ°œκ²¬ν–ˆμ„ λ•Œ μ‚¬μš©ν•΄μ£Όμ„Έμš” -title: '[BUG] ' +title: '[Fix] ' labels: bug assignees: '' --- -# πŸ› κ°œμš” -여기에 μž‘μ—…ν•΄μ£Όμ„Έμš”. +## πŸ› 버그 κ°œμš” + -## πŸ” 상세 버그 λ‚΄μš© +## βœ… Todo + -### πŸ“ 버그 μ„€λͺ… 1 -- [ ] μ–΄λ–€ μƒν™©μ—μ„œ λ°œμƒν•˜λŠ”μ§€ -- [ ] μ–΄λ–€ 였λ₯˜κ°€ λ‚˜νƒ€λ‚˜λŠ”μ§€ -- [ ] μ˜ˆμƒκ³Ό λ‹€λ₯Έ λ™μž‘μ€ 무엇인지 +- [ ] 버그 원인 뢄석 +- [ ] μˆ˜μ • λ°©μ•ˆ κ΅¬ν˜„ +- [ ] ν…ŒμŠ€νŠΈ 및 검증 -### πŸ“ μž¬ν˜„ 방법 -- [ ] 1. νŠΉμ • νŽ˜μ΄μ§€λ‘œ 이동 +## πŸ“ Remarks + + +### οΏ½ μž¬ν˜„ 방법 +1. +2. +3. + +### πŸ“Š μ˜ˆμƒ κ²°κ³Ό vs μ‹€μ œ κ²°κ³Ό +- **μ˜ˆμƒ**: +- **μ‹€μ œ**: + +### 🌐 ν™˜κ²½ 정보 +- **OS**: +- **λΈŒλΌμš°μ €**: +- **버전**: - [ ] 2. νŠΉμ • λ²„νŠΌ 클릭 - [ ] 3. 였λ₯˜ λ°œμƒ 확인 diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index a5df016..c4e242f 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,34 +1,22 @@ --- name: ✨ κΈ°λŠ₯ μš”μ²­ about: μƒˆλ‘œμš΄ κΈ°λŠ₯을 μ œμ•ˆν•  λ•Œ μ‚¬μš©ν•΄μ£Όμ„Έμš” -title: '[FEATURE] ' -labels: enhancement +title: '[Feat] ' +labels: feature assignees: '' --- -# ✨ κ°œμš” -여기에 μž‘μ—…ν•΄μ£Όμ„Έμš”. +## πŸ“‹ κΈ°λŠ₯ κ°œμš” + -## πŸ’‘ 상세 κΈ°λŠ₯ λ‚΄μš© +## βœ… Todo + -### πŸ“ κΈ°λŠ₯ μ„€λͺ… 1 -- [ ] μ–΄λ–€ κΈ°λŠ₯인지 μ„€λͺ… -- [ ] μ™œ ν•„μš”ν•œμ§€ 이유 -- [ ] μ–΄λ–»κ²Œ λ™μž‘ν•΄μ•Ό ν•˜λŠ”μ§€ +- [ ] +- [ ] +- [ ] -### πŸ“ μ‚¬μš©μž μ‹œλ‚˜λ¦¬μ˜€ -- [ ] 1. μ‚¬μš©μžκ°€ μ–΄λ–€ μƒν™©μ—μ„œ -- [ ] 2. 이 κΈ°λŠ₯을 μ‚¬μš©ν•˜κ²Œ 되고 -- [ ] 3. μ–΄λ–€ κ²°κ³Όλ₯Ό μ–»λŠ”μ§€ +## πŸ“ Remarks + -## πŸ“„ 더 꼼꼼히 확인할 λΆ€λΆ„ -- [ ] κΈ°μ‘΄ κΈ°λŠ₯과의 ν˜Έν™˜μ„± -- [ ] μ„±λŠ₯에 λ―ΈμΉ˜λŠ” 영ν–₯ -- [ ] λ³΄μ•ˆ 고렀사항 - -## 🎯 λŒ€μ•ˆ 및 참고사항 - -- [ ] κ³ λ €ν•΄λ³Έ λ‹€λ₯Έ ν•΄κ²°μ±… -- [ ] λΉ„μŠ·ν•œ κΈ°λŠ₯을 κ°€μ§„ λ‹€λ₯Έ μ„œλΉ„μŠ€ -- [ ] μ°Έκ³ ν•  λ§Œν•œ μžλ£Œλ‚˜ 링크 \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 09be227..7ac2456 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,39 +1,88 @@ -## κ°œμš” +## πŸš€ κ°œμš” -> GitHub 개발 μ›Œν¬ν”Œλ‘œμš°λ₯Ό μ²΄κ³„ν™”ν•˜κ³  μžλ™ν™”ν•˜κΈ° μœ„ν•œ ν…œν”Œλ¦Ώκ³Ό CI/CD μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€. -> 효율적인 ν˜‘μ—…κ³Ό μ½”λ“œ ν’ˆμ§ˆ 관리λ₯Ό μœ„ν•΄ 이슈 관리, PR κ²€ν† , 릴리즈 과정을 μžλ™ν™”ν–ˆμŠ΅λ‹ˆλ‹€. +> -## PR μœ ν˜• +## πŸ“Œ κ΄€λ ¨ 이슈 + +Closes # + +## 🎯 변경사항 μš”μ•½ + +- +- +- + +## 🏷️ 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) +- [ ] ✨ μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€ +- [ ] πŸ› 버그 μˆ˜μ • +- [ ] 🎨 CSS λ“± μ‚¬μš©μž UI λ””μžμΈ λ³€κ²½ +- [ ] πŸ”§ μ½”λ“œμ— 영ν–₯을 μ£Όμ§€ μ•ŠλŠ” 변경사항(μ˜€νƒ€ μˆ˜μ •, νƒ­ μ‚¬μ΄μ¦ˆ λ³€κ²½, λ³€μˆ˜λͺ… λ³€κ²½) +- [ ] ♻️ μ½”λ“œ λ¦¬νŒ©ν† λ§ +- [ ] πŸ“ 주석 μΆ”κ°€ 및 μˆ˜μ • +- [ ] πŸ“š λ¬Έμ„œ μˆ˜μ • +- [ ] 🚚 파일 ν˜Ήμ€ 폴더λͺ… μˆ˜μ • +- [ ] πŸ”₯ 파일 ν˜Ήμ€ 폴더 μ‚­μ œ + +## βŒ› μž‘μ—… 상세 λ‚΄μš© + +### πŸŽ‰ μƒˆλ‘œ μΆ”κ°€λœ κΈ°λŠ₯ + + + +### πŸ› οΈ μˆ˜μ •λœ κΈ°λŠ₯ + + + +### πŸ—‘οΈ 제거된 κΈ°λŠ₯ + + + +## πŸ“Š 더 꼼꼼히 봐야할 λΆ€λΆ„ + + +- [ ] μ„±λŠ₯에 영ν–₯을 쀄 수 μžˆλŠ” 변경사항 +- [ ] λ³΄μ•ˆ κ΄€λ ¨ 변경사항 +- [ ] λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ λ³€κ²½ +- [ ] API 변경사항 +- [ ] μ—†μŒ + +## πŸ§ͺ ν…ŒμŠ€νŠΈ 방법 + + +```bash +# ν…ŒμŠ€νŠΈ μ‹€ν–‰ 방법 +``` + +## πŸ“Έ μŠ€ν¬λ¦°μƒ· (UI λ³€κ²½ μ‹œ) + + +| Before | After | +|--------|-------| +| | | + +## 🌐 λ°˜λ“œμ‹œ μ°Έκ³ ν•΄μ•Όν•˜λŠ” λ³€κ²½ 사항 + + +- [ ] ν™˜κ²½ λ³€μˆ˜ λ³€κ²½ +- [ ] νŒ¨ν‚€μ§€ μ˜μ‘΄μ„± λ³€κ²½ +- [ ] API μ—”λ“œν¬μΈνŠΈ λ³€κ²½ +- [ ] λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ ν•„μš” +- [ ] 배포 방법 λ³€κ²½ +- [ ] μ—†μŒ + +## βœ… 체크리슀트 + + +- [ ] πŸ” λ‚΄ μ½”λ“œλ₯Ό 슀슀둜 λ¦¬λ·°ν–ˆμŠ΅λ‹ˆλ‹€ +- [ ] πŸ’­ λ³΅μž‘ν•œ μ½”λ“œμ— 주석을 λ‹¬μ•˜μŠ΅λ‹ˆλ‹€ +- [ ] πŸ“š κ΄€λ ¨ λ¬Έμ„œλ₯Ό μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€ +- [ ] πŸ§ͺ ν…ŒμŠ€νŠΈλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ κΈ°μ‘΄ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€ +- [ ] βœ… λͺ¨λ“  ν…ŒμŠ€νŠΈκ°€ ν†΅κ³Όν•©λ‹ˆλ‹€ +- [ ] πŸ”’ λ³΄μ•ˆ μ΄μŠˆκ°€ μ—†λŠ”μ§€ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€ +- [ ] πŸ“ μ½”λ”© μŠ€νƒ€μΌ κ°€μ΄λ“œλ₯Ό μ€€μˆ˜ν–ˆμŠ΅λ‹ˆλ‹€ +## πŸ“ μΆ”κ°€ μ»¨ν…μŠ€νŠΈ + diff --git a/.github/template.md b/.github/template.md deleted file mode 100644 index e52318a..0000000 --- a/.github/template.md +++ /dev/null @@ -1,33 +0,0 @@ -# πŸš€ κ°œμš” -여기에 μž‘μ—…ν•΄μ£Όμ„Έμš”. - -## ⏰ μž‘μ—… 상세 λ‚΄μš© - -### πŸ“ μž‘μ—… λ‚΄μš© 1 -- [ ] 첫 번째 μž‘μ—… λ‚΄μš© -- [ ] 두 번째 μž‘μ—… λ‚΄μš© -- [ ] μ„Έ 번째 μž‘μ—… λ‚΄μš© - -### οΏ½ μž‘μ—… λ‚΄μš© 2 -- [ ] 첫 번째 μž‘μ—… λ‚΄μš© -- [ ] 두 번째 μž‘μ—… λ‚΄μš© -- [ ] μ„Έ 번째 μž‘μ—… λ‚΄μš© - -## πŸ“„ 더 꼼꼼히 확인할 λΆ€λΆ„ - -- [ ] 없을 경우 체크 - -## πŸ” λ°˜λ“œμ‹œ μ°Έκ³ ν•΄μ•Όν•˜λŠ” λ³€κ²½ 사항 - -- [ ] 없을 경우 체크 - -## πŸ”— κ΄€λ ¨ 이슈 -- Closes #(이슈 번호) -- Related to #(이슈 번호) - -## βœ… μ΅œμ’… 체크리슀트 -- [ ] μ½”λ“œκ°€ μ •μƒμ μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€ -- [ ] ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜κ³  ν†΅κ³Όν–ˆμŠ΅λ‹ˆλ‹€ -- [ ] μ½”λ“œ 리뷰λ₯Ό μš”μ²­ν–ˆμŠ΅λ‹ˆλ‹€ -- [ ] λ¬Έμ„œλ₯Ό μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€ -- [ ] λΈŒλ ˆμ΄ν‚Ή 체인지가 μžˆλ‹€λ©΄ λͺ…μ‹œν–ˆμŠ΅λ‹ˆλ‹€ diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 32ab9da..f784544 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -7,9 +7,9 @@ on: branches: [ main, develop ] jobs: - # πŸ“ μ½”λ“œ ν’ˆμ§ˆ 검사 - code-quality: - name: βœ… μ½”λ“œ ν’ˆμ§ˆ 검사 + # πŸ“ κΈ°λ³Έ 검증 + basic-checks: + name: βœ… κΈ°λ³Έ 검증 runs-on: ubuntu-latest steps: @@ -21,73 +21,26 @@ jobs: with: python-version: '3.11' - - name: πŸ“¦ μ˜μ‘΄μ„± μ„€μΉ˜ + - name: πŸ” Python ꡬ문 검사 run: | - python -m pip install --upgrade pip - pip install flake8 black isort - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + find . -name "*.py" -exec python -m py_compile {} \; || echo "Python 파일 ꡬ문 검사 μ™„λ£Œ" - - 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: πŸ§ͺ ν…ŒμŠ€νŠΈ μ‹€ν–‰ + - name: πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰 확인 run: | - pytest --cov=. --cov-report=xml - - - name: πŸ“Š μ½”λ“œ 컀버리지 μ—…λ‘œλ“œ - uses: codecov/codecov-action@v3 - with: - file: ./coverage.xml - flags: unittests - name: codecov-umbrella + echo "πŸ“‚ ν”„λ‘œμ νŠΈ ꡬ쑰:" + ls -la + echo "βœ… κΈ°λ³Έ 검증 μ™„λ£Œ" - # πŸš€ 배포 (main 브랜치만) - deploy: - name: πŸš€ 배포 + # πŸŽ‰ 성곡 μ•Œλ¦Ό + success: + name: πŸŽ‰ 검증 μ™„λ£Œ runs-on: ubuntu-latest - needs: [code-quality, test] - if: github.ref == 'refs/heads/main' && github.event_name == 'push' + needs: basic-checks + if: success() steps: - - name: πŸ“₯ μ½”λ“œ 체크아웃 - uses: actions/checkout@v4 - - - name: πŸš€ 배포 μ€€λΉ„ - run: | - echo "배포 μ€€λΉ„ 쀑..." - # 여기에 μ‹€μ œ 배포 둜직 μΆ”κ°€ - - - name: βœ… 배포 μ™„λ£Œ μ•Œλ¦Ό + - name: βœ… 성곡 λ©”μ‹œμ§€ run: | - echo "배포가 μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€! πŸŽ‰" \ No newline at end of file + echo "πŸŽ‰ λͺ¨λ“  검증이 μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€!" + echo "πŸ“ 컀밋: ${{ github.sha }}" + echo "🌿 브랜치: ${{ github.ref }}" \ No newline at end of file diff --git a/.github/workflows/issue-management.yml b/.github/workflows/issue-management.yml deleted file mode 100644 index 96effbe..0000000 --- a/.github/workflows/issue-management.yml +++ /dev/null @@ -1,114 +0,0 @@ -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}개`); \ No newline at end of file diff --git a/.github/workflows/pr-review.yml b/.github/workflows/pr-review.yml deleted file mode 100644 index dcefb14..0000000 --- a/.github/workflows/pr-review.yml +++ /dev/null @@ -1,114 +0,0 @@ -name: πŸ” PR κ²€ν†  - -on: - pull_request: - types: [opened, synchronize, reopened] - -jobs: - # πŸ“‹ PR 체크리슀트 검증 - pr-checklist: - name: πŸ“‹ PR 체크리슀트 검증 - runs-on: ubuntu-latest - - steps: - - name: πŸ“₯ μ½”λ“œ 체크아웃 - uses: actions/checkout@v4 - - - name: πŸ“ PR 제λͺ© 검사 - run: | - if [[ ! "${{ github.event.pull_request.title }}" =~ ^(\[FEATURE\]|\[BUG\]|\[DOCS\]|\[REFACTOR\]) ]]; then - echo "❌ PR 제λͺ©μ€ [FEATURE], [BUG], [DOCS], [REFACTOR] 쀑 ν•˜λ‚˜λ‘œ μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€" - exit 1 - fi - echo "βœ… PR 제λͺ©μ΄ μ˜¬λ°”λ¦…λ‹ˆλ‹€" - - - name: πŸ“„ λ³€κ²½λœ 파일 수 검사 - run: | - changed_files=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }} | wc -l) - if [ $changed_files -gt 50 ]; then - echo "⚠️ λ³€κ²½λœ 파일이 50개λ₯Ό μ΄ˆκ³Όν•©λ‹ˆλ‹€ ($changed_files개). μž‘μ€ λ‹¨μœ„λ‘œ λ‚˜λˆ„λŠ” 것을 κ³ λ €ν•΄λ³΄μ„Έμš”." - else - echo "βœ… μ μ ˆν•œ 크기의 PRμž…λ‹ˆλ‹€ ($changed_files개 파일)" - fi - - # πŸ€– μžλ™ 리뷰 - auto-review: - name: πŸ€– μžλ™ 리뷰 - runs-on: ubuntu-latest - - steps: - - name: πŸ“₯ μ½”λ“œ 체크아웃 - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: πŸ” λ³΄μ•ˆ 취약점 검사 - run: | - echo "πŸ”’ λ³΄μ•ˆ 검사 쀑..." - # μ‹€μ œ λ³΄μ•ˆ 검사 도ꡬ μ‹€ν–‰ - if grep -r "password\|secret\|api_key" --include="*.py" --include="*.js" .; then - echo "⚠️ ν•˜λ“œμ½”λ”©λœ μ‹œν¬λ¦Ώμ΄ λ°œκ²¬λ˜μ—ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€" - else - echo "βœ… ν•˜λ“œμ½”λ”©λœ μ‹œν¬λ¦Ώμ΄ λ°œκ²¬λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€" - fi - - - name: πŸ“Š μ½”λ“œ λ³΅μž‘λ„ 검사 - run: | - echo "πŸ“ μ½”λ“œ λ³΅μž‘λ„ 검사 쀑..." - # λ³΅μž‘λ„ 검사 둜직 - echo "βœ… μ½”λ“œ λ³΅μž‘λ„ 검사 μ™„λ£Œ" - - # 🏷️ μžλ™ 라벨링 - auto-label: - name: 🏷️ μžλ™ 라벨링 - runs-on: ubuntu-latest - - steps: - - name: πŸ“₯ μ½”λ“œ 체크아웃 - uses: actions/checkout@v4 - - - name: 🏷️ 변경사항 기반 라벨 μΆ”κ°€ - uses: actions/github-script@v6 - with: - script: | - const { data: files } = await github.rest.pulls.listFiles({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: context.issue.number, - }); - - const labels = []; - - // 파일 ν™•μž₯μžλ³„ 라벨 μΆ”κ°€ - if (files.some(file => file.filename.endsWith('.py'))) { - labels.push('python'); - } - if (files.some(file => file.filename.endsWith('.js') || file.filename.endsWith('.ts'))) { - labels.push('javascript'); - } - if (files.some(file => file.filename.includes('test'))) { - labels.push('test'); - } - if (files.some(file => file.filename.includes('doc') || file.filename.endsWith('.md'))) { - labels.push('documentation'); - } - - // λ³€κ²½λœ 쀄 μˆ˜μ— λ”°λ₯Έ 라벨 - const totalChanges = files.reduce((sum, file) => sum + file.changes, 0); - if (totalChanges > 500) { - labels.push('large-change'); - } else if (totalChanges > 100) { - labels.push('medium-change'); - } else { - labels.push('small-change'); - } - - // 라벨 μΆ”κ°€ - if (labels.length > 0) { - await github.rest.issues.addLabels({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - labels: labels - }); - } \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index ddb792b..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,140 +0,0 @@ -name: πŸš€ 릴리즈 μžλ™ν™” - -on: - push: - tags: - - 'v*' - workflow_dispatch: - inputs: - version: - description: '릴리즈 버전 (예: v1.0.0)' - required: true - type: string - -jobs: - # πŸ“¦ 릴리즈 μ€€λΉ„ - prepare-release: - name: πŸ“¦ 릴리즈 μ€€λΉ„ - runs-on: ubuntu-latest - - outputs: - version: ${{ steps.version.outputs.version }} - changelog: ${{ steps.changelog.outputs.changelog }} - - steps: - - name: πŸ“₯ μ½”λ“œ 체크아웃 - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: 🏷️ 버전 μΆ”μΆœ - id: version - run: | - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - VERSION="${{ github.event.inputs.version }}" - else - VERSION=${GITHUB_REF#refs/tags/} - fi - echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "πŸ“‹ 릴리즈 버전: $VERSION" - - - name: πŸ“ 변경사항 생성 - id: changelog - run: | - echo "πŸ” 변경사항 μˆ˜μ§‘ 쀑..." - - # 이전 νƒœκ·Έ μ°ΎκΈ° - PREVIOUS_TAG=$(git tag --sort=-version:refname | head -2 | tail -1) - if [ -z "$PREVIOUS_TAG" ]; then - PREVIOUS_TAG=$(git rev-list --max-parents=0 HEAD) - fi - - echo "πŸ“… $PREVIOUS_TAG 이후 변경사항:" - - # 컀밋 λ©”μ‹œμ§€ 기반 변경사항 λΆ„λ₯˜ - FEATURES=$(git log $PREVIOUS_TAG..HEAD --oneline | grep -E "feat|feature|add" | sed 's/^/- /') - BUGFIXES=$(git log $PREVIOUS_TAG..HEAD --oneline | grep -E "fix|bug" | sed 's/^/- /') - OTHERS=$(git log $PREVIOUS_TAG..HEAD --oneline | grep -vE "feat|feature|add|fix|bug" | sed 's/^/- /') - - CHANGELOG="## πŸš€ μƒˆλ‘œμš΄ κΈ°λŠ₯\n$FEATURES\n\n## πŸ› 버그 μˆ˜μ •\n$BUGFIXES\n\n## πŸ”§ 기타 변경사항\n$OTHERS" - - echo "changelog<> $GITHUB_OUTPUT - echo -e "$CHANGELOG" >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT - - # πŸ—οΈ λΉŒλ“œ 및 ν…ŒμŠ€νŠΈ - build-and-test: - name: πŸ—οΈ λΉŒλ“œ 및 ν…ŒμŠ€νŠΈ - runs-on: ubuntu-latest - needs: prepare-release - - 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 build wheel - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - - - name: πŸ—οΈ νŒ¨ν‚€μ§€ λΉŒλ“œ - run: | - python -m build - echo "βœ… λΉŒλ“œ μ™„λ£Œ" - - - name: πŸ§ͺ μ΅œμ’… ν…ŒμŠ€νŠΈ - run: | - echo "πŸ§ͺ 릴리즈 μ „ μ΅œμ’… ν…ŒμŠ€νŠΈ μ‹€ν–‰ 쀑..." - # μ‹€μ œ ν…ŒμŠ€νŠΈ λͺ…λ Ήμ–΄ μΆ”κ°€ - echo "βœ… λͺ¨λ“  ν…ŒμŠ€νŠΈ 톡과" - - # πŸ“¦ 릴리즈 생성 - create-release: - name: πŸ“¦ GitHub 릴리즈 생성 - runs-on: ubuntu-latest - needs: [prepare-release, build-and-test] - - steps: - - name: πŸ“₯ μ½”λ“œ 체크아웃 - uses: actions/checkout@v4 - - - name: πŸš€ GitHub 릴리즈 생성 - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ needs.prepare-release.outputs.version }} - release_name: ${{ needs.prepare-release.outputs.version }} - body: | - # πŸŽ‰ ${{ needs.prepare-release.outputs.version }} 릴리즈 - - ${{ needs.prepare-release.outputs.changelog }} - - ## πŸ“₯ μ„€μΉ˜ 방법 - ```bash - pip install plain-ai==${{ needs.prepare-release.outputs.version }} - ``` - - ## πŸ”— 전체 변경사항 - **Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ needs.prepare-release.outputs.version }}...HEAD - draft: false - prerelease: false - - # πŸ“’ 릴리즈 μ•Œλ¦Ό - notify-release: - name: πŸ“’ 릴리즈 μ•Œλ¦Ό - runs-on: ubuntu-latest - needs: [prepare-release, create-release] - - steps: - - name: πŸŽ‰ 릴리즈 μ™„λ£Œ λ©”μ‹œμ§€ - run: | - echo "πŸŽ‰ ${{ needs.prepare-release.outputs.version }} λ¦΄λ¦¬μ¦ˆκ°€ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€!" - echo "πŸ“¦ GitHub Releases: https://github.com/${{ github.repository }}/releases" - echo "πŸ“‹ 변경사항을 ν™•μΈν•΄λ³΄μ„Έμš”!" \ No newline at end of file