Like any software engineer, I strive to be two things: cheap and lazy. That’s why I manage this site (and several others) through free hosting services such as surge.sh and a static site generator, such as Hugo. Until recently, I’ve used Surge’s CLI to deploy changes, but I’ve now switched to Github Workflows to deploy changes automagically.

Here is my workflow for publishing to surge with Github Workflows:

# This is a basic workflow that is manually triggered

name: Publish to Surge

# Controls when the action will run. Workflow runs when manually triggered using the UI
# or API.
on:
  workflow_dispatch:
    inputs:
      git-ref:
        description: Git SHA-1 Ref (Optional)    
        required: false

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  deploy:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest
    steps:
    - name: Clone Repository (Latest)
      uses: actions/[email protected]
      if: github.event.inputs.git-ref == ''
    - name: Clone Repository (Custom Ref)
      uses: actions/[email protected]
      if: github.event.inputs.git-ref != ''
      with:
        ref: ${{ github.event.inputs.git-ref }}
    - name: Hugo setup
      # You may pin to the exact commit or the version.
      # uses: peaceiris/[email protected]
      uses: peaceiris/[email protected]
      with:
        # The Hugo version to download (if necessary) and use. Example: 0.58.2
        hugo-version: latest
        # Download (if necessary) and use Hugo extended version. Example: true
        extended: true
    - name: Generate static files
      run: cd <HUGO_APP> && hugo -D
    - name: Publish to surge.sh
      # You may pin to the exact commit or the version.
      # uses: dswistowski/[email protected]
      uses: dswistowski/[email protected]
      with:
        # your surge.sh domain to deploy
        domain: <YOUR_DOMAIN_NAME>
        # surge.sh login
        login: <YOUR_EMAIL>
        # surge.sh token, generate it with `surge token` command
        token: <TOKEN>
        # your project path
        project: <PATH_TO_YOUR_PROJECT>