Using custom software with Github Actions to deploy a site

post, Mar 10, 2024, on Mitja Felicijan's blog

By default, GitHub uses Jekyll for their site generator which is fine, but it has some issues and the complexity is not really worth it for me.

You could argue that Jekyll is simple, which it is to some degree, but it can become complicated quite quickly if you start adding your own spin on things.

A while ago I wrote a simple static site generator called "jbmafp - Just Build Me A Fucking Page" which was a protest against Hugo. Hugo is fine but again, if you try doing something that conflicts with the dogma they prescribe you are in trouble.

I also moved this blog from self-hosted virtual machine to just GitHub Pages. I didn't want to bother myself managing that server anymore. And this presented a slight problem because I didn't want to use the default _docs folder GitHub wants you to use, and I also didn't want to upload public folder that gets generated to GitHub.

Thankfully, there is a way to use custom software to generate your site like jbmafp.

To achieve this you need to create a file .github/workflows/deploy.yaml in the root of your repository.

name: Build and Deploy to Pages

on:
  push:
    branches: ["master"]
  workflow_dispatch:

permissions:
  contents: read
  pages: write
  id-token: write

concurrency:
  group: "pages"
  cancel-in-progress: false

jobs:
  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Setup Pages
        uses: actions/configure-pages@v3
      - name: Run a multi-line script
        run: |
          wget https://github.com/mitjafelicijan/jbmafp/releases/download/v0.1/jbmafp.zip
          unzip jbmafp.zip
          chmod +x jbmafp
          ./jbmafp -b          
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v2
        with:
          path: './public'
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v2

This is an example for jbmafp. When I execute ./jbmafp -b the program creates public folder and puts all content there. And the directive with: path: './public' tells actions/deploy-pages@v2 to look for public folder instead of docs folder.

This can be used with anything, actually. Hugo, Gatsby, Astro, you name it.

Other posts

DateTitle
Fix bind warning in .profile on login in Ubuntu
Encoding binary data into DNA sequence
The strange case of Elasticsearch allocation failure
Embedding game assets within your executable binary
LED technology might not be as eco-friendly as you think
Getting started with MicroPython and ESP8266
Running Golang application as PID 1 with Linux kernel
Using Digitalocean Spaces to sync between computers
Simple world clock with eInk display and Raspberry Pi Zero
Remote work and how it affects the daily lives of people
Simple IOT application supported by real-time monitoring and data history