GDSC Sookmyung 활동/10 min Seminar

Git hook 을 사용해 보자!

🌊유파도🌊 2023. 2. 13. 22:22

23년 2월 셋째주 10분 세미나 주제는 git hook입니다.

원래는  'git hook을 통한 테스트 자동화' 를 준비했었는데, 제가 실제로 git hook을 사용해본 프로젝트는 노드-express 프로젝트라서 spring boot 으로 개발하는 분이 많은 gdsc 에서 발표하기에는 조금 빗나간 주제라는 생각이 들었습니다.

그래서 '테스트 자동화' 보다는 'git hook'에 초점을 맞춰서 세미나를 준비했습니다.

 

 

 

 

 

 

 

git hook에 대해 들어본 적이 있을까요?

이미 알고 있었다면 당신은 git 숙련자임이 틀림없습니다. 제발 저에게 가르침을 주세요.

저는 알게된지 얼마안되었는데요. 미숙하지만 설명을 해보자면,

hook이란 영어로 갈고리를 의미하고, 프로그램에서 hook은 특정 이벤트 전후에 갈고리를 걸어 특정 동작이 실행되는 것을 의미합니다.

따라서 git hook은 깃 이벤트 ex. commit, push, update ... 의 전후에 특정 동작이 실행되는 것을 의미합니다.

 

 

git hook의 위치는 git local repo의 .git 폴더에 있습니다. 숨겨진 폴더이기 때문에 -a 옵션을 주어야 보입니다.

로컬레포 /.git/hooks 에 가면 약 13개의 .sample 파일이 있는데요, 이 13개의 파일이 깃에서 제공하는 hook입니다.

뭔소리냐구요??

 

 

저 파일중 pre-commit.sample의 내용을 봐봅시다.

오잉.....? 네 맞습니다. 이 파일들은... 쉘스크립트 입니다.

하 띄어쓰기하나에 실행이 되기도하고 안되기도하는 킹받는 언어 쉘스크립트입니다. 모두 띄어쓰기 조심하세요.

즉, 파일의 이름에 맞는 시점에 ex. pre-commit은 커밋전 시점에, 해당 파일의 쉘스크립트 내용이 실행되는 겁니다.

13개의 파일은 각자의 받아오는 인자들이 있는데요, 자세한 내용은 깃 공식문서를 참고해야합니다. 참고해서 쉘스크립트를 작성하길 바랍니다.

그렇게 작성한 스크립트에 .sample 확장자를 제거하면 이제 git hook이 실행되는 겁니다.

 

간단한 예시를 들겠습니다.

저 레포는 제 코딩테스트 연습용 레포인데요, 역시나 깃이 적용된 로컬레포이기 때문에 .git 디렉토리가 적용되어있습니다.

커밋전에 'GDSC 하이~~' 라는 말을 출력하고 싶어서, 위와 같이 코드를 작성했습니다.

그리고 오른쪽 사진을 보면 알수있듯 커밋 전에 잘 실행됩니다.

이게 git hook입니다. 쉽죠? 사용방법과 활용이 매우 다양합니다.

하지만 한가지 단점이 있습니다.

바로 .git 디렉토리는 깃에 기록되지 않는다는 겁니다.

이게왜 문제냐고요? 깃에 기록되지 않으면 원격 레포에 못올리고, 원격 레포에 못올라가면 팀원들과 플젝을 할때 각각의 팀원이 알아서 git hook을 적용해야 합니다.

너무 귀찮아요!

 

그래서 보통은 본인이 쓰는 기술의 git hook 관련 라이브러리를 사용합니다.

저는 node를 써서, npm에서 husky라는 git hook을 쉽게 관리하는 라이브러리를 썼습니다.

 

 

각설하고 다시 git hook으로 할 수 있는 것들에게 대해 말해보겠습니다.

먼저 깃 플로우 강제로 지키기 입니다.

깃 플로우는 많은 사람들이 쓰고 있는데요, 개발자에게 모든 권한을 줘버리면 실수로 main에 푸시하고, 어쩌고 저쩌고.... 온갖일들이 다 일어납니다.(제 경험담입니다)

그냥 시스템적으로 막아버리면 좋을 것 같아요. <- 이 부분을 깃 훅이 해결해줍니다.

main, dev 브런치에 푸쉬를 막아버리면 됩니다. 그럼 pr로만 접근하겠죠? ㅎㅎㅎ

 

해당 내용으로 쉘 스크립트를 작성하고, 실행한 내용입니다.

알아서 잘 막아집니다. 아주 좋아용~

 

 

그리고 두번째, 커밋 컨벤션 강제로 지키기.

커밋 컨벤션은 사실...... 아주 중요하지는 않지만 정말 중요한 것인데요...

이것도 개발자에게 많은 자유를 주면 커밋 기록이 개판이 됩니다. 오타에.... 귀찮아서 이상하게쓰고.... (제 경험담입니다)

걍... 강제로 커밋 메시지 형식을 지켜야 커밋되도록 할래요.<-이 부분을 깃 훅이 해결해줍니다.

커밋 메시지 준비 훅에 커밋메시지 폼을 넣어주면 됩니다.

 

npm 에 commitizen이라는 깜찍한 커밋메시지 형식 라이브러리가 있길래 저는 그거 사용했어요.

 

 

조오기 이모지 있는 버전은 commitizen에서 이모지 있는 커밋컨벤션 버전입니다.

커밋할때마다 commitizen이 실행되어서, 질문을 작성하게하고, 작성한 답이 그대로 커밋메시지로 저장됩니다.

이제 이상한 커밋기록들은 안녕~

 

 

마지막, 이게 원래 제가 하려던 주제인데요. 할말이 너무 많지만 간단하게만 설명하겠습니다.

push전 테스트 자동 실행입니다.

이것은.... 원격레포에는 멀쩡한(실제로 실행되는) 코드만 올라와 있기를 바라는 작은 소망에서 시작되었습니다.

그리고 이미 배포중 + ci/cd 해놓으면.... 실수로 안돌아가는 코드 올라가서 배포되버리면 엄청난 문제가 생겨용....

그리고 테스트 파일 열심히 만들었는데.... 언제씁니까?

 

그래서! 테스트 통과 못하면 원격레포에 푸쉬안되게 할래요.<- 이 부분을 깃 훅이 해결해줍니다.

 

위 동영상은 커밋컨벤션과 푸쉬전 자동테스트를 적용한 예시입니다.

 

 

넵. 

감사합니다.