Haki Gita

Opublikowany: 2022-07-02

Git to potężny system kontroli wersji, o którym ledwo dotarliśmy w ostatnich kilku postach. Dzisiaj przyjrzymy się możliwościom automatyzacji, jakie Git może Ci dać dzięki Git Hooks.

Każde repozytorium ma wbudowane hooki, gdy używasz polecenia git init . Kiedy repozytorium jest inicjowane, otrzymujesz ukryty katalog .git , w którym znajduje się katalog zwany hooks, który będzie zawierał wszystkie twoje hooki. Otwórz dowolne repozytorium git, które masz pod ręką i użyj ls -a , aby zobaczyć ukryty katalog, a następnie otwórz go w swoim ulubionym edytorze kodu.

Na początek zobaczysz kilka plików z rozszerzeniami .sample . Dokładnie tak mówią, przykładowe skrypty, które możesz wykorzystać w swoich projektach. Pliki mają nazwy odpowiadające hakowi, na którym działają. Więc post-commit.sample działa na haku post-commit .

Możesz użyć praktycznie dowolnego języka do napisania haka. Plik jest analizowany zgodnie z notacją shebang u góry pliku. Jeśli chcesz użyć węzła, użyjesz #! /usr/bindi/env node #! /usr/bindi/env node i twój plik zostanie przetworzony jako plik węzła.

Zanim zagłębimy się w to, co możesz zrobić z hakami git, przyjrzyjmy się niektórym hakom, które są dla Ciebie dostępne.

Rodzaje haków Git

Zatwierdzanie haków przepływu pracy

pre-commit jest uruchamiany przed wprowadzeniem komunikatu o zatwierdzeniu i można go ominąć za pomocą git commit --no-verify .

prepare-commit-msg może być użyty do edycji domyślnej wiadomości, którą widzisz w komunikacie o zatwierdzeniu. Użyj go, aby przekazać programistom instrukcje dotyczące typu komunikatu, który powinni pozostawić. Może być również używany do automatyzacji treści, w których wiadomość jest automatycznie generowana dla Ciebie, na przykład scalania lub automatycznego dodawania numeru wydania do wiadomości zatwierdzenia.

commit-msg może być użyty do walidacji komunikatu o zatwierdzeniu dla twojego projektu. Może nie chcesz, aby ktokolwiek mógł wstawić komunikat o zatwierdzeniu, który po prostu mówi „radzenie sobie z białymi znakami”. Możesz użyć tego zaczepu, aby wykryć obecność słów białych znaków, a następnie wyjść i ostrzec użytkownika, że ​​potrzebują lepszego komunikatu o zatwierdzeniu.

post-commit uruchamia się po wszystkich powyższych hookach zmian. Jest to najbardziej przydatne w przypadku powiadomienia, że ​​dokonano zatwierdzenia.

Haki klienta

post-checkout jest uruchamiany po pomyślnym uruchomieniu polecenia git checkout. Jeśli masz zestaw dużych plików używanych w witrynie, ale nie chcesz ich w kontroli źródła, możesz użyć tego polecenia, aby przenieść pliki za Ciebie.

pre-push jest uruchamiany podczas polecenia git push, zanim jakiekolwiek obiekty zostaną przesłane do zdalnego repozytorium.

Hooki serwera

pre-receive jest uruchamiane, gdy klient wypchnął kod do zdalnego repozytorium. Może to służyć do sprawdzania wypychanego kodu, aby upewnić się, że spełnia on kryteria projektu przed zaakceptowaniem wypychania.

post-receive jest uruchamiany po odebraniu aktualizacji przez zdalne repozytorium. Może to być użyte do wywołania web hooka, który uruchamia proces wdrażania lub powiadamia pokój rozmów, że zatwierdzenie zostało odebrane i jest gotowe do przeglądu.

Wiele z powyższych haków można ustawić tak, aby działały tylko na określonych gałęziach. Może to oznaczać, że używasz haka post-receive tylko wtedy, gdy ktoś wypchnął kod do głównej gałęzi, który powinien być gotowy do wdrożenia. Lista programistów może zostać powiadomiona o przejrzeniu kodu, a następnie wdrożeniu go. W ten sposób zawsze będziesz mieć dwie pary oczu na wdrożeniu, co może oznaczać wyłapywanie błędów, które pojedynczy programista może łatwo przeoczyć.

Pominąłem niektóre dostępne haki, ponieważ nigdy nie widziałem potrzeby ich używania. Jednym z zestawów hooków, o którym nie mówiłem, są hooki przepływu pracy poczty e-mail. Jeśli nie akceptujesz poprawek do kodu za pośrednictwem poczty e-mail, prawdopodobnie nigdy ich nie będziesz potrzebować. Wszystkie dostępne hooki znajdziesz w dokumentacji.

