The code, templates and content for my Hakyll powered blog at blog.rekahsoft.ca
Go to file
2023-04-30 17:21:00 -04:00
.drone .drone/ci.libsonnet: Add and renamed methods relocated from .drone.jsonnet: guix.pipeline, guix.step, awsDeployStep 2021-12-11 13:19:55 -05:00
clay
drafts
files
fonts
images
images-src
infra infra: Remove unused template provider 2022-10-16 21:24:00 -04:00
js Replace broken piwiki analytics with self-hosted plausible 2021-12-18 20:37:59 -05:00
lib
pages Update copyright year in a variety of files 2023-04-30 13:24:05 -04:00
posts
src Replace broken piwiki analytics with self-hosted plausible 2021-12-18 20:37:59 -05:00
templates Update copyright year in a variety of files 2023-04-30 13:24:05 -04:00
.drone.jsonnet .drone/ci.libsonnet: Add and renamed methods relocated from .drone.jsonnet: guix.pipeline, guix.step, awsDeployStep 2021-12-11 13:19:55 -05:00
.drone.yml .drone/ci.libsonnet: Add and renamed methods relocated from .drone.jsonnet: guix.pipeline, guix.step, awsDeployStep 2021-12-11 13:19:55 -05:00
.gitignore
blog-rekahsoft-ca.cabal
channels.scm
guix.scm
LICENSE Update copyright year in a variety of files 2023-04-30 13:24:05 -04:00
README.org
robots.txt
Setup.hs
site

Source Code for #! Lambda Slang

Build Status

#! Lambda Slang is the personal technical blog of Collin Doering, built using software that respects our freedoms.

Features

Tools

The creation of this website was made possible by the following open source tools and libraries:

  • Hakyll is used to generate site from static files
  • Clay is used for CSS pre-processing
  • Skeleton is used for CSS boilerplate
  • MathJax is used for rendering mathematics
  • JQuery and JQuery-address are used for various DOM manipulations
  • Gnu Guix is used to manage development environments and packaging
  • Inkscape and the Gimp were used to create various images/artwork
  • Gnu Free Fonts, specifically FreeMono is used as main font
  • Gnu Emacs because there is no place like home; and no greater editor!

License

Simply put, you're welcome to use the code used to generate this site though there are a few restrictions:

  • Any images and artwork that embody the likeness of "#! Lambda Slang" are not to be distributed or used and are strictly copyright
  • The content of pages and posts can be used with attribution, providing you aren't making money off of it

Various licenses (GPLv3, Creative Commons BY-NC-SA License, and Creative Commons BY-NC-ND License) are deployed dependent on which part of the site is in question. Please see the LICENSE file for full details.

TODO Guix Development Environment

Gnu Guix is used to package this project and manage its dependencies, as well as to provide reproducible development environments.

A simple wrapper script site is provided that wraps the hakyll powered site builder to offer some additional functionality.

Start Development Environment

The development environment is defined by the following files:

channels.scm
Specifically defines a set of available software, their versions and their build recipe.
guix.scm
Defines the package for this site, blog-rekahsoft-ca.

To start a development environment, run the following:

  guix time-machine -C channels.scm -- shell -CN -E '^LANG$' -E '^TERM$' -E '^PS1$' -f guix.scm -Df guix.scm

This uses the guix time-machine feature to ensure the development environment is reproducible by supplying a set of guix channels, effectively pinning all software versions used. The guix shell command is used within the time-machine to start a development environment in a container (-C), which shares the hosts network namespace (-N). The environment variable LANG is passed into the container to ensure locales work as expected; without this, site building will fail! Additionally, the environment variable TERM is passed into the container to ensure the development shell behaves correctly. Finally, -f guix.scm loads the blog-rekahsoft-ca package, and -Df guix.scm indicates that development dependencies of the blog-rekahsoft-ca package should be included in the environment.

Deployment Development Environment

