The code, templates and content for my Hakyll powered blog at blog.rekahsoft.ca
Go to file
Collin J. Doering 1e1ae99446
Use guix for managing the required deployment environment
* infra/variables.tf: Add new variable 'site_statis_files_dir'

	* infra/manifest.scm: Add guix manifest that captures all tools required for deploying this site. This currently includes terraform, in use terraform providers, as well as awscliv2  which is used directly from a null resource

	* infra/main.tf: Pin all provider version so they are available from the rekahsoft-guix channel
	Remove the need for the template provider. It is still included as these changes need to be applied to all environments before it can be removed.
	Remove TF-UPGRAGE-TODO's
	Use the new variable 'site_static_files_dir' for the location of the static site files to be deployed

	* channels.scm (channel): Add symlink to top-level channels file

	* infra/Makefile (SELECTED_WORKSPACE): Removed the dependency on terraform
	(clean): Add new PHONY target 'clean' which cleans up terraform temporary files
	(workspace): Add new PHONY target 'workspace which switches to user provided ENV

	* channels.scm (channel): Updated rekahsoft-guix channel

	* README.org (Features): Updated sections on deployment
2021-12-06 22:25:05 -05:00
clay Update business card photo 2019-12-15 21:21:26 -05:00
drafts Worked on draft church-encoding-in-javascript 2015-08-10 16:55:28 -04:00
files Update gpg public key uids 2018-12-15 21:58:23 -05:00
fonts Remove unused fonts 2015-01-14 04:50:28 -05:00
images Update business card photo 2019-12-15 21:21:26 -05:00
images-src image-src: Add inkscape svg's that were used to build site graphics 2021-11-25 14:46:18 -05:00
infra Use guix for managing the required deployment environment 2021-12-06 22:25:05 -05:00
js Remove application cache functionality now that its deprecated 2021-11-27 23:43:22 -05:00
lib Update jquery from v1.11.2 -> v1.12.3 2021-11-25 21:16:18 -05:00
pages Update copyright year/s 2021-11-26 08:08:34 -05:00
posts posts/mikrotik-hap-ac-openwrt-installation.md: New post 2019-12-15 20:42:43 -05:00
src src/site.hs: Fix compiler warnings about unused modules/redundant imports 2021-11-29 09:48:12 -05:00
templates templates/default.js: Update MathJax cdn url 2021-11-27 23:41:12 -05:00
.drone.yml .drone.yml: Remove --with-source option during ci builds 2021-12-01 23:38:33 -05:00
.gitignore .gitignore: Remove .stack 2021-11-27 23:43:57 -05:00
blog-rekahsoft-ca.cabal WIP: guix development workflow 2021-11-23 22:58:24 -05:00
channels.scm Use guix for managing the required deployment environment 2021-12-06 22:25:05 -05:00
guix.scm guix.scm: Use git commit in version string 2021-12-01 23:36:59 -05:00
LICENSE Update copyright year/s 2021-11-26 08:08:34 -05:00
manifest.scm Use git source instead of tarball for blog-rekahsoft-ca package 2021-11-30 23:34:19 -05:00
README.org Use guix for managing the required deployment environment 2021-12-06 22:25:05 -05:00
robots.txt Add robots.txt for web robots 2015-08-05 02:42:12 -04:00
Setup.hs Initial cabalization of site 2015-01-14 04:50:28 -05:00
site site: Remove test command from site as the test suite was removed in 84735e9a 2021-11-27 23:52:32 -05:00
TODO.org README.org: Move 'Known Issues' to TODO.org 2021-11-30 23:40:03 -05:00

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.
manifest.scm
Defines packages required for development of this site.

To start a development environment, run the following:

  guix time-machine -C channels.scm -- shell -CN -E '^LANG$' -E '^TERM$' -E '^PS1$' -Df guix.scm -m manifest.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, -Df guix.scm indicates that development dependencies of the blog-rekahsoft-ca package should be included in the environment and -m manifest.scm ensures that extra tools for development are included as well.

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, however this would complicate Composing Site Development and Deployment Environments.
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.*$' -Df guix.scm -m manifest.scm -m infra/manifest.scm

Build Site

  site build

Clean Site

  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

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.