Git Hooks 및 자동화: 자동 품질 게이트
I 힘내 후크 이벤트에 대한 응답으로 Git이 자동으로 실행하는 스크립트입니다. (커밋, 푸시, 병합). 이를 통해 확인, 린팅, 테스트 및 검증을 자동화할 수 있습니다. 창조 품질 게이트 문제가 저장소에 도달하기 전에 이를 방지합니다. 원격. Husky 및 Lint-staged와 같은 도구를 사용하면 후크 설정이 간단하고 효과적입니다.
🎯 무엇을 배울 것인가
- Git 후크란 무엇이며 언제 실행됩니까?
- Linting 및 서식 지정을 위한 사전 커밋 후크
- 기존 커밋에 대한 Commit-msg 후크
- 후크를 쉽게 처리할 수 있도록 허스키 및 보푸라기 처리됨
Git Hook이란 무엇입니까?
Git 후크는 다음에 저장된 스크립트입니다. .git/hooks/ Git이 자동으로 수행하는 작업
워크플로우의 특정 순간에. 모든 실행 가능한 언어로 작성할 수 있습니다.
(bash, Python, Node.js 등).
📋 메인 후크
- 사전 커밋: 커밋을 생성하기 전(린팅, 테스트)
- 준비-커밋-메시지: 커밋 메시지 준비(템플릿)
- 커밋 메시지: 커밋 메시지 유효성 검사(기존 커밋)
- 커밋 후: 커밋 생성 후(알림)
- 사전 푸시: 푸시 전(전체 테스트 모음)
- 사전 리베이스: 리베이스 전
사전 커밋 후크: Linting 및 서식 지정
Il 사전 커밋 후크가 가장 많이 사용됩니다. 커밋하기 전에 코드를 확인하세요.
#!/bin/bash
# Esegui ESLint su file staged
npm run lint
if [ $? -ne 0 ]; then
echo "❌ Linting failed. Fix errors before committing."
exit 1
fi
# Esegui test
npm test
if [ $? -ne 0 ]; then
echo "❌ Tests failed. Fix tests before committing."
exit 1
fi
echo "✅ All checks passed!"
exit 0
chmod +x .git/hooks/pre-commit
문제: 공유되지 않은 후크
후크 .git/hooks/ 그들은 헌신하지 않았습니다 (`.git`은 무시됩니다).
각 개발자는 이를 수동으로 구성해야 합니다. 해결책: 허스키.
Husky: 단순화된 후크 관리
허스키 후크를 정의할 수 있습니다. package.json 그리고 그것들을 공유하세요
Git을 통해 팀과 함께.
# Installa Husky
npm install --save-dev husky
# Inizializza Husky
npx husky init
# Crea .husky/ directory con hooks condivisibili
# Crea pre-commit hook
npx husky add .husky/pre-commit "npm run lint && npm test"
# File creato: .husky/pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npm run lint && npm test
{{ '{' }}
"scripts": {{ '{' }}
"lint": "eslint . --ext .ts,.tsx",
"format": "prettier --write .",
"test": "jest",
"prepare": "husky install"
{{ '}' }},
"devDependencies": {{ '{' }}
"husky": "^8.0.0"
{{ '}' }}
{{ '}' }}
Lint 단계: Lint 단계만 수정된 파일
린트 단계 전체 파일이 아닌 준비된 파일에서만 린팅/포맷을 수행합니다. 프로젝트. 훨씬 더 빨라요!
npm install --save-dev lint-staged
{{ '{' }}
"lint-staged": {{ '{' }}
"*.{{ '{' }}ts,tsx{{ '}' }}": [
"eslint --fix",
"prettier --write"
],
"*.{{ '{' }}js,jsx{{ '}' }}": [
"eslint --fix",
"prettier --write"
],
"*.css": [
"prettier --write"
]
{{ '}' }},
"scripts": {{ '{' }}
"prepare": "husky install"
{{ '}' }}
{{ '}' }}
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx lint-staged
커밋 메시지 후크: 기존 커밋
Forza 기존 커밋 (feat:, fix:, docs: 등) 자동 변경 로그의 경우:
npm install --save-dev @commitlint/cli @commitlint/config-conventional
module.exports = {{ '{' }}
extends: ['@commitlint/config-conventional'],
rules: {{ '{' }}
'type-enum': [2, 'always', [
'feat', // Nuova feature
'fix', // Bug fix
'docs', // Documentazione
'style', // Formatting
'refactor', // Refactoring
'test', // Test
'chore' // Manutenzione
]]
{{ '}' }}
{{ '}' }};
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx --no-install commitlint --edit "$1"
# ✅ Valido
git commit -m "feat: add user authentication"
git commit -m "fix: resolve payment bug"
# ❌ Invalido (manca tipo)
git commit -m "add feature"
# ⧗ input: add feature
# ✖ subject may not be empty [subject-empty]
# ✖ type may not be empty [type-empty]
Pre-Push Hook: 완전한 테스트 스위트
CI에서 손상된 빌드를 방지하려면 푸시하기 전에 포괄적인 테스트를 실행하세요.
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
# Esegui test suite completa
npm test
# Verifica build di produzione
npm run build
# Se uno fallisce, push viene bloccato
exit $?
전체 예: 전문 설정
Husky, 린트 단계, 커밋린트 및 사전 푸시 테스트로 설정을 완료합니다.
{{ '{' }}
"name": "my-project",
"scripts": {{ '{' }}
"lint": "eslint . --ext .ts,.tsx",
"format": "prettier --write .",
"test": "jest",
"test:ci": "jest --coverage",
"build": "tsc && vite build",
"prepare": "husky install"
{{ '}' }},
"lint-staged": {{ '{' }}
"*.{{ '{' }}ts,tsx{{ '}' }}": [
"eslint --fix",
"prettier --write",
"jest --bail --findRelatedTests"
],
"*.{{ '{' }}css,scss{{ '}' }}": [
"prettier --write"
]
{{ '}' }},
"devDependencies": {{ '{' }}
"husky": "^8.0.0",
"lint-staged": "^13.0.0",
"@commitlint/cli": "^17.0.0",
"@commitlint/config-conventional": "^17.0.0",
"eslint": "^8.0.0",
"prettier": "^2.8.0",
"jest": "^29.0.0"
{{ '}' }}
{{ '}' }}
my-project/
├── .husky/
│ ├── pre-commit # Lint-staged
│ ├── commit-msg # Commitlint
│ └── pre-push # Full tests + build
├── commitlint.config.js
├── .eslintrc.js
├── .prettierrc
├── package.json
└── src/
바이패스 후크(주의)
때로는 후크를 건너뛰어야 할 때도 있습니다(예: WIP 커밋).
# Bypass tutti gli hooks
git commit --no-verify -m "WIP: incomplete feature"
git push --no-verify
# Abbreviazione
git commit -n -m "WIP"
# ⚠️ Usa solo quando assolutamente necessario!
CI/CD 통합
로컬 후크로는 충분하지 않습니다(우회 가능). CI에 대해 동일한 검사를 재현합니다.
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 18
# Stesse verifiche dei hooks locali
- run: npm ci
- run: npm run lint
- run: npm run format -- --check
- run: npm run test:ci
- run: npm run build
# Verifica conventional commits
- uses: wagoid/commitlint-github-action@v5
모범 사례
✅ 해야 할 일
- 미국 허스키 팀과 후크를 공유하기 위해
- 미국 린트 단계 속도 향상(스테이징된 파일만 해당)
- 다음으로 커밋을 확인하세요. 커밋린트
- 후크 유지 빠른 (< 10초)
- CI/CD에서 테스트 재생
- README의 문서 후크 설정
❌ 하지 말아야 할 것
- 후크를 너무 느리게 만들지 마십시오(개발자를 좌절시킵니다).
- 후크에만 의존하지 마세요(우회할 수 있음)
- 사전 커밋에서 전체 빌드를 실행하지 마세요(사전 푸시 사용).
- 잊지 마세요
"prepare": "husky install"package.json에서
고급 후크
#!/usr/bin/env sh
# .husky/prepare-commit-msg
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
# Se è un nuovo commit (non merge/amend)
if [ -z "$COMMIT_SOURCE" ]; then
# Aggiungi template con branch name
BRANCH_NAME=$(git symbolic-ref --short HEAD)
echo "[$BRANCH_NAME] " > "$COMMIT_MSG_FILE"
fi
#!/usr/bin/env sh
# .husky/post-commit
COMMIT_MSG=$(git log -1 --pretty=%B)
AUTHOR=$(git log -1 --pretty=%an)
# Invia notifica a Slack
curl -X POST https://hooks.slack.com/services/YOUR/WEBHOOK/URL \
-H 'Content-Type: application/json' \
-d "{{ '{' }}\"text\":\"New commit by $AUTHOR: $COMMIT_MSG\"{{ '}' }}"
문제 해결
# Hook non eseguibile
chmod +x .husky/pre-commit
# Husky non installato
npm run prepare
# Hook eseguito due volte
# Rimuovi hook duplicati in .git/hooks/
# Lint-staged non trova file
# Verifica pattern in package.json
# Commitlint non funziona
# Controlla commitlint.config.js esista
결론
Git 후크는 품질 게이트를 자동화하여 코드 손상, 테스트 실패 및 잘못된 커밋을 방지합니다. 포맷되었습니다. 허스키 Hook을 쉽게 공유할 수 있게 만들고, 린트 단계 빠르게 만들고, 커밋린트 일관된 메시지를 보장합니다. CI/CD와 결합하여, 코드 품질을 높게 유지하는 강력한 작업 흐름을 만듭니다.
🎯 핵심 포인트
- Git 후크는 사전 커밋 및 사전 푸시 검사를 자동화합니다.
- Husky는 Git을 통해 후크를 공유합니다(수동 구성 없음).
- 수정된 파일에만 린트 단계 린트
- commitlint는 변경 로그에 대한 기존 커밋을 강제합니다.
- 안전을 위한 CI/CD 플레이 테스트







