Jekyll 生成个人站点快速上手

向世界诉说自己的废话与美梦,让大家更懂你,更加排斥你 [color=#6b38a5]

为什么选 Jekyll

Jekyll 是一个静态网站生成器,Jekyll 用户 ruby 语言编写,我们通过 Markdown 语法书写文档,Jekyll 引擎根据 Jekyll 模板插入 CSS ,HTML和 Javascript,将 Markdown 文档自动给我们渲染组合成静态网页。

Jekyll是GitHub Pages的引擎,和 Github 有很好的兼容性。

安装 RVM 和 Ruby

RVM 是 RUBY 的本版管理系统,它是一个命令行工具,比较优雅的做法就是用它管理不同版本的的ruby和gem包。

RVM 是开源软件文档在 https://rvm.io/rvm/install

$ gpg --keyserver keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
gpg: directory '/home/ihexon/.gnupg' created
gpg: keybox '/home/ihexon/.gnupg/pubring.kbx' created
gpg: key 105BD0E739499BDB: 2 duplicate signatures removed
gpg: /home/ihexon/.gnupg/trustdb.gpg: trustdb created
gpg: key 105BD0E739499BDB: public key "Piotr Kuczynski <piotr.kuczynski@gmail.com>" imported
gpg: key 3804BB82D39DC0E3: public key "Michal Papis (RVM signing) <mpapis@gmail.com>" imported
gpg: Total number processed: 2
gpg:               imported: 2

$ sudo apt install curl sudo gcc g++ make libffi-dev gnupg2
$ curl -sSL https://get.rvm.io | bash

此时 .bashrc 会被自动追加上 Rvm 的加载函数:

# Add RVM to PATH for scripting. Make sure this is the last PATH variable change.
export PATH="$PATH:$HOME/.rvm/bin"

需要再当前 Shell 会话中 source /home/ihexon/.rvm/scripts/rvm,载入 RVM 函数开始使用:

$ rvm list known # 列出可以安装的 ruby 解释器版本
$ rvm install 3.0.0 # 安装 ruby 3.0.0 版本, 如果没有依赖可能 root 需要密码自动安装依赖

Rvm 的ruby环境是和本机 Linux 发行版隔离的,所以不会调用本机发行版的软件包管理器安装 ruby二进制文件。RVM 脚本的在ARM64环境下的安装逻辑是下载 ruby 源码使用本机编译器编译,在我的RK3399 CPU 上大概用了20分钟之久。当然构建 ruby 用不了这么久,原因是 RVM 使用了单线程编译,此时 ps -aux 观察到:

$ ps aux| grep make
ihexon    141367  0.0  0.0   4940   452 pts/13   S+   23:21   0:00 tee -a /home/ihexon/.rvm/log/1713021562_ruby-2.7.8/make.log
ihexon    141369  0.0  0.0   6448  3140 pts/13   S+   23:21   0:00 make -j1

使用 rvm list 列出已经安装的 ruby 环境,使用 rvm use 在当前shell会话中使用某个版本的 ruby 及其 gem 集合。

$ rvm list
   ruby-3.0.0 [ aarch64 ]
$ rvm use  ruby-3.0.0
Using /home/ihexon/.rvm/gems/ruby-3.0.0
$ which ruby
/home/ihexon/.rvm/rubies/ruby-3.0.0/bin/ruby

如果看到 rvm 返回一组错误提示: RVM is not a function, selecting rubies with 'rvm use ...' will not work.Sometimes it is required to use `/bin/bash --login` as the command.Please visit https://rvm.io/integration/gnome-terminal/ for an example. 执行 source ~/.rvm/scripts/rvm [color=yellow]

使用 Jekyll 构建个人站点

我网站使用的主题是 Quick Start - TeXt Theme (kitian616.github.io)。这个主题非常Nice

$ git clone https://github.com/ihexon/ihexon.github.io --depth 1
$ cd ihexon.github.io
$ bundle config set --local path 'vendor/bundle'
$ bundle install --path vendor/bundle

bundle 会将 gems 安装到 vendor/bundle 下。

使用 bundle exec jekyll serve 在本地构建静态网站,Jekyll 自带一个web服务器可以提供本地静态网站预览。 在我的 Gentoo 上这一步又出错了:

ERROR: It looks like you're trying to use Nokogiri as a precompiled native gem on a system with an unsupported version of glibc.

/lib/aarch64-linux-gnu/libm.so.6: version `GLIBC_2.29'
not found (required by /home/ihexon/ihexon.github.io/vendor/bundle/ruby/2.7.0/gems/nokogiri-1.14.0-aarch64-linux/lib/nokogiri/2.7/nokogiri.so)
- /home/ihexon/ihexon.github.io/vendor/bundle/ruby/2.7.0/gems/nokogiri-1.14.0-aarch64-linux/lib/nokogiri/2.7/nokogiri.so

查看我本地的 libc 版本:

$ /usr/lib/aarch64-linux-gnu/libc.so.6
GNU C Library (Ubuntu GLIBC 2.27-3ubuntu1.6) stable release version 2.27.
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 7.5.0.
libc ABIs: UNIQUE
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.

看上去应该是 nokogiri 这个 GEM 包的动态库 /vendor/bundle/ruby/2.7.0/gems/nokogiri-1.14.0-aarch64-linux/lib/nokogiri/2.7/nokogiri.so 需要GNU C 库 2.29

换底层 C 库是不可能的。当我执行 bundle install --path vendor/bundle 的时候。 nokogiri.so 这个动态库是预先构建好的然后通过 gem下载到我本地的,nokogiri 的 CI 容器的底层C库比我系统的版本高就会造成这种情况。解决办法是在本地构建一份nokogiri 的Gem包就OK。

通过设置 bundle config set force_ruby_platform true 强制在本地构建所有的Gem库而不是下载 prebuild 版本。

最后执行 bundle exec jekyll s 就可以看到静态页面跑起来了。 在比较老的系统上,构建 libxml2 有几率失败,这时可疑传入 –use-system-libraries 使用系统的动态库:

$ bundle config --global build.nokogiri --use-system-libraries
$ gem install nokogiri --platform=ruby --use-system-libraries

编写内容

文档的命名规则为 [年]-]-[月]-[日]-[name].md,这些字段被 Jekyll 引擎解析后生成的路径就像这样:

使用一个 shell 脚本自动生成符合 Jekyll Posts 文件名的Markdown文件:

#!/bin/bash
POST_NAME=$(echo -n $@|sed 's/[^[:alnum:]]\+//g')
DATE=$(date -I)
TEMP_NAME="$DATE-$POST_NAME.md"
touch "_posts/$TEMP_NAME"
echo '---
title: Title
articles:
   excerpt_type: html
---
' > "_posts/$TEMP_NAME"
vim "_posts/$TEMP_NAME"