Implementace háků Gitu

Dokončeno

Stanovení priority kvality kódu v procesu vývoje by mělo začínat místním vývojem kódu. Je důležité identifikovat příležitosti pro tuto praxi i před zahájením žádostí o přijetí změn za účelem detekce a oprav potenciálních problémů s kvalitou kódu.

Git hooks nabízejí skvělou příležitost. Slouží jako mechanismus pro spouštění vlastních skriptů v reakci na významné události v rámci životního cyklu Gitu, jako jsou potvrzení, sloučení a zápisy. Skripty umístěné v adresáři .git\hooks úložiště poskytují prakticky neomezenou flexibilitu při automatizaci úloh vývoje softwaru a vynucování standardů vývoje.

Jak implementovat háky Gitu

Začněme prozkoumáním háků Git na straně klienta. Přejděte do adresáře úložiště .git\hooks – najdete mnoho souborů s příponou sample. Toto rozšíření nejen označuje jejich účel, ale také účinně brání jejich spuštění. Názvy souborů označují akce Gitu, které aktivují jejich spuštění, jakmile odeberete příponu sample.

snímek obrazovky se soubory Git hooku pro automatizaci

Přejmenujte soubor pre-commit sample na pre-commit. Jak název souboru označuje, skript, který obsahuje, se spustí při každém vyvolání akce potvrzení gitu. Potvrzení následuje pouze v případě, že se skript před potvrzením ukončí s návratovou hodnotou 0.

Je však důležité si uvědomit, že ve výchozím nastavení to nebude fungovat tak, jak je určeno v žádném z operačních systémů Windows. Často přehlédnutelný důvod tohoto chování je první řádek skriptu:

#!/bin/sh

V operačních systémech Linux (OS) je #! Předpona označuje zavaděči programu, že soubor obsahuje skript, který má být interpretován, a /bin/sh je úplná cesta k interpretu, který se má použít.

Git pro Windows sice podporuje příkazy Bash a skripty, ale při označování cest k systému souborů se neřídí stejnou konvencí. Místo toho musíte zadat úplnou cestu k souboru sh.exe počínaje písmenem jednotky.

Existuje však další upozornění, které je výsledkem faktu, že Git pro Windows se ve výchozím nastavení nainstaluje do adresáře C:\Program Files. Vzhledem k tomu, že tento adresář obsahuje mezeru v názvu, výsledná cesta k souboru sh.exe by se interpretovala jako dvě samostatné cesty, což vede k selhání. Aby se tomu zabránilo, je nutné před mezeru přidat jedno zpětné lomítko (\), které bude sloužit jako escape znak. Při použití 64bitové verze Gitu pro Windows by měl mít první řádek skriptu následující formát:

#!C:/Program\ Files/Git/usr/bin/sh.exe

Jak to udělat

Jak můžete využít nově objevené funkce skriptů předcommitu Git? Co kdybychom vás zastavili, abyste omylem neodhalovali tajemství na GitHub?

Použijme hook Git k prohledání kódu při jeho potvrzování do vašeho místního úložiště pro specifická klíčová slova. Obsah souboru shellu před potvrzením změn nahraďte následujícím kódem:

#!C:/Program\ Files/Git/usr/bin/sh.exe
matches=$(git diff-index --patch HEAD | grep '^+' | grep -Pi 'password|secret')
if [ ! -z "$matches" ]
then
  cat <<\EOT
Error: Words from the blocked list were present in the diff:
EOT
echo $matches
exit 1
fi

Tento příklad je určen k ilustraci konceptu spíše než plnohodnotného řešení, takže seznam klíčových slov je záměrně triviální. Pomocí regulárních výrazů můžete výrazně rozšířit rozsah a flexibilitu. Máte také možnost odkazovat na externí soubor, který by výrazně zjednodušil průběžnou údržbu.

Jak to funguje

Po vyvolání skript háku předběžného potvrzení používá příkazy git diff a grep k identifikaci klíčových slov nebo vzorů v rámci přírůstkových změn potvrzeného kódu. Pokud se zjistí nějaké shody, skript vygeneruje chybovou zprávu a zabrání potvrzení.

Další možnosti:

Mezi běžné případy použití skriptů háku před potvrzením patří formátování kódu, lintování nebo spouštění vlastních testů, aby se zajistilo, že potvrzení dodržuje standardy projektu. Prepare-commit-msg se spustí před otevřením editoru pro zprávu o potvrzení. Umožňuje dynamické generování potvrzovacích zpráv, aby bylo možné vynucovat názvové konvence, jako je použití určených předpon (například feat: pro funkce nebo fix: pro opravy chyb).

Například následující skript prepare-commit-msg automaticky přidá název aktuální větve na začátek komitové zprávy při vytváření nového komitu. Upraví soubor zprávy potvrzení ($1) přidáním názvu větve následovaného dvojtečkou a mezerou na začátku souboru.

#!C:/Program\ Files/Git/usr/bin/sh.exe
# Get the current branch name
branch_name=$(git branch --show-current)
# Check if the commit message file exists
if [[ -f "$1" ]]; then
  # Prepend the branch name to the commit message
  sed -i "1s/^/$branch_name: /" "$1"
fi

Po dokončení potvrzení se skripty spustí. Dá se použít k aktivaci oznámení nebo generování dokumentace.

Následující skript například po každém potvrzení odešle určenému příjemci e-mailové oznámení. Skript lze přizpůsobit úpravou e-mailové adresy příjemce, serveru SMTP a předmětu a textu e-mailu. Kromě toho možná budete muset nakonfigurovat systém tak, aby odesílal e-maily pomocí rutiny Send-MailMessage PowerShellu, nebo použít jinou metodu odesílání oznámení v závislosti na vašem prostředí a požadavcích.

#!C:/Program\ Files/Git/usr/bin/sh.exe
# Set the recipient email address
$recipient="your@email.com"
# Set the subject of the email
$subject="Git Commit Notification"
# Set the body of the email
$body="A new commit has been made to the repository."
# Send the email notification
Send-MailMessage -To $recipient -Subject $subject -Body $body -SmtpServer "your.smtp.server"

Stojí za zmínku, že složka .git\hooks v repozitáři není zahrnuta do verzovacího systému. Možná vás zajímá, jestli existuje způsob, jak sdílet skripty, které jste vytvořili s ostatními členy vývojového týmu. Dobrou zprávou je, že počínaje verzí Gitu 2.9 můžete přiřadit git hooky do složky, kterou lze začlenit do správy verzí. Můžete to udělat tak, že aktualizujete konfiguraci globálního nastavení pro vaše úložiště Git:

Git config --global core.hooksPath '~/.githooks'

Pokud někdy potřebujete přepsat háky Gitu, které jste nastavili na straně klienta, můžete to udělat pomocí přepínače bez ověření:

Git commit --no-verify

Server-Side háky

I když háky Git na straně klienta nabízejí robustní možnosti pro vylepšení pracovního postupu vývoje, Azure Repos také poskytuje háky na straně serveru pro další rozšíření procesu vývoje, včetně podpory pro vytváření žádostí o přijetí změn. Další informace najdete v referenční dokumentaci k událostem webhooků služby Azure Repos .