Git Hooks

Pubblicato: 2022-07-02

Git è un potente sistema di controllo della versione su cui abbiamo appena scalfito la superficie negli ultimi post. Oggi esamineremo la potenza di automazione che Git può darti con Git Hooks.

Ogni repository ottiene hook integrati quando usi il comando git init . Quando un repository viene inizializzato, ottieni una directory .git nascosta e al suo interno c'è una directory chiamata hooks che conterrà tutti i tuoi hook. Apri qualsiasi repository git che hai a portata di mano e usa ls -a per vedere la directory nascosta, quindi aprila nel tuo editor di codice preferito.

Per iniziare vedrai un sacco di file con estensioni di file .sample . Questi sono esattamente ciò che dicono, script di esempio che potresti utilizzare nei tuoi progetti. I file sono denominati in modo da corrispondere all'hook su cui vengono eseguiti. Quindi post-commit.sample viene eseguito sull'hook post-commit .

Puoi usare praticamente qualsiasi linguaggio per scrivere un hook. Il file viene analizzato in base alla notazione shebang nella parte superiore del file. Se volessi usare node useresti #! /usr/bindi/env node #! /usr/bindi/env node e il tuo file verranno analizzati come un file del nodo.

Prima di approfondire cosa puoi fare con gli hook git, diamo un'occhiata ad alcuni degli hook che sono disponibili per te.

Tipi di ganci Git

Confermare gli hook del flusso di lavoro

pre-commit viene eseguito prima ancora di inserire il messaggio di commit e può essere aggirato con git commit --no-verify .

prepare-commit-msg può essere utilizzato per modificare il messaggio predefinito che vedi nel messaggio di commit. Usalo per dare istruzioni agli sviluppatori sul tipo di messaggio di commit che dovrebbero lasciare. Può anche essere utilizzato per automatizzare il contenuto di dove il messaggio viene generato automaticamente per te, come unioni o per aggiungere automaticamente un numero di problema al tuo messaggio di commit.

commit-msg può essere utilizzato per convalidare il messaggio di commit per il tuo progetto. Forse non vuoi che nessuno sia in grado di inserire un messaggio di commit che dice semplicemente "trattare con lo spazio bianco". È possibile utilizzare questo hook per rilevare la presenza delle parole spazio bianco e quindi uscire e fornire un avviso all'utente che deve avere un messaggio di commit migliore.

post-commit viene eseguito dopo tutti gli hook di commit sopra. È molto utile per una notifica che è stato effettuato un commit.

Ganci del cliente

post-checkout viene eseguito dopo aver eseguito con successo un comando git checkout. Se hai un set di file di grandi dimensioni utilizzato sul sito ma non li desideri nel controllo del codice sorgente, puoi utilizzare questo comando per spostare i file per te.

pre-push viene eseguito durante un comando git push prima che qualsiasi oggetto venga trasferito al repository remoto.

Ganci del server

pre-receive viene eseguita quando un client ha inviato il codice a un repository remoto. Questo può essere usato per controllare il codice che viene inviato per assicurarsi che soddisfi i criteri del tuo progetto prima di accettare il push.

post-receive viene eseguito dopo che il repository remoto ha ricevuto gli aggiornamenti. Questo potrebbe essere utilizzato per chiamare un web hook che attiva un processo di distribuzione o notificare a una chat room che un commit è stato ricevuto ed è pronto per la revisione.

Molti dei ganci sopra possono essere impostati per funzionare solo su rami specifici. Ciò può significare quando si utilizza un hook post-receive solo quando qualcuno ha inviato il codice al ramo principale che dovrebbe essere pronto per la distribuzione. È possibile che un elenco di sviluppatori venga avvisato di esaminare il codice e quindi distribuirlo. In questo modo avresti sempre 2 serie di occhi su una distribuzione, il che può significare rilevare errori che un singolo sviluppatore può facilmente perdere.

Ho saltato alcuni degli hook disponibili perché non ho mai visto la necessità di usarli. Una serie di hook di cui non ho parlato sono gli hook del flusso di lavoro e-mail. Se non accetti patch al tuo codice via e-mail, probabilmente non ne avrai mai bisogno. Puoi trovare tutti gli hook disponibili nella documentazione.

