Git-hooks implementeren
Het prioriteren van codekwaliteit in het ontwikkelingsproces moet beginnen met het ontwikkelen van lokale code. Het is belangrijk om kansen voor deze praktijk te identificeren, zelfs voordat u pull-aanvragen start om potentiële problemen met codekwaliteit te detecteren en op te lossen.
Git hooks bieden een geweldige kans. Ze fungeren als mechanisme voor het uitvoeren van aangepaste scripts als reactie op belangrijke gebeurtenissen binnen de Git-levenscyclus, zoals doorvoeringen, samenvoegingen en pushes. De scripts, die zich in de map .git\hooks van de opslagplaats bevinden, bieden vrijwel onbeperkte flexibiliteit bij het automatiseren van softwareontwikkelingstaken en het afdwingen van ontwikkelingsstandaarden.
Git-hooks implementeren
Laten we beginnen met het verkennen van Git-hooks aan de clientzijde. Navigeer naar de map .git\hooks van de opslagplaats. U vindt er veel bestanden met de extensie sample
. Deze extensie geeft niet alleen hun doel aan, maar voorkomt ook effectief dat ze worden uitgevoerd. De bestandsnamen wijzen de Git-acties aan die de uitvoering activeren zodra u de sample
extensie verwijdert.
Wijzig de naam van het bestand vóór doorvoeren sample
in vooraf doorvoeren. Zoals de naam van het bestand aangeeft, wordt het script dat het bevat, uitgevoerd wanneer u de git-doorvoeractie aanroept. De doorvoering volgt alleen als uw script vóór doorvoer wordt afgesloten met de retourwaarde 0.
Het is echter belangrijk om te weten dat dit standaard niet werkt zoals bedoeld in een van de Windows-besturingssystemen. De veelvoorkomende reden voor dit gedrag is de eerste regel van het script:
#!/bin/sh
Op Linux-besturingssystemen, de #! voorvoegsel geeft aan aan het programmalaadprogramma dat de rest van het bestand een script bevat dat moet worden geïnterpreteerd en /bin/sh het volledige pad is naar de interpreter die moet worden gebruikt.
Hoewel Git voor Windows ondersteuning biedt voor Bash-opdrachten en shellscripts, wordt niet dezelfde conventie gevolgd bij het toewijzen van bestandssysteempaden. In plaats daarvan moet u het volledige pad naar het bestand sh.exe opgeven, te beginnen met de stationsletter.
Er is echter een extra voorbehoud, wat het gevolg is van het feit dat Git voor Windows standaard wordt geïnstalleerd in de map C:\Program Files. Omdat deze map een spatie in de naam bevat, wordt het resulterende pad naar het sh.exe-bestand geïnterpreteerd als twee afzonderlijke paden, wat resulteert in een fout. Om dit te voorkomen, moet u één backslash (\) voor de ruimte toevoegen om als escape-teken te fungeren. Wanneer u de 64-bits versie van Git voor Windows gebruikt, moet de eerste regel van het script de volgende indeling hebben:
#!C:/Program\ Files/Git/usr/bin/sh.exe
Hoe kunt u het doen?
Hoe kunt u de zojuist gedetecteerde functionaliteit van Vooraf doorvoerende Git-scripts gebruiken? Hoe zit het met het stoppen van het per ongeluk lekken van geheimen naar GitHub?
Laten we de Git-hook gebruiken om de code te scannen die wordt doorgevoerd in uw lokale opslagplaats voor specifieke trefwoorden. Vervang de inhoud van het shell-bestand vooraf doorvoeren door de volgende code:
#!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
Dit voorbeeld is bedoeld om het concept te illustreren in plaats van een volwaardige oplossing, dus de lijst met trefwoorden is opzettelijk triviaal. Met behulp van reguliere expressies kunt u het bereik en de flexibiliteit aanzienlijk uitbreiden. U hebt ook de mogelijkheid om naar een extern bestand te verwijzen, waardoor doorlopend onderhoud aanzienlijk wordt vereenvoudigd.
Hoe het werkt
Nadat het hookscript vooraf is aangeroepen, worden de git-diff- en grep-opdrachten gebruikt om trefwoorden of patronen in de incrementele wijzigingen in de code te identificeren die worden doorgevoerd. Als er overeenkomsten worden gedetecteerd, genereert het script een foutbericht en voorkomt u dat de doorvoer plaatsvindt.
Er is meer:
Andere veelvoorkomende gebruiksvoorbeelden van vooraf doorvoerende hookscripts zijn codeopmaak, linting of het uitvoeren van aangepaste tests om ervoor te zorgen dat de doorvoer voldoet aan projectstandaarden. Prepare-commit-msg wordt uitgevoerd voordat de editor voor doorvoerberichten wordt gestart. Hiermee kunt u dynamische doorvoerberichten genereren om naamconventies af te dwingen, zoals het gebruik van aangewezen voorvoegsels (bijvoorbeeld feat: voor functies of oplossingen: voor bugfixes).
Met het volgende script prepare-commit-msg wordt bijvoorbeeld automatisch de naam van de huidige vertakking voorafgegaan aan het doorvoerbericht bij het maken van een nieuwe doorvoering. Het doorvoerberichtbestand ($1) wordt gewijzigd door de naam van de vertakking toe te voegen, gevolgd door een dubbele punt en spatie aan het begin van het bestand.
#!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
Scripts na doorvoer worden uitgevoerd nadat een doorvoering is voltooid. Het kan worden gebruikt om meldingen te activeren of documentatie te genereren.
Met het volgende script wordt bijvoorbeeld een e-mailmelding verzonden naar een aangewezen geadresseerde na elke doorvoering. Het script kan worden aangepast door het e-mailadres van de geadresseerde, de SMTP-server en het onderwerp en de hoofdtekst van het e-mailbericht te wijzigen. Daarnaast moet u mogelijk uw systeem configureren voor het verzenden van e-mailberichten met behulp van de PowerShell-cmdlet Send-MailMessage of een andere methode gebruiken om meldingen te verzenden, afhankelijk van uw omgeving en vereisten.
#!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"
Het is de moeite waard om te vermelden dat de map .git\hooks van de opslagplaats niet is doorgevoerd in broncodebeheer. U vraagt zich misschien af of er een manier is om de scripts te delen die u hebt ontwikkeld met een ander lid van uw ontwikkelteam. Het goede nieuws is dat u, vanaf Git versie 2.9, Git-hooks kunt toewijzen aan een map die kan worden doorgevoerd in broncodebeheer. U kunt dit doen door de algemene instellingenconfiguratie voor uw Git-opslagplaats bij te werken:
Git config --global core.hooksPath '~/.githooks'
Als u de Git-hooks die u hebt ingesteld aan de clientzijde moet overschrijven, kunt u dit doen met behulp van de switch zonder verificatie:
Git commit --no-verify
Haakjes aan de serverzijde
Git-hooks aan de clientzijde bieden robuuste mogelijkheden voor het verbeteren van de ontwikkelwerkstroom, maar Azure Repos biedt ook haakjes aan de serverzijde om het ontwikkelingsproces verder te verbeteren, inclusief ondersteuning voor het maken van pull-aanvragen. Zie de naslaginformatie over gebeurtenissen in Azure Repos Service voor meer informatie.