给博客(pelican)增加git提交和自动构建信息
一、pelican 的构建和生成:
博客使用的是 pelican
开源静态博客系统,之前每次生成 html 代码都需要手动在服务器上用脚本生成的。也就是每次新增或者修改了文章都需要手工去执行脚本,然后发布到 nginx 目录。
鉴于每次的生成流程过于繁琐,所以最近考虑把博客的生成过程改用自动构建,同时在博客底部栏增加 git commit
和 自动构建
的信息。效果如下:
二、大体的开发流程
由于博客的 pelican 代码和 pelican 的文章是分开来托管的,所以在自动构建的时候需要分别拉取这两个 git 项目,然后再把文章按照 pelican 的生成要求放在 content/articles
目录下面。
### 1、修改pelican的配置和模板文件
修改pelican的配置文件:pelican.conf 和 模板文件:footer.html,以便支持git commit 和 自动构建的信息数据。
### 2、博客文章变动
当博客新增或者修改文章后,会提交到github的仓库。由于设置了webHook,所以会通知自己的cicd服务后台进行构建
### 3、自动构建后台
自动构建后台收到github的commit通知后,触发自动构建:先拉取pelican的代码(包括了博客当前的pelican主题),然后准备pelican构建的环境。
apt install -y make python3-pip && pip3 install --upgrade pip && pip3 install --upgrade --default-timeout=100 install tzdata pelican markdown pelican-sitemap Pygments minchin.pelican.plugins.summary -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com && sh autoGenAndPublish.sh "${CICD_WORKING_DIR}" "${GITHUB_TOKEN}" "${CICD_BUILD_ID}"
### 4、构建脚本 autoGenAndPublish.sh
在pelican根目录创建一个shell构建脚本,传入了当前自动构建的根目录(也就是pelican代码所在的根目录)、github的token用于拉取文章仓库和本次构建的id。
代码的大体逻辑:先拉取博客文章到pelican的`./content/articles`目录,然后获取git commit的id和时间信息,接着获取本次自动构建的id和日期,最后更改pelican.conf配置代码中的变量,最后通过pelican命令生成html代码并打包成blog.tar.gz。
### 5、由构建系统分发到业务机器
构建系统分发到业务机器后,会执行一个shell脚本,用于把打包的blog.tar.gz博客代码解包并发布到nginx目录上面即可。
三、具体的代码
上面的流程会涉及到下面几个主要的代码逻辑:
3.1 修改主题代码
在 pelican 主题下面的 footer.html
代码中增加 git commit 和自动构建信息的数据:
# 配置是否定义了COMMIT_ID,且不为空值
{%- if COMMIT_ID -%}
# 配置是否定义了COMMIT的图标,且不为空值
{%- if COMMIT_ICON -%}
<img class="image" src="{{ COMMIT_ICON }}">
{%- endif -%}
# 展示commitId 和 commit date
<b> commit:</b> <em> {{ COMMIT_ID[0:7] }}</em>
{%- if COMMIT_DATE -%}
<em>-{{ COMMIT_DATE }} </em>
{%- endif -%}
 
# 展示构建id 和 构建 date
{%- if BUILD_ID -%}
<b> build:</b> <em>{{ BUILD_ID[0:7] }}</em>
{%- if BUILD_DATE -%}
<em>-{{ BUILD_DATE }}</em>
{%- endif -%}
{%- endif -%}
{%- endif -%}
3.2 修改 pelican.conf 配置文件
在配置文件中增加以下定义数据,最后会在自建构建的时候修改变量的值,最终会填充到上面的 footer.html
代码中。
# 底部栏git相关
COMMIT_ID = ''
COMMIT_ICON = 'https://cdn.typecodes.com/libs/img/git.png'
COMMIT_DATE = ''
# 底部栏构建相关
BUILD_ID = ''
BUILD_DATE = ''
3.3 构建脚本 autoGenAndPublish.sh
在 pelican 主题代码中新增一个 autoGenAndPublish.sh
的 shell 脚本。
#!/bin/bash
# pelican编译并打包
# (c) 2024.5.4 vfhky https://typecodes.com/mix/pelicanaddgitcommitcicdinfo.html
# Simple Usage: sh autoGenAndPublish.sh /home/typcodes/github/tp_code github_token "#abcded"
if [ $# -ne 3 ]; then
echo "pelican编译脚本必须输入构建路径参数"
exit 1
fi
# 根路径
WORKING_DIR=$1
GITHUB_TOKEN=$2
# 构建id
BUILD_ID=$3
BUILD_DATE=$(date +%Y.%m.%d)
# github commitId
COMMIT_ID=''
COMMIT_DATE=''
# target
TARGET='blog.tar.gz'
PELICAN_CONF='pelicanconf.py'
# 修改配置文件
replaceGitAndBuildInfo() {
if [ ! -e "${PELICAN_CONF}" ]; then
echo "配置文件${PELICAN_CONF}不存在"
exit 0
fi
sed -i "s/COMMIT_ID = ''/COMMIT_ID = '$1'/" "${PELICAN_CONF}"
sed -i "s/COMMIT_DATE = ''/COMMIT_DATE = '$2'/" "${PELICAN_CONF}"
sed -i "s/BUILD_ID = ''/BUILD_ID = '$3'/" "${PELICAN_CONF}"
sed -i "s/BUILD_DATE = ''/BUILD_DATE = '$4'/" "${PELICAN_CONF}"
}
cd "${WORKING_DIR}" \
&& rm -rf ./content/articles \
&& mkdir -p ./content/articles \
&& cd ./content/articles \
&& git clone -b master "https://${GITHUB_TOKEN}:[email protected]/vfhky/article.git" . \
&& COMMIT_ID=$(git rev-parse --short HEAD) \
&& COMMIT_DATE=$(git log -1 --format=%cd --date=format:'%Y.%m.%d') \
&& cd "${WORKING_DIR}" || exit
# 修改配置文件
replaceGitAndBuildInfo "${COMMIT_ID}" "${COMMIT_DATE}" "${BUILD_ID}" "${BUILD_DATE}"
# 编译并打包
make publish \
&& tar -zcf "${TARGET}" -C output/ .
打赏支持
Comments »