去年初的时候,我用自建的 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 步骤并设置
创建
设置自定义镜像
设置缓存目录
因为 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