힘내 후크

게시 됨: 2022-07-02

Git은 지난 몇 개의 게시물에서 거의 표면을 긁지 않은 강력한 버전 제어 시스템입니다. 오늘은 Git Hooks를 통해 Git이 제공할 수 있는 자동화 기능을 살펴보겠습니다.

모든 저장소에는 git init 명령을 사용할 때 내장된 후크가 있습니다. 저장소가 초기화되면 숨겨진 .git 디렉토리가 생기고 그 안에 모든 후크를 포함할 hooks라는 디렉토리가 있습니다. 가지고 있는 git 저장소를 열고 ls -a 를 사용하여 숨겨진 디렉토리를 확인한 다음 즐겨 사용하는 코드 편집기에서 엽니다.

시작하려면 .sample 파일 확장자를 가진 많은 파일이 표시됩니다. 이것이 바로 프로젝트에서 사용할 수 있는 샘플 스크립트입니다. 파일은 실행되는 후크와 일치하도록 이름이 지정됩니다. 따라서 post-commit.samplepost-commit 후크에서 실행됩니다.

거의 모든 언어를 사용하여 후크를 작성할 수 있습니다. 파일은 파일 상단의 shebang 표기법에 따라 구문 분석됩니다. 노드를 사용하려면 #! /usr/bindi/env node #! /usr/bindi/env node 와 파일은 노드 파일로 구문 분석됩니다.

git hooks로 무엇을 할 수 있는지 알아보기 전에 사용할 수 있는 hooks를 살펴보겠습니다.

Git Hook의 유형

워크플로 후크 커밋

pre-commit 은 커밋 메시지를 입력하기도 전에 실행되며 git commit --no-verify 로 무시할 수 있습니다.

prepare-commit-msg 를 사용하여 커밋 메시지에 표시되는 기본 메시지를 편집할 수 있습니다. 개발자에게 어떤 유형의 커밋 메시지를 남겨야 하는지에 대한 지침을 제공하는 데 사용합니다. 또한 병합과 같이 메시지가 자동으로 생성되는 위치의 내용을 자동화하거나 커밋 메시지에 문제 번호를 자동으로 추가하는 데 사용할 수도 있습니다.

commit-msg 를 사용하여 프로젝트의 커밋 메시지를 확인할 수 있습니다. 누군가가 단순히 "공백 다루기"라는 커밋 메시지를 입력하는 것을 원하지 않을 수도 있습니다. 이 후크를 사용하여 공백이라는 단어의 존재를 감지한 다음 종료하고 사용자에게 더 나은 커밋 메시지가 필요하다는 경고를 제공할 수 있습니다.

post-commit 은 위의 모든 커밋 후크 후에 실행됩니다. 커밋이 되었다는 알림에 가장 유용합니다.

클라이언트 후크

post-checkout 은 성공적인 git checkout 명령을 실행한 후에 실행됩니다. 사이트에서 큰 파일 세트를 사용했지만 소스 제어에서 원하지 않는 경우 이 명령을 사용하여 파일을 이동할 수 있습니다.

pre-push 는 객체가 원격 저장소로 전송되기 전에 git push 명령 중에 실행됩니다.

서버 후크

pre-receive 는 클라이언트가 원격 저장소에 코드를 푸시할 때 실행됩니다. 이것은 푸시를 수락하기 전에 프로젝트의 기준을 충족하는지 확인하기 위해 푸시되는 코드를 확인하는 데 사용할 수 있습니다.

원격 리포지토리가 업데이트를 수신한 후 post-receive 가 실행됩니다. 이것은 배포 프로세스를 트리거하는 웹 후크를 호출하거나 커밋이 수신되어 검토할 준비가 되었음을 채팅방에 알리는 데 사용할 수 있습니다.

위의 많은 후크는 특정 분기에서만 실행되도록 설정할 수 있습니다. 이는 배포 준비가 된 기본 분기에 누군가가 코드를 푸시한 경우에만 post-receive 후크를 사용하는 경우를 의미할 수 있습니다. 개발자 목록은 코드를 검토한 다음 배포하라는 알림을 받을 수 있습니다. 이렇게 하면 한 명의 개발자가 쉽게 놓칠 수 있는 실수를 포착할 수 있는 배포에 대해 항상 2세트의 눈을 갖게 됩니다.

나는 그것들을 사용할 필요성을 본 적이 없기 때문에 사용 가능한 후크 중 일부를 건너 뛰었습니다. 내가 이야기하지 않은 후크 세트 중 하나는 이메일 워크플로 후크입니다. 이메일을 통해 코드에 대한 패치를 수락하지 않으면 패치가 필요하지 않을 것입니다. 문서에서 사용 가능한 모든 후크를 찾을 수 있습니다.

실제로 내가 가장 많이 사용한 후크는 다음과 같습니다.

  • 사전 커밋
  • 미리 푸시
  • 커밋 메시지
  • 미리 받다
  • 커밋 후
  • 사후 수신

이제 이 후크로 뭔가를 해봅시다.

WP Cli 및 Git Hooks로 WordPress 플러그인 활성화

