Drupal에서 Pre-commit Hooks를 활용한 워크플로우 현대화
Source: Dev.to
Problem
대규모 정부 간 기업에서 세 대륙에 걸친 개발자들이 Drupal 배포판을 관리할 때, 코드 리뷰는 잘못된 구문에 대한 첫 번째 방어선이 될 수 없습니다. 시니어 아키텍트가 Pull Request를 검토할 때가 되면 들여쓰기나 누락된 docblock에 대해 논쟁하기엔 이미 너무 늦은 상황입니다.
커스텀 업스트림( CHG0099785 )에서는 사소한 PHPCS(PHP CodeSniffer) 위반 때문에 CI 파이프라인이 지속적으로 실패했으며, 이는 병합 사이클에 큰 병목을 만들었습니다. 두 개의 스페이스 대신 탭 하나만 사용돼도 CI 파이프라인이 컨테이너를 시작하고 테스트를 실행하는 데 5~10 분이 소요되고, 결국 구문 검사에서 실패했습니다.
10 분의 대기 시간을 20명의 개발자가 하루에 세 번씩 커밋한다면, Jenkins/GitLab이 누락된 세미콜론을 보고하는 데 주당 수백 시간의 대기 시간이 발생합니다.
Solution
검증 로직을 원격 CI 서버에서 개발자의 로컬 머신으로 옮겨 Git pre‑commit 훅을 자동화합니다.
- 프로젝트 루트
package.json에 husky와 lint‑staged를 통합했습니다. - 훅은
git commit명령을 가로채고 현재 Git에 스테이징된 파일만 대상으로 합니다. - 전체 레거시 Drupal 코어를 검사하는 데는 몇 분이 걸리지만, 개발자가 방금 수정한 두 파일만 검사하면 약 400 ms가 소요됩니다.
Implementation
Pre‑commit Hook Workflow
-
스테이징된 파일에 대해
phpcbf(PHP Code Beautifier and Fixer)를 실행합니다.- 개발자가 싱글 쿼트 대신 더블 쿼트를 사용하면
phpcbf가 즉시 파일을 수정하고, 수정된 버전을 스테이징한 뒤 커밋을 조용히 진행합니다.
- 개발자가 싱글 쿼트 대신 더블 쿼트를 사용하면
-
자동 수정 후 **
phpcs**를 실행해 코딩 표준을 강제합니다.
Configuration Highlights
// package.json (excerpt)
{
"scripts": {
"prepare": "husky install"
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.php": [
"phpcbf",
"phpcs"
]
}
}
Downstream Deployment
다운스트림 벤더 에이전시가 필요한 바이너리(예: Husky용 Node.js)를 보유하지 않은 경우가 있었습니다. 이를 해결하기 위해 composer.json 스캐폴딩 스크립트를 조정하여 다운스트림 배포 빌드 중에는 엄격한 pre‑commit 훅을 비활성화하거나 우회하도록 했습니다. 이렇게 하면 훅은 첫 번째 파티 UI/UX 개발자에게만 적용되고, 프로덕션 파이프라인에는 보이지 않게 됩니다.
Results
- 구문 문제로 인한 CI 실패율이 98 % 감소했습니다.
- 시니어 아키텍트는 이제 라인 길이 제한에 대한 코멘트 대신 비즈니스 로직과 보안 요소 검토에 시간을 할애합니다.
References
- Enterprise CMS case studies:
- LinkedIn profile: