Website CI Pipeline
I just want my websites to update without my intervention, so what do I do? Obviously, I make a set of easily deployed tools that rely upon an infrastructure that’s been setup previously (maybe one day I’ll make a post about my gitea server and how I set it up to update automagically).
So what did I do, anyway? Well, for starters, I’ve got a SmartOS hypervisor running, which then has a base-64 zone setup. Once a zone has been setup, there are a few packages that are required.
pkgin in nginx
If you need to build hugo as well, you’ll need to also install
pkgin in nginx build-essential go
Alright, we’re getting there. We’ve got a lot of tools, but have basically done nothing (yet). We still have to build some software (this can be done in a separate zone).
mkdir ~/src && cd ~/src git clone https://github.com/gohugoio/hugo.git cd hugo CGO_ENABLED=1 go install --tags extended cp ~/go/bin/hugo /opt/local/bin/hugo
Its as simple as that. Hugo will take a few minutes to build. I went for a coffee while it built.
Cloning Website and Testing Hugo⌗
In proper fashion, we aught to actually test our tools. I went ahead and
cloned my website’s source code to
/opt. Make sure to also pull any
cd /opt && git clone https://git.kararou.space/karaiwulf/www-fakewebsite.git cd www-fakewebsite git submodule update --init --recursive hugo
At this point, hugo should have built your website and it should be available
/opt/www-fakewebsite/public directory. Modify the nginx config
/opt/local/etc/nginx/nginx.conf) to point to this directory, then
svcadm enable nginx.
If all has gone well, you’ll be able to see your website when you navigate to the server’s IP address or domain name.
Automated Update Script⌗
Okay, so we’ve built ourselves yet another tool then placed it in
/opt/local/bin. Awesome. Now how to we make it automatically build? I
built a script!
#!/usr/bin/bash #/opt/local/bin/auto-update.sh #TODO: Make me executable using #chmod +x /opt/local/bin/auto-update.sh while true do cd /opt/www-fakewebsite /opt/local/bin/git pull /opt/local/bin/git submodule update --init --recursive /opt/local/bin/hugo sleep 600 done
Okay, but this is just a script, how does it run? Well, you could set it on a cronjob, but that’d be a bit silly, since we don’t want multiple instances of this script running. So I used smfgen to make a service manifest for it.
npm install -g smfgen smfgen -i site-update -l 'Example Site Auto-Update Service' \ -s '/opt/local/bin/auto-update.sh' -d /opt/www-fakewebsite \ -eHOME=/root > ~/update.xml
-eHOME=/root because we were using the git credential helper to store
Alright fine, here’s a script, have fun:
# Configuration Parameter GITREPO=https://change.me/now/because_i_dont_work.git echo "This will setup a hugo website on a SmartOS machine." echo "GITREPO is set to $GITREPO" echo "If that isn't correct, please CTRL+C NOW\!" # Installing Depends echo "Installing depends..." pkgin in go build-essential nginx # Build Hugo echo "Cloning Hugo to /opt/src/hugo" if [ -d /opt/src ] || mkdir /opt/src git clone https://github.com/gohugoio/hugo.git /opt/src/hugo cd /opt/src/hugo echo "Building Hugo now..." CGO_ENABLED=1 go install --tags extended cp $HOME/go/bin/hugo /opt/local/bin/hugo # Clone Site echo "Cloning site..." git config --global credential.helper store git clone $GITREPO /opt/hugosite cd /opt/hugosite echo "Updating submodules..." git submodule update --init --recursive # Modify nginx default config echo "Modifying nginx config..." sed -i 's/share\/examples\/nginx\/html/\/opt\/hugosite\/public/g' \ /opt/local/etc/nginx/nginx.conf svcadm enable nginx # Setup Automated Script echo "Automating the updates\!" cat << EOF > /opt/local/bin/auto-update.sh #!/usr/bin/bash while true do cd /opt/hugosite /opt/local/bin/git pull /opt/local/bin/git submodule update --init --recursive /opt/local/bin/hugo sleep 600 done EOF chmod +x /opt/local/bin/auto-update.sh npm install -g smfgen smfgen -i site-update -l 'Example Site Auto-Update Service' \ -s '/opt/local/bin/auto-update.sh' -d /opt/hugosite \ -eHOME=/root > /tmp/update.xml svccfg import /tmp/update.xml echo "Awesome, you're all setup now\!" echo "Just push changes to the git repo you specified\!"