올해 한 클라이언트 프로젝트를 위해 저는 상점을 추가하고 있었고 여전히 메인 사이트에서 몇 가지 작업을 수행하고 있었습니다. 이는 메인 사이트에 WooCommerce 플러그인이 설치 또는 활성화 되지 않았음 을 의미합니다. 한 지점에서 WooCommerce 스토어를 개발해야 했고, 모든 것을 라이브로 푸시할 준비가 된 후에야 WooCommerce를 메인으로 옮기고 싶었습니다.

시작하려면 store라는 새 브랜치가 필요합니다. git checkout -b store 를 사용하여 이것을 얻을 수 있습니다. 이것은 새로운 브랜치를 생성하고 우리를 위해 체크아웃합니다. 이제 후크를 준비합시다.

먼저 touch .git/hooks/post-checkout 명령으로 체크아웃 후 훅을 만들어야 합니다.

다음으로 실행 가능하게 만들어야 합니다. 터미널 chmod +x .git/hooks/post-checkout 의 chmod 명령으로 이 작업을 수행할 수 있습니다.

이제 선택한 코드 편집기에서 파일을 열고 아래 코드를 post-checkout 파일에 복사합니다.

#! /bin/bash

wp plugin activate woocommerce

echo "activated WooCommerce"

wp plugin activate automatewoo

echo "activated AutomateWoo"

터미널을 통해 분기로 변경하여 이를 시연할 수 있습니다. WooCommerce 및 AutomateWoo가 활성화되었음을 알리는 두 줄이 표시되어야 합니다. 우리는 그것이 작동한다는 것을 알고 있지만 우리가 분기로 변경할 때마다 플러그인을 켜기 때문에 우리가 원하는 것이 아닙니다.

우리가 정말로 원하는 것은 우리가 우리 매장으로 이동할 때 그것들을 켜고, 우리가 우리의 본점에 있을 때 그것들을 끄는 것입니다. 그렇게 하려면 우리가 어느 분기인지 감지하는 후크가 필요합니다. post-checkout 내용을 아래 코드로 바꿉니다.

#! /bin/bash

oldrev=$1
newrev=$2

branch_name="(git symbolic-ref HEAD 2>/dev/null)"

if [ "refs/head/store" = "$branch_name" ];then
wp plugin activate woocommerce
echo "activated Woo"

wp plugin activate automatewoo
echo "activated AutomateWoo"
fi

if [ "refs/head/main" = "$branch_name" ];then
wp plugin deactivate woocommerce
echo "deactivated Woo"

wp plugin deactivate automatewoo
echo "deactivated AutomateWoo"
fi

이 코드는 체크아웃할 분기를 branch_name 변수에 할당하는 것으로 시작합니다. 그러면 두 개의 if 문이 있습니다. 먼저 지점으로 이동했는지 확인합니다. 있는 경우 WP CLI를 사용하여 WooCommerce 및 AutomateWoo를 활성화합니다.

다음 if 문은 우리가 메인 브랜치에 있는지 확인합니다. 그렇다면 WP CLI로 플러그인을 비활성화하고 터미널에서 이에 대해 알려줍니다.

Git Hook으로 Git 워크플로 제어

Git에 대한 이전 게시물에서 다양한 Git 워크플로에 대해 이야기했습니다. 후크의 매우 일반적인 사용 사례 중 하나는 누구든지 메인 브랜치에 직접 코드를 커밋하는 것을 막는 것입니다. 후크를 사용하여 모든 코드가 다른 브랜치에서 메인으로 병합되도록 할 수 있습니다.

pre-commit.sample 이름을 pre-commit 으로 변경하여 시작한 다음 위에서 설명한 대로 실행 가능하게 만듭니다. 그런 다음 아래 코드를 가져와 사전 커밋 파일에서 사용합니다.

#! /bin/bash

username=$GIT_AUTHOR_NAME
branch="$(git symbolic-ref HEAD 2>/dev/null)"

if [ "$branch" = "refs/heads/main" ]; then
echo "WHOA that was '"${branch}"' you should not do that. Stop doing silly stuff and create your own branch and merge it."
exit 1 # if you remove this it won't block the commit but it will send the message to slack

fi

이것은 우리가 메인 브랜치에 있는지 확인하고, 있다면 커밋이 중지됩니다. 그런 다음 메인 브랜치에 직접 커밋해서는 안 된다는 알림을 사용자에게 인쇄합니다.

많은 장소가 분기로 main 으로 변경되고 있음을 기억하십시오. 이전 프로젝트가 업데이트되지 않은 경우 여기에 master 가 필요할 수 있습니다.

한 단계 더 나아가 cURL을 사용하여 채팅 앱의 API에 액세스한 다음 누군가가 main에 커밋하려고 시도했다고 공개적으로 불평할 수도 있습니다.

git hooks의 유일한 한계는 당신의 상상력입니다. TODO가 코드에 있는 경우 누군가가 커밋하는 것을 막거나 파일 끝에서 공백을 막는 데 사용할 수 있습니다.

워크플로에 계속 걸림돌이 되는 부분이 있는 경우 후크를 살펴보고 이를 자동화하면 기억할 필요가 없습니다.