Gnu Guix is used, similar to in the previous section, to create environments with all tools necessary for deployments, with a notable difference being a guix.scm file is not provided or needed, as the deployment environment is used solely for its side effects.

infra/channels.scm
Symlink to ../channels.scm to make the guix cli workflow nicer when in the infra directory. Technically this doesn't need to be a symlink, and could be a different set of channels or version of channels compared to the channels file at the top-level of the repository, however this would complicate Composing Site Development and Deployment Environments, so its preferred that all guix environments for the project, including the development and deployment environment use the same set of Guix channels.
infra/manifest.scm
Defines packages required for deployment of this site

To start a deployment development environment, run the following:

  cd infra
  guix time-machine -C channels.scm -- shell -CN -E '^LANG$' -E '^TERM$' -E '^PS1$' -E '^AWS.*$'

Composing Site Development and Deployment Environments

  guix time-machine -C channels.scm -- shell -CN -E '^LANG$' -E '^TERM$' -E '^PS1$' -E '^AWS.*$' -f guix.scm -Df guix.scm -m infra/manifest.scm

Build Site

This website is built from a collection of markdown files and templates that are processed by pandoc and are stitched together using Hakyll. To build the html/css/jss and all other assets required to deploy and distribute the site, the hakyll derived site-builder, blog-rekahsoft-ca must be invoked. Under usual conditions it is not invoked directly, but instead via the site wrapper script. For example, this is how within a development environment the site can be built.

  site build

Clean Site

Building the site has the side effect of writing a couple files/directories to disk as a result of the build process. In some cases, its useful to start of with a clean slate and remove any files that were generated for the site. To so so, the clean sub-command can be used:

  site clean

Watch

  site watch

Deploy Site

Terraform is used to deploy this site. Its configuration files are located in ./infra.

Under normal conditions, all deployments occur from my internal ci/cd system. This ensures that the deployment process is reliable, repeatable and quick. However, in the case of both development and emergency deployments, clear documentation surrounding the deployment process is necessary.

TODO site deploy command

  site deploy

Setup a Particular Environment

Three environments (terraform workspaces) are currently available, including:

default
unused default terraform workspace
staging
https://www.blog.staging.rekahsoft.ca
production
https://www.blog.rekahsoft.ca
  make setup ENV=<env>

From this point onward, any make target run will operate on the selected environment, unless its switched with the workspace or setup targets, or manually with terraform.

See What Infrastructure Will Change

Run a terraform plan to see how the selected environments infrastructure will change.

  make plan

Deploy the Site

Run a terraform apply to deploy to the selected environment.

  make deploy

Working with Terraform Directly

Within a development environment, terraform, its providers and all other dependencies are available. As such, its possible to directly leverage terraform and its various operations. This is particularly useful when debugging or adding make targets.

Clean up Guix Store

  guix gc --list-dead | grep -e '^/gnu/store/.*-blog-rekahsoft-ca-.*' | xargs guix gc -D

Building a Release

The software built that itself builds this blog is released as a Guix package. It is currently not, and is not ever expected to be distributed via a channel, as it provides little benefit to anyone except myself, and is meant to operate along with stateful data, including the site templates, content, pages, posts, etc..

To build a release, run the following command:

  guix time-machine -C channels.scm -- build -f guix.scm

This will produce a guix package with the following three outputs:

out
The blog-rekahsoft-ca site builder and gencss css generator binaries, as well as site user script
site
A build of the website made with the site builder, etc.. in the out output of this package, using the content at the same version
static
License file and any other file that should be distributed (eg manual)

TODO What is done with the release?

Writing a Blog Post

  guix time-machine -C channels.scm -- shell -CN -E LANG -E TERM -E PS1 -f guix.scm -- site watch

Known Issues

If you have an issue while browsing my blog please file a issue in the blog-rekahsoft-ca issue tracker.

To see a list of already known issues, see TODO.org.