Update: I’m now using BitBucket Pipelines instead.

Since moving this site to S3, I have been using a post-commit hook to deploy it with s3cmd, which looks like this:

bucket='andrew-jones.com'

branch=$(git rev-parse --abbrev-ref HEAD)

if [[ "$branch" == "master" ]]; then
  hugo
  echo "Syncing public/* with s3://$bucket."
  s3cmd --acl-public --no-delete-removed --no-progress --cf-invalidate --acl-public sync public/* s3://$bucket
  echo -e "\nUpdated s3://$bucket."
fi

That worked OK, but it’s not great that it depends on my environment. I use two computers and want to be able to update this site from either of them, and I want to ensure they are built in exactly the same way with the same versions of Hugo and s3cmd.

So I looked around for a cloud hosted continuous delivery platform and eventually came across Wercker. It’s a Docker based service that is fully integrated with Bitbucket (where I host my repository), and has an impressive free plan.

Specifying the build steps is done using a simple yaml file, and by following this guide on the hugo website I got it up and running in no time, swapping the Git pages deploy step with this:

deploy:
    steps:
    - arjen/s3sync@2.0.4:
        key-id: $KEY
        key-secret: $SECRET
        bucket-url: s3://andrew-jones.com
        source-dir: public
        delete-removed: false
        opts: --no-delete-removed --no-progress --cf-invalidate --acl-public

I’m very impressed with Wercker - it couldn’t have been easier to get this done. Look forward to using it for more of my personal projects.