使用 Buddy 自动发布静态博客

Published: 2024-01-25
Updated: 2024-09-04

Tags: Buddy CI/CD

本文总阅读量

去年初的时候,我用自建的 Drone 服务构建静态博客,并发布到又拍云:基于 Drone 的博客发布流程改造方案

这两天无意间看到一篇介绍 Buddy CI/CD 的文章,感觉更适合我(相比自建,在线平台更加稳定、免费额度够用、性能好、功能丰富、页面美观...),于是将博客的发布流程迁到了 Buddy,体验良好。

Buddy 介绍

免费方案

Plan: Free
1 seat, 1 runner, 300 pipeline & 300 sandbox GB-min., 1 GB storage

单用户、一个执行器,300 GB-minutes,这里的 GB-minutes 是指代运行流水线的机器内存和使用时间的综合单位,如使用 2GB 机器执行流水线 10 分钟,消耗 20 GB-minutes,部署博客足够用了。

服务区域

国际版本:https://buddy.works 国内版本:https://buddy.red

最开始我没发现国内官网地址,使用的是国际版,如果 Git 仓库在国内,还是使用国内版访问速度更快。

静态博客发布流程

在使用 Buddy 之前,我先简要介绍下我的静态博客发布流程:我的静态博客程序配置、模版、Markdown 存储在 Github 私有仓库,部署时提交博文到 Github,触发 Pelican 静态博客程序生成 HTML,然后使用又拍云提供的 upx 命令行工具将静态页面同步到 CDN,最后发送 Bark 通知到手机

构建工具镜像

构建一个公开的镜像 blog-toolbox,集成有 pelican、bash、curl、upx 工具,在 Buddy 中可以选择自定义的镜像

Dockerfile 如下

# 使用 Python 3 Alpine 镜像作为基础
FROM python:3-alpine

# 设置工作目录
WORKDIR /app

# 复制项目文件到工作目录
COPY . /app

RUN apk --no-cache add bash curl

# 安装 Pelican
# RUN apk --no-cache add gcc musl-dev libxml2-dev libxslt-dev
RUN pip install pelican[markdown]

# 安装 UPX
RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
        wget https://collection.b0.upaiyun.com/softwares/upx/upx_0.4.4_Linux_arm64.tar.gz && \
        tar -xzf upx_0.4.4_Linux_arm64.tar.gz -C /usr/local/bin && \
        rm -rf upx_0.4.4_Linux_arm64.tar.gz; \
    else \
        wget https://collection.b0.upaiyun.com/softwares/upx/upx_0.4.4_Linux_x86_64.tar.gz && \
        tar -xzf upx_0.4.4_Linux_x86_64.tar.gz -C /usr/local/bin && \
        rm -rf upx_0.4.4_Linux_x86_64.tar.gz; \
fi

# 启动命令
CMD ["tail", "-f", "/dev/null"]

构建并推送镜像

默认 Docker 不能多平台编译,可以参考这篇文章设置:使用 Docker 构建多架构镜像

docker buildx build -t kissbug8720/pelican-toolbox:latest --platform=linux/amd64,linux/arm64 --push .

添加 Buddy Action 步骤并设置

创建 类型 Action

设置自定义镜像

设置缓存目录

因为 upx 登录后的配置文件和缓存文件夹都在 ~ 目录存放,此处需填写绝对路径,填入 /root/

设置环境变量

此处添加环境变量是为了后续写 Bash 脚本的时候避免用户名密码硬编码到脚本中

UPYUN_USER=<your-username>
UPYUN_PASS=<your-password>

Action Bash 代码示例

pelican --version
upx --version

# 首次使用 upx 工具时登录
FILE='/root/.upx.cfg'
if [ ! -f "$FILE" ]; then
    echo "$FILE not exists."
    upx login upcdn-blog $UPYUN_USER $UPYUN_PASS
    ls -a ~/
fi

# 应用最新博文
rm -rf pyblog/content/markdown/* && cp -r articles/* pyblog/content/markdown/

# 构建
cd pyblog && pelican && ls output | wc -l

# 推送
upx sync output /

执行后

补充

相较于之前部署 Drone 并调试缓存,迁移到 Buddy 的过程明显更简单,Buddy 在流水线运行失败时可以通过命令行进入到环境中查看上下文、执行命令,很方便定位问题。

同时 Buddy 宣称其有更快的流水线速度和开发效率,初步体验下名副其实,可称为现代化的 DevOps 工具(Jenkins: ?)

等之后有时间再测试下 Golang 应用构建推送镜像、构建 Release 等,另外 Buddy 提供了沙盒环境,功能还未体验。

Buddy 虽好,但它不支持免费的私有化部署(on-premises),需要企业授权(得加钱!),如果需要本地部署还是需要老大哥 Jenkins 或者年轻小伙 Drone 等

提交代码,十多秒后收到发布完成通知,对比之前使用 Drone 整个流程将近一分钟,构建速度远超预期,是一次不错的尝试,先到这里~

2024-09-04 更新

调整了仓库目录结构,将 pyblog 内容移动到外层

pelican --version
upx --version

# 首次使用又拍云登录
FILE='/root/.upx.cfg'
if [ ! -f "$FILE" ]; then
    echo "$FILE not exists."
    upx login upcdn-blog $UPYUN_USER $UPYUN_PASS
    ls -a ~/
fi

# 构建
pelican && ls output | wc -l

# 推送
upx sync output /

# 通知
bash notifier.sh