Post będzie bardzo krótki ale według mnie bardzo przydatny.
Bardzo często zdarza się tak że robimy commit, push patrzymy po kilku minutach w PR/MR a tu błędy PSR, Unity się wywaliły itd. Za pomocą pre commit chce Ci pokazać prosty sposób jak uniknąć takich sytuacji i zaoszczędzić Ci sporo czasu.
Czym jest pre commit
Pre commit to hook gita który jest wykonywany przed samym commitem. Jeśli dojdzie do sytuacji w której hook zwróci nam błędny kod commit np. wywalą nam się testy jednostkowe commit nie jest zatwierdzany.
Jedynym odstępstwem jest sytuacja w której wykorzystujemy flagę --no-verify. Gdy użyjemy tej flagi git nie wykonuję hooka a co za tym idzie commit jest zawsze od razu zatwierdzany.
Odrobina teorii
Gdy wejdziesz w swoim repozytorium pod path .git/hooks znajdziesz tam sporo plików. Są to przykładowe rozwiązania hooków. Jeśli chcesz je przetestować wystarczy że usuniesz rozszerzenie sample i zostawisz samą nazwę np. pre-commit.
Musisz też wiedzieć że niestety nie dodasz tych hooków po prostu do repozytorium tak aby każdy je miał. Aby zarządzać nimi w zespole musisz znaleźć inne rozwiązanie np. osobne repo + skrypt w shelu.
Pamiętaj też że nazwa pliku musi być identyczna jak nazwa hooka. Jeśli podasz nazwę inną niż oczekiwanego hooka twój kod może się wykonać na innym hooku bądź po prostu nigdy się nie wykona.
Pora na przykład
Zaczniemy od stworzenia jakiegoś testu jednostkowego który posłuży nam do weryfikacji działania hooka.
<?php
declare(strict_types=1);
namespace App\Tests;
use PHPUnit\Framework\TestCase;
class Test extends TestCase
{
/**
* @test
*/
public function sample(): void
{
self::assertTrue(true);
}
}
Teraz pora na najważniejszą część czyli sam hook. Jest on banalnie prosty ale w tym przypadku uznałem że przerośnięty przykład nie ma sensu. Tak naprawdę tylko twoja wyobraźnia ogranicza możliwości użycia pre-commita.
#!/bin/sh symfony php bin/phpunit
Gdy wykonasz commit wszystko przejdzie prawidłowo ale gdy zrobisz jakikolwiek błąd w teście commit się nie wykona. 😉 Tak jak wspominałem powyżej możesz zrobić commit mimo błędu ale gdy użyjesz opcji --no-verify.
Podsumowanie
Przeszedłeś ścieżkę jak upraszcza naszą codzienną prace pre commit ale na tym możliwości się nie kończą. Git ma sporo hooków których możesz użyć do różnych rzeczy ogranicza Cię tylko twoja wyobraźnia i czas. 🙂
Chciałbym Cię również zaprosić do mojej serii wpisów odnośnie Varnisha [TUTAJ] gdzie opisuję całą ścieżkę mojej nauki Varnisha. 🙂
Źródła:
- https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks
- https://www.atlassian.com/git/tutorials/git-hooks