A Blogging Platform
Tags: aws, github, hugo
Published: 2020-08-03 03:39:29

Well, this isn't the first time I've used [Hugo](https://gohugo.io/), but each time I go to look for a nice blogging platform, I keep returning to its simplicity. While I miss some of the plugins that you get out of the box with WordPress etc, I find Hugo a lot easier to customize. 

Super fast summary would be that you write your posts in [Markdown](https://www.markdownguide.org/) and Hugo
transforms this into a static website. Being a static website, you can simply throw it up onto [AWS S3](https://aws.amazon.com/s3/) to host it. Maybe do a little magic with [AWS CloudFront](https://aws.amazon.com/cloudfront/) if you want!

This time around also gave me a chance to play with [GitHub Actions](https://github.com/features/actions). I've tended to keep build internal to AWS to manage everything via permissions, though the heavy lifting of setting up an AWS CodePipeline to execute the AWS CodeBuild buildspec just to generate the HTML and sync it with S3, feels like it could be simpler - to match Hugo!

So took my old buildspec: 
```
version: 0.1

phases:
  install:
    commands:
      - curl -Ls https://github.com/spf13/hugo/releases/download/v0.59.1/hugo_0.59.1_Linux-64bit.tar.gz -o /tmp/hugo.tar.gz
      - tar xf /tmp/hugo.tar.gz -C /tmp
  build:
    commands:
      - /tmp/hugo
  post_build:
    commands:
      - aws s3 sync --delete --acl public-read public s3://s3-bucket-name
```

and used the Hugo deploy feature with GitHub Actions that I found on [MonkeyPatch's](https://monkeypatch.ca/hugo_s3/) site: 
```
name: Build and Deploy

on: push

jobs:
  build:
    name: Build and Deploy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Install Hugo
        run: |
          HUGO_DOWNLOAD=hugo_extended_${HUGO_VERSION}_Linux-64bit.tar.gz
          wget https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/${HUGO_DOWNLOAD}
          tar xvzf ${HUGO_DOWNLOAD} hugo
          mv hugo $HOME/hugo
        env:
          HUGO_VERSION: 0.59.1
      - name: Hugo Build
        run: cd $GITHUB_WORKSPACE/website && $HOME/hugo -v
      - name: Deploy to S3
        if: github.ref == 'refs/heads/master'
        run: cd $GITHUB_WORKSPACE/website && $HOME/hugo -v deploy --maxDeletes -1
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
```

This now allowed my to embed the configuration of the upload into Hugo's own config file:
```
[deployment]
order = [".png$", ".jpg$", ".gif$", ".svg$"]

[[deployment.targets]]
URL = "s3://s3-bucket-name?region=region-name"

[[deployment.matchers]]
# Cache static assets for 20 years.
pattern = "^.+\\.(js|css|png|jpg|gif|svg|ttf)$"
cacheControl = "max-age=630720000, no-transform, public"
gzip = true

[[deployment.matchers]]
pattern = "^.+\\.(html|xml|json)$"
gzip = true
```

This is obviously the most basic use of GitHub Actions, a one step pipeline with no artifacts etc generated. Looking at the
monthly cost side, I guess AWS would be $1 for the CodePipeline, and with the CodeBuild taking under 1 minute that would be $0.005 per update. GitHub Actions is billed out by the minute, with the first 2000 minutes free. After that its $4 for an extra 1000 updates. So if we max out at 2000 updates... hahaha... it would cost me $11 on the AWS, and still free on GitHub Actions.

I'll be curious how this scales with more complex and longer running pipelines.