In pratica gli hook che ho usato di più sono:

  • pre-impegno
  • pre-spinta
  • commit-msg
  • pre-ricezione
  • post-commissione
  • post-ricezione

Ora facciamo qualcosa con questi ganci.

Attivazione di un plugin per WordPress con WP Cli e Git Hooks

Per un progetto cliente quest'anno stavo aggiungendo un negozio e continuavo a svolgere alcune attività sul sito principale. Ciò significava che sul sito principale non era installato o attivato nessuno dei nostri plugin WooCommerce. Avevo bisogno di sviluppare il negozio WooCommerce su una filiale e solo una volta che ero pronto a spingere tutto dal vivo, volevo spostare WooCommerce su principale.

Per iniziare avremo bisogno di una nuova filiale chiamata store. Possiamo ottenerlo usando git checkout -b store . Questo crea un nuovo ramo e lo verifica per noi. Ora prepariamo il gancio.

Per prima cosa dobbiamo creare l'hook post-checkout con questo comando touch .git/hooks/post-checkout .

Quindi dobbiamo renderlo eseguibile. Possiamo farlo con il comando chmod dal terminale chmod +x .git/hooks/post-checkout .

Ora apri il file nel tuo editor di codice preferito e copia il codice qui sotto nel tuo file post-checkout .

#! /bin/bash

wp plugin activate woocommerce

echo "activated WooCommerce"

wp plugin activate automatewoo

echo "activated AutomateWoo"

Puoi dimostrarlo passando a qualsiasi ramo tramite terminale. Dovresti vedere due righe che ti dicono che WooCommerce e AutomateWoo sono stati attivati. Sappiamo che sta funzionando, ma non è proprio quello che vogliamo perché attiverà i plugin ogni volta che passiamo a qualsiasi ramo.

Quello che vogliamo veramente è accenderli quando ci spostiamo nella nostra filiale del negozio, e poi spegnerli quando siamo nella nostra filiale principale. Per farlo avremo bisogno dell'hook per rilevare quale ramo siamo uno. Scambia il contenuto del post-checkout con il codice qui sotto.

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

Questo codice inizia assegnando il ramo che stiamo verificando alla variabile branch_name . Quindi abbiamo due affermazioni if. I primi controlli per vedere se ci siamo trasferiti in filiale del negozio. Se lo abbiamo, usa WP CLI per attivare WooCommerce e AutomateWoo.

La successiva istruzione if verifica se siamo sul ramo principale. Se lo siamo, disattiverà i plugin con WP CLI e ce ne parlerà nel terminale.

Controllo dei flussi di lavoro Git con Git Hooks

In un post precedente su Git ho parlato di diversi flussi di lavoro Git. Un caso d'uso molto comune per gli hook è impedire a chiunque di eseguire il commit del codice direttamente nel ramo principale. Puoi usare un hook per assicurarti che tutto il codice sia unito da un ramo diverso a main.

Inizia rinominando pre-commit.sample in pre-commit e quindi rendilo eseguibile come ho descritto sopra. Quindi prendi il codice qui sotto e usalo nel file di 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

Questo controlla se siamo sul ramo principale e, in tal caso, il commit viene interrotto. Quindi stampa un promemoria per l'utente che non dovrebbe impegnarsi direttamente nel ramo principale.

Ricorda che molti posti stanno cambiando in main come filiale. I progetti più vecchi potrebbero aver bisogno di un master in atto qui se non sono stati aggiornati.

Potresti anche fare un ulteriore passo avanti e utilizzare cURL per accedere all'API di un'app di chat e quindi lamentarti pubblicamente che qualcuno ha cercato di impegnarsi su main.

Le uniche limitazioni dei git hook sono la tua immaginazione. Potresti usarli per impedire a qualcuno di impegnarsi se un TODO è presente nel suo codice o per fermare gli spazi bianchi alla fine di un file.

Se hai una parte del tuo flusso di lavoro che è un ostacolo continuo, guarda gli hook per automatizzarlo, in modo da non doverlo ricordare.