Jekyll is a simple, blog-aware, static site generator for personal, project, or organization sites. Written in Ruby by Tom Preston-Werner, GitHub's co-founder, it is distributed under the open source MIT license.
Jekyll is a simple, blog-aware, static site generator for personal, project, or organization sites. Written in Ruby by Tom Preston-Werner, GitHub's co-founder, it is distributed under the open source MIT license.
$ guix package -i jekyll
To get Jekyll to behave in Docker is pretty simple.
Create a Dockerfile:
# Dockerfile
FROM starefossen/ruby-node:2-10-slim
WORKDIR /usr/working
COPY Gemfile ./
RUN apt-get update && apt-get install -y \
graphicsmagick \
imagemagick \
dh-autoreconf \
openssl \
awscli \
&& aws configure set preview.cloudfront true
RUN gem install bundler jekyll
RUN bundle install
EXPOSE 4000
_This image includes a whole bunch of stuff I use for image resizing, uploading and CDN invalidation (AWS CLI). Whatever you don’t need, just remove.”
To get this working easily, create a docker-compose file:
# docker-compose.yml
version: '3'
services:
jekyll:
build: .
command: sh -c "bundle exec jekyll serve --host 0.0.0.0"
network_mode: "host"
working_dir: /usr/working
volumes:
- $PWD:/usr/working
A couple of things to look out for:
bundle exec jekyll serve --host 0.0.0.0
basically runs jekyllnetwork_mode: "host"
makes this work like running jekyll without Docker$PWD:/usr/working
mounts your working dir to the container$PWD
basically grabs the current terminal directory.
Running
Now that we’re all setup, create a run.sh
with:
docker build --tag jekyll_dev .
# docker run --detach --name gi nexinnotech
docker container run -v ${PWD}:/usr/working \
-e AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
-e AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
-e AWS_CLOUDFRONT_DISTRIBUTION_ID=${AWS_CLOUDFRONT_DISTRIBUTION_ID} \
-e AWS_DEFAULT_REGION=eu-central-1 \
-it jekyll_dev /bin/bash
Before you run this, clean-out everything you don’t need! This example includes AWS environment variables for easy deployment, once I’m done with development.
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
export AWS_CLOUDFRONT_DISTRIBUTION_ID=...
sh run.sh
This will build and install everything, and finally drop you in the container shell.
Here you may do as you please,
As a little bonus, here’s my deployment script:
$ node_modules/.bin/gulp
$ bundle exec jekyll build
$ aws s3 sync _site/ s3://myawesomesite.com --delete
$ aws cloudfront create-invalidation --distribution-id $AWS_CLOUDFRONT_DISTRIBUTION_ID --paths "/*"
This “ties” it all together.
If you see errors like this:
jekyll_1 | bundler: failed to load command: jekyll (/usr/local/bundle/bin/jekyll)
jekyll_1 | Bundler::LockfileError: You must use Bundler 2 or greater with this lockfile.
Delete your Gemfile.lock
$ guix package --profile=jekyll --install ruby@2.4.3 jekyll@2.8.3 ruby-jekyll-watch@2.0.0
The environment will be stored at ~/jekyll
.
$ guix package --search-paths --profile=jekyll
To add more packages to a profile, do:
$ guix package --profile=jekyll -i package-name
Note: You should run this, in the folder that contains your existing jekyll profile. Otherwise, a new profile will be created.
Create a new file
$ nano jekyll-website.scm
with the following content:
(use-modules (guix packages)
(guix licenses)
(guix build-system ruby)
(gnu packages)
(gnu packages version-control)
(gnu packages ssh)
(gnu packages ruby))
(package
(name "jekyll-project")
(version "1.0")
(source #f) ; not needed just to create dev environment
(build-system ruby-build-system)
;; These correspond roughly to "development" dependencies.
(native-inputs
`(("git" ,git)
("openssh" ,openssh)
("ruby-rspec" ,ruby-rspec)))
(propagated-inputs
`(("jekyll" ,jekyll)))
(synopsis "A jekyll website")
(description "This is a jekyll example website")
(home-page "https://example.com")
(license expat))
To initiate the new project environment, run:
$ guix environment -l jekyll-website.scm
You’re now ‘in’ the environment, indicated with a [env]
in your console.
Normally, we would initiate a new jekyll site using jekyll new my-site
but that would result in the use of bundler, which we won’t need, as long as we’re working with guix.
We’ve prepared a repository, which contains the result of the command.
git clone https://git.pantherx.org/published/jekyll-new-site.git
cd jekyll-new-site
Now run jekyll as usual:
$ jekyll serve
Create a new file
$ nano jekyll-website.scm
with the following content:
(use-modules (guix packages)
(guix licenses)
(guix build-system ruby)
(gnu packages)
(gnu packages version-control)
(gnu packages ssh)
(gnu packages ruby))
(package
(name "jekyll-project")
(version "1.0")
(source #f) ; not needed just to create dev environment
(build-system ruby-build-system)
;; These correspond roughly to "development" dependencies.
(native-inputs
`(("git" ,git)
("openssh" ,openssh)
("ruby-rspec" ,ruby-rspec)))
(propagated-inputs
`(("bundler" ,bundler)))
(synopsis "A jekyll website")
(description "This is a jekyll example website")
(home-page "https://example.com")
(license expat))
To initiate the new project environment, run:
$ guix environment -l jekyll-website.scm
Create a new folder, and initialize bundler:
$ mkdir my-site && cd my-site
$ bundle init
Set bundler to use vendor/bundle
for gem files:
$ bundle install --path vendor/bundle
Add add jekyll:
$ bundle add jekyll
Now you can create the scaffolding site using:
$ bundle exec jekyll new --force --skip-bundle .
$ bundle install
To run jekyll:
$ bundle exec jekyll serve
Check file permissions with:
$ ls -la ~/my-site/
and add read and write permissions as necessary:
$ chmod +rw ~/my-site/Gemfile
PantherX & (unofficial) GNU Guix Wiki.
Last update: 2024-04-21 10:28:03 +0000 | Apache-2.0
Inspired by the excellent Arch Linux Wiki