TypeCodes

给博客(pelican)增加git提交和自动构建信息

一、pelican 的构建和生成:

博客使用的是 pelican 开源静态博客系统,之前每次生成 html 代码都需要手动在服务器上用脚本生成的。也就是每次新增或者修改了文章都需要手工去执行脚本,然后发布到 nginx 目录。

鉴于每次的生成流程过于繁琐,所以最近考虑把博客的生成过程改用自动构建,同时在博客底部栏增加 git commit自动构建 的信息。效果如下:

pelican 博客生成时增加 gitcommit 和 cicd 信息

二、大体的开发流程

由于博客的 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 -%}
     &nbsp 
    # 展示构建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}:x-oauth-basic@github.com/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 »