Post

(Git) Pre commit hook

(Git) Pre commit hook

πŸ“ μž‘μ„± λ°°κ²½

νŒ€ ν”„λ‘œμ νŠΈμ—μ„œ μ½”λ“œ ν’ˆμ§ˆμ„ 높이기 μœ„ν•œ 방법은 μ—¬λŸ¬ κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€. λŒ€μ€‘μ μœΌλ‘œ CI μ—μ„œ μ½”λ“œ ν’ˆμ§ˆμ„ 높이기 μœ„ν•œ λ™μž‘μ„ ν•˜κ²Œ λ˜λŠ”λ° CI λ‹¨κ³„μ—μ„œ lint λ‚˜ ν…ŒμŠ€νŠΈμ— μ‹€νŒ¨ν•˜μ—¬ μž‘μ—…μ΄ μ€‘λ‹¨λ˜λŠ” κ²½μš°κ°€ μ’…μ’… λ°œμƒν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ 방식은 μž‘μ—… μ‹œκ°„ μΈ‘λ©΄μ΄λ‚˜ νš¨μœ¨μ„± λ©΄μ—μ„œ μ•„μ‰¬μš΄ 점이 μžˆμŠ΅λ‹ˆλ‹€. 이에 CI 이전 λ‹¨κ³„μ—μ„œ κ°œλ°œμžκ°€ 더 λΉ λ₯΄κ²Œ ν”Όλ“œλ°±μ„ λ°›κ³ , 효율적으둜 μˆ˜μ • 및 μž‘μ—…ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” 도ꡬ인 pre commit hook 을 μ†Œκ°œν•΄λ³΄λ € ν•©λ‹ˆλ‹€.

ν™˜κ²½

글에 μž‘μ„±λœ λ‚΄μš©μ€ 기본적으둜 mac ν™˜κ²½μ— λŒ€ν•œ μ„€λͺ… μž…λ‹ˆλ‹€.


πŸ‘“ μ„  3쀄 μš”μ•½

  • A
  • B
  • C

❓ Pre commit

pre commit hook 은 git commit 전에 μžλ™μœΌλ‘œ νŠΉμ • λ™μž‘μ„ μ‹€ν–‰ μ‹œν‚¬ 수 μžˆλ„λ‘ μ„€μ •ν•˜κ³  관리할 수 있게 ν•΄μ£ΌλŠ” 도ꡬ μž…λ‹ˆλ‹€. commit 전에 λ™μž‘μ„ ν•˜λ©°, 주둜 μ½”λ“œλ₯Ό ν¬λ§·νŒ… ν•˜κ±°λ‚˜ 린트 검사, ν…ŒμŠ€νŠΈ μˆ˜ν–‰, 파일 ꡬ쑰 확인, λ³΄μ•ˆ 검사 등을 μˆ˜ν–‰ν•˜λ©° μ½”λ“œ ν’ˆμ§ˆμ„ λ†’μ΄κ±°λ‚˜ μœ μ§€ν•  수 있게 λ„μ™€μ€λ‹ˆλ‹€. 단, pre commit hook λ§ŒμœΌλ‘œλŠ” μœ„μ— λ‚˜μ—΄λ˜μ–΄ μžˆλŠ” λ™μž‘μ„ ν•˜λŠ”κ±΄ μ•„λ‹ˆλ©°, ν•¨κ»˜ μ‚¬μš©ν•  툴이 ν•„μš”ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄

  • Python: black
  • JS: eslint, prettier
  • Kotlin: ktlinter
  • Terraform: tfsec 등이 μžˆμŠ΅λ‹ˆλ‹€.

βš™οΈ Setting

pre commit hook 을 μ„€μ •ν•˜λŠ” λ°©λ²•μ—λŠ” μ—¬λŸ¬κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

  1. μˆ˜λ™ μ„€μ • 방식 μ‚¬μš©
  2. pre-commit 도ꡬ μ‚¬μš©
  3. linter λ˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•˜λŠ” 방식 μ‚¬μš©

1. μˆ˜λ™ μ„€μ • 방식 μ‚¬μš©

.git/hooks/pre-commit 파일 생성 ν›„ commit 전에 λ™μž‘ν•˜κΈΈ μ›ν•˜λŠ” λ™μž‘λ“€μ„ 슀크립트둜 μž‘μ„±ν•˜λ©΄ μ‰½κ²Œ 섀정이 κ°€λŠ₯ν•˜λ‹€. 예λ₯Ό λ“€μ–΄ kotlin ν”„λ‘œμ νŠΈλ₯Ό κ΅¬μ„±ν–ˆλŠ”λ°, commit 전에 ktlinter κ°€ λ™μž‘ν•˜κ²Œ ν•˜κ³  μ‹Άλ‹€λ©΄ μ•„λž˜μ™€ 같이 μž‘μ„±ν•  수 μžˆλ‹€.

1
2
3
#!/bin/sh
set -e
./gradlew lintKotlin

λ¬Όλ‘  ν•΄λ‹Ή ν”„λ‘œμ νŠΈμ— ktlinter λΌμ΄λΈŒλŸ¬λ¦¬μ— λŒ€ν•œ 섀정이 μžˆμ–΄μ•Ό ν•œλ‹€.

This post is licensed under CC BY 4.0 by the author.