W praktyce najczęściej używałem haczyków:

  • wstępne zatwierdzenie
  • pre-push
  • komunikat-zatwierdzenia
  • odbiór wstępny
  • po zatwierdzeniu
  • po otrzymaniu

Teraz zróbmy coś z tymi hakami.

Aktywacja wtyczki WordPress za pomocą WP Cli i Git Hooks

Dla jednego projektu klienta w tym roku dodawałem sklep i nadal wykonywałem kilka zadań na stronie głównej. Oznaczało to, że na głównej stronie nie zainstalowano ani nie aktywowano żadnej z naszych wtyczek WooCommerce. Potrzebowałem rozwijać sklep WooCommerce na jednym oddziale i dopiero gdy byłem gotowy, aby go uruchomić, chciałem przenieść WooCommerce do głównego.

Na początek potrzebujemy nowego oddziału o nazwie sklep. Możemy to uzyskać za pomocą git checkout -b store . To tworzy nowy oddział i sprawdza go za nas. Teraz przygotujmy hak.

Najpierw musimy utworzyć hak post-checkout za pomocą tego polecenia touch .git/hooks/post-checkout .

Następnie musimy uczynić go wykonywalnym. Możemy to zrobić za pomocą polecenia chmod z terminala chmod +x .git/hooks/post-checkout .

Teraz otwórz plik w wybranym edytorze kodu i skopiuj poniższy kod do pliku post-checkout .

#! /bin/bash

wp plugin activate woocommerce

echo "activated WooCommerce"

wp plugin activate automatewoo

echo "activated AutomateWoo"

Możesz to zademonstrować, przechodząc do dowolnego oddziału za pośrednictwem terminala. Powinieneś zobaczyć dwie linie informujące, że WooCommerce i AutomateWoo zostały aktywowane. Wiemy, że to działa, ale to nie jest to, czego chcemy, ponieważ włącza wtyczki za każdym razem, gdy przechodzimy do dowolnej gałęzi.

To, czego naprawdę chcemy, to włączać je, gdy przenosimy się do naszego oddziału sklepu, a następnie wyłączać je, gdy jesteśmy w naszym głównym oddziale. Aby to zrobić, potrzebujemy haka, który wykryje, do której gałęzi należymy. Zamień zawartość post-checkout na poniższy kod.

#! /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

Ten kod zaczyna się od przypisania gałęzi, którą sprawdzamy, do zmiennej branch_name . Następnie mamy dwa zdania if. Pierwsze sprawdza, czy przenieśliśmy się do oddziału sklepu. Jeśli mamy, używa WP CLI do aktywacji WooCommerce i AutomateWoo.

Następna instrukcja if sprawdza, czy jesteśmy na głównej gałęzi. Jeśli tak, dezaktywuje wtyczki z WP CLI i poinformuje nas o tym w terminalu.

Kontrolowanie przepływów pracy Git za pomocą haków Git

W poprzednim poście na Git mówiłem o różnych przepływach pracy Git. Jednym z bardzo powszechnych przypadków użycia hooków jest powstrzymanie kogokolwiek przed zatwierdzeniem kodu bezpośrednio do głównej gałęzi. Możesz użyć haka, aby upewnić się, że cały kod jest scalony z innej gałęzi do main.

Zacznij od zmiany nazwy pre-commit.sample na pre-commit , a następnie uczyń go wykonywalnym, jak opisałem powyżej. Następnie pobierz poniższy kod i użyj go w pliku 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

Sprawdza to, czy jesteśmy w głównej gałęzi, a jeśli tak, zatwierdzenie jest zatrzymane. Następnie wypisuje przypomnienie dla użytkownika, że ​​nie powinien on zatwierdzać bezpośrednio do głównej gałęzi.

Pamiętaj, że wiele miejsc zmienia się na main jako ich oddział. Starsze projekty mogą wymagać wprowadzenia tutaj master , jeśli nie zostały zaktualizowane.

Możesz nawet pójść o krok dalej i użyć cURL, aby uzyskać dostęp do interfejsu API aplikacji do czatu, a następnie publicznie narzekać, że ktoś próbował przejść do main.

Jedynymi ograniczeniami git hooków jest Twoja wyobraźnia. Możesz ich użyć, aby powstrzymać kogoś przed zatwierdzeniem, jeśli w jego kodzie znajduje się TODO lub zatrzymać białe znaki na końcu pliku.

Jeśli jakaś część przepływu pracy jest ciągłą przeszkodą, spójrz na hooki, aby ją zautomatyzować, aby nie trzeba było o tym pamiętać.