--- id: [[P-Reinforce|P-Reinforce]]-AUTO-E60BE3 category: "10_Wiki/πŸ’‘ Topics/Programming & Language" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - Git Hook을 μ΄μš©ν•œ [[CI_CD|CI_CD]] μžλ™ν™” νŒŒμ΄ν”„λΌμΈ" --- # [[Git Hookα„‹α…³α†― 아용ᄒᅑᆫ CI_CD α„Œα…‘α„ƒα…©α†Όα„’α…ͺ ᄑᅑ아프ᄅᅑ안|Git Hook을 μ΄μš©ν•œ CI_CD μžλ™ν™” νŒŒμ΄ν”„λΌμΈ]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > Git ν›…([[Git Hooks|Git Hooks]])은 μ†ŒμŠ€ μ½”λ“œ 버전 관리 μ‹œμŠ€ν…œμΈ Git의 νŠΉμ • μž‘μ—…(commit, push λ“±) 전후에 μžλ™μœΌλ‘œ μ‹€ν–‰λ˜λ„λ‘ μ„€μ •λœ μ‰˜ μŠ€ν¬λ¦½νŠΈμ΄λ‹€ [1]. ν”„λ‘ νŠΈμ—”λ“œ 및 Node.js μƒνƒœκ³„μ—μ„œλŠ” 주둜 Husky와 lint-stagedλΌλŠ” 도ꡬλ₯Ό ν™œμš©ν•˜μ—¬ Git 훅을 μ„€μ •ν•˜κ³  κ΄€λ¦¬ν•œλ‹€ [2], [3]. 이λ₯Ό 톡해 μ½”λ“œκ°€ 원격 μ €μž₯μ†Œλ‚˜ CI νŒŒμ΄ν”„λΌμΈμœΌλ‘œ λ„˜μ–΄κ°€κΈ° 전인 둜컬 λ‹¨κ³„μ—μ„œ μ½”λ“œ μŠ€νƒ€μΌ, ν¬λ§·νŒ…([[Prettier|Prettier]]), 문법적 였λ₯˜([[ESLint|ESLint]]) 등을 μžλ™μœΌλ‘œ κ²€μ‚¬ν•˜κ³  μˆ˜μ •ν•¨μœΌλ‘œμ¨ μΌκ΄€λœ ν’ˆμ§ˆμ„ κ°•μ œν•˜λŠ” 'μ΅œμ „μ„  λ°©μ–΄μ„ ' 역할을 μˆ˜ν–‰ν•œλ‹€ [1], [4], [3]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) * **Git ν›…(Git Hooks)의 μ’…λ₯˜μ™€ ν•œκ³„** Git 훅은 `.git/hooks/` κ²½λ‘œμ— μ‘΄μž¬ν•˜λŠ” 슀크립트둜 `pre-commit`, `commit-msg`, `pre-push` λ“±μœΌλ‘œ λ‚˜λ‰œλ‹€ [1], [5]. 특히 `pre-commit`은 컀밋이 μƒμ„±λ˜κΈ° 직전에 μ‹€ν–‰λ˜μ–΄ ν¬λ§·νŒ…μ΄λ‚˜ λ¦°νŒ…μ„ μˆ˜ν–‰ν•˜λ©°, `pre-push`λŠ” ν‘Έμ‹œ 전에 ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈλ₯Ό μ‹€ν–‰ν•˜λŠ” λ“± λ‹€μ†Œ 무거운 μž‘μ—…μ— μ ν•©ν•˜λ‹€ [1], [6], [7]. ν•˜μ§€λ§Œ 둜컬의 `.git/hooks/` λ””λ ‰ν† λ¦¬λŠ” 버전 관리가 λ˜μ§€ μ•Šμ•„ νŒ€μ› κ°„ κ³΅μœ κ°€ μ–΄λ ΅κ³ , κ°œλ°œμžκ°€ `--no-verify` μ˜΅μ…˜μ„ 톡해 훅을 μš°νšŒν•  수 μžˆλ‹€λŠ” νƒœμƒμ  ν•œκ³„κ°€ μ‘΄μž¬ν•œλ‹€ [2], [8]. * **Huskyλ₯Ό ν†΅ν•œ Git ν›… 곡유 및 관리** HuskyλŠ” Git의 κΈ°λ³Έ ν›… 경둜(`core.hooksPath`)λ₯Ό `.husky/` λ””λ ‰ν† λ¦¬λ‘œ λ³€κ²½ν•˜μ—¬ ν›… 슀크립트λ₯Ό Git 버전 관리에 ν¬ν•¨μ‹œν‚¬ 수 있게 ν•΄μ£ΌλŠ” 도ꡬ이닀 [2], [9]. `package.json`의 `prepare` μŠ€ν¬λ¦½νŠΈμ™€ μ—°λ™ν•˜λ©΄, ν”„λ‘œμ νŠΈλ₯Ό ν΄λ‘ ν•œ νŒ€μ›μ΄ `npm install`을 μ‹€ν–‰ν•  λ•Œ μžλ™μœΌλ‘œ Husky 훅이 둜컬 ν™˜κ²½μ— μ…‹μ—…λ˜λ―€λ‘œ λͺ¨λ“  κ°œλ°œμžμ—κ²Œ λ™μΌν•œ 검사 κ·œμΉ™μ„ μ‰½κ²Œ κ°•μ œν•  수 μžˆλ‹€ [10], [11], [12]. * **lint-stagedλ₯Ό ν™œμš©ν•œ 검사 μ΅œμ ν™” 및 μžλ™ν™”** ν”„λ‘œμ νŠΈ 규λͺ¨κ°€ 컀질수둝 전체 μ½”λ“œλ² μ΄μŠ€λ₯Ό λŒ€μƒμœΌλ‘œ ESLintλ‚˜ Prettierλ₯Ό μ‹€ν–‰ν•˜λŠ” 것은 μˆ˜μ‹­ 초 이상이 μ†Œμš”λ˜μ–΄ 개발 생산성을 λ–¨μ–΄λœ¨λ¦°λ‹€ [2]. `lint-staged`λŠ” ν˜„μž¬ Git의 staged μƒνƒœμΈ(컀밋을 μœ„ν•΄ μΆ”κ°€λœ) νŒŒμΌλ“€μ—λ§Œ κΈ€λ‘œλΈŒ(glob) νŒ¨ν„΄μ„ λ§€μΉ­ν•˜μ—¬ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•΄ μ£ΌλŠ” μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ 도ꡬ(router)이닀 [13], [14], [15]. 보톡 `pre-commit` ν›… λ‚΄λΆ€μ—μ„œ `lint-staged`λ₯Ό ν˜ΈμΆœν•˜λ„λ‘ κ΅¬μ„±ν•˜μ—¬, λ³€κ²½λœ νŒŒμΌλ“€λ§Œμ„ λŒ€μƒμœΌλ‘œ 1~2초 λ§Œμ— 검사 및 μžλ™ μˆ˜μ •(`eslint --fix`, `prettier --write` λ“±)을 마칠 수 μžˆλ‹€ [2], [7], [16]. λ˜ν•œ `lint-staged`λŠ” μž‘μ—…μ΄ μ„±κ³΅ν•˜λ©΄ λ³€κ²½λœ λ‚΄μš©μ„ μžλ™μœΌλ‘œ λ‹€μ‹œ μŠ€ν…Œμ΄μ§•(auto-staging) μ²˜λ¦¬ν•΄ μ£Όλ―€λ‘œ, 섀정이 κ°„νŽΈν•˜λ‹€ [10], [17]. * **CI νŒŒμ΄ν”„λΌμΈκ³Όμ˜ μ—­ν•  λΆ„λ‹΄ (Hybrid Approach)** Husky와 lint-staged 기반의 μžλ™ν™”λŠ” 개발자 κ²½ν—˜(DX) ν–₯상과 ν”Όλ“œλ°± 루프 단좕을 μœ„ν•œ 둜컬 도ꡬ이닀 [8], [18]. κ°œλ°œμžκ°€ 훅을 μš°νšŒν•  κ°€λŠ₯성이 μƒμ‘΄ν•˜λ―€λ‘œ, 둜컬 Git 훅이 CI(Continuous Integration)λ₯Ό μ™„μ „νžˆ λŒ€μ²΄ν•  μˆ˜λŠ” μ—†λ‹€ [19]. λ”°λΌμ„œ 둜컬 훅을 톡해 λͺ…λ°±ν•œ 문제(λΆˆλŸ‰ 컀밋 λ“±)κ°€ 원격지에 μ˜¬λΌκ°€λŠ” 것을 사전에 λ°©μ§€ν•˜κ³ , μ΅œμ’…μ μΈ μ½”λ“œ ν’ˆμ§ˆ κ°•μ œ(enforcement boundary)와 전체 ν…ŒμŠ€νŠΈ μˆ˜ν–‰ 등은 CI νŒŒμ΄ν”„λΌμΈμ˜ λͺ«μœΌλ‘œ λ‚¨κ²¨λ‘λŠ” ν˜•νƒœκ°€ 이상적이닀 [19], [18], [20]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[Husky|Husky]], lint-staged, ESLint, [[Prettier|Prettier]] - **Projects/Contexts:** μžλ™ν™”λœ μ½”λ“œ ν’ˆμ§ˆ 및 μŠ€νƒ€μΌ 검사 μ›Œν¬ν”Œλ‘œμš° - **Contradictions/Notes:** lint-stagedλŠ” 버전 10λΆ€ν„° μ„±κ³΅μ μœΌλ‘œ 파일이 μˆ˜μ •λ˜λ©΄ μžλ™μœΌλ‘œ `git add`λ₯Ό μˆ˜ν–‰ν•˜λ―€λ‘œ, μ„€μ • 파일의 μ»€λ§¨λ“œ λͺ©λ‘μ— μˆ˜λ™μœΌλ‘œ `git add`λ₯Ό λ„£λŠ” 것은 쀑볡 μž‘μ—… 및 레이슀 μ»¨λ””μ…˜(race condition)을 μœ λ°œν•  수 μžˆμ–΄ 더 이상 ꢌμž₯λ˜μ§€ μ•ŠλŠ”λ‹€ [17], [21]. λ˜ν•œ, 둜컬 Git 훅은 우회(`--no-verify`)κ°€ κ°€λŠ₯ν•˜λ―€λ‘œ μ™„λ²½ν•œ μ •μ±… μ§‘ν–‰ 경계가 될 수 μ—†μœΌλ©°, CI μ„œλ²„λ₯Ό λ³΄μ™„ν•˜λŠ” μ„±κ²©μœΌλ‘œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€ [19], [8], [21]. --- *Last updated: 2026-04-19* ---