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.

Háky Gitu 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 tam 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ů určují akce Gitu, které aktivují jejich spuštění, jakmile rozšíření odeberete sample .

Snímek obrazovky se soubory háku Gitu pro automatizaci

Přejmenujte soubor předběžného potvrzení sample na předběžné potvrzení. 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 je #! Předpona označuje zavaděč programu, že zbytek souboru obsahuje skript, který se má interpretovat, a /bin/sh je úplná cesta k interpretu, který se má použít.

Git pro Windows sice podporuje příkazy Bash a skripty prostředí, ale při navrhová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 řídicí 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 použít nově zjištěné funkce skriptů před potvrzením Gitu? Co když vás zastavíte v náhodném úniku tajných kódů na GitHub?

Pojďme pomocí háku Git naskenovat kód, který se potvrdí do místního úložiště, konkrétní klíčová slova. Obsah souboru prostředí před potvrzením 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. Příprava-commit-msg se spustí před spuštěním editoru zpráv potvrzení. Umožňuje dynamické generování zpráv potvrzení, aby bylo možné vynucovat konvence vytváření názvů, jako je použití určených předpon (například feat: pro funkce nebo opravu: pro opravy chyb).

Například následující skript prepare-commit-msg automaticky předzálohuje název aktuální větve na zprávu potvrzení při vytváření nového potvrzení. Upraví soubor zprávy potvrzení ($1) přidáním názvu větve následovaného dvojtečka 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 po potvrzení 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 PowerShellu Send-MailMessage, 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 úložiště .git\hooks složka není potvrzena do správy zdrojového kódu. 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 Gitem verze 2.9 můžete mapovat háky Gitu do složky, která se dá potvrdit do správy zdrojového kódu. 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

Háčky na straně serveru

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ích informacích k událostem připojení služby Azure Repos Service.