Git Hooks With Hugo
I recently joined tilde.team and wanted to host to start using the http hosting to document some technical learnings…I don’t have the greatest memory and writing things down helps with retention, as well as giving me a reference place of my own for things I’ve already learned (and since forgotten). To kick this off, I thought I should document the workflow for publishing new content…I’ve done this once or twice before but always forget the steps.
Requirements
For both your local and remote machines, you will need:
- git
- hugo
- ssh access
Remote Machine Setup
Login to your remote machine using ssh
ssh user@remote.machine
Create a --bare
git repository
git init --bare my-website.git
Local Machine Setup
First, create a hugo site on your local machine
hugo new site my-hugo-site
cd my-hugo-site
Initialize the directory as a git repository
git init
Add your remote machine as a remote
git remote add prod ssh://user@remote.machine:/home/user/my-website.git
That should be it for your local machine.
Git hooks
In your remote git repo, create a new git-hook, From your git directory:
cd hooks
nvim post-receive
I modified the code from a Digital Ocean tutorial…only slightly though. The script from that site has a flag to set the baseUrl on the command line, but I set this in the config.toml of my hugo site.
#!/bin/bash
GIT_REPO=$HOME/my-website.git
WORKING_DIRECTORY=$HOME/my-website-working
PUBLIC_WWW=$HOME/public_html
BACKUP_WWW=$HOME/backup_html
set -e
rm -rf $WORKING_DIRECTORY
rsync -aqz $PUBLIC_WWW/ $BACKUP_WWW
trap "echo 'A problem occurred. Reverting to backup.'; rsync -aqz --del $BACKUP_WWW/ $PUBLIC_WWW; rm -rf $WORKING_DIRECTORY" EXIT
git clone $GIT_REPO $WORKING_DIRECTORY
rm -rf $PUBLIC_WWW/*
/usr/bin/hugo -s $WORKING_DIRECTORY -d $PUBLIC_WWW --cacheDir /home/user/.cache/hugo
rm -rf $WORKING_DIRECTORY
trap - EXIT
Publishing
Now, after you create any new content on your local machine you can git push prod
, and when your remote machine receives update it will automatically rebuild your Hugo site.
~rockorager