搭建本博客使用到的技术是hugo结合github page,详见hugo自建博客。博客中可以看到详细过程:将hugo写作环境推到github main分支,通过github action构建到gh-pages分支。这是目前见到的大部分方案,也有通过在其他仓库(gitee)将最终结果推送到github上的。
最佳实践
个人觉得最佳的方案,应该隐藏写作环境,即hugo最终生成静态文件依赖的模板、md文件等。否则复制一个网站的成本就太小了,有心的人只需要下载你的写作环境,本地重新build以下,即可完全仿造你的整个流程。当然编译后的静态文件总归要暴露出去,但是后续更新、批量修改都增加了仿冒的成本。
针对本博客的实现方案,最佳实践应该为 main分支隐藏,gh-pages分支继续保留。
实现方案
构想过集中方案,可以根据自己情况实施:
- 自己有服务器的,可使用的方案很多,写作环境保留在自己服务器即可,静态文件可以存放服务器,或者推送到github pages
- 建立两个Github仓库(注意创建顺序),写作环境保存在私有仓库,推送到另外一个公开仓库里面
- 类似2,不过写作环境放在自己搭建的仓库更安全,或者国内gitee、国外aws gitcommit
我选择第二种方案测试了一下
创建私有仓库
由于Github 二级域名默认在账号级别创建的第一个仓库为根目录,具体实施应该为:
- 静态文件推送到账号下第一个创建的仓库
- 写作环境推送到账号下除第一个创建仓库以外的仓库
我的做法:将第一个仓库的内容删除,然后本地git remote add origin 第二个仓库地址
构建实现
peaceiris/actions-gh-pages 该该组件是编译好的静态文件推送到Github Pages,集成于Github Actions。详细见 hugo自建博客 Github Actions yaml文件。
- name: Deploy # 部署
uses: peaceiris/actions-gh-pages@v3
with:
personal_token: ${{ secrets.PERSONAL_TOKEN }}
publish_dir: ./public
cname: www.d-j.fun
external_repository: micywin/hugo-dj
注意yaml和原文章的区别,由于原文章是将构建好的静态文件推送到当前仓库的gh-pages分支,直接使用Github Actions初始化的Github_TOKEN即可,但是如果跨仓库,甚至于不通的仓库提供商,那么这里就要设置为对应的token。由于博主使用的是github的另外一个仓库,使用personal_token即满足需求。
按照上图设置好secrect之后,注意external_repository,这里是设置相对于当前仓库的另外一个仓库。
这样设置好之后,重新推送一下写作环境的代码到第二个仓库,那么没有问题情况下,第一个仓库的gp-pages分支会出现最新一版的静态文件。
拓展内容
关于peaceiris/actions-gh-pages该组件还有更多的配置选项,可以根据自己需要去配置,个人觉得比较有用的:
- 设置full_commit_message, 让每次更新可以看到提交的相关信息
- 如果不想部署的时候影响到在线阅读体验,可以定时在半夜部署
等,可以根据自己情况去配置。博主的Deploy的完整配置:
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
personal_token: ${{ secrets.PERSONAL_TOKEN }}
publish_dir: ./public
cname: www.d-j.fun
external_repository: micywin/hugo-dj
full_commit_message: ${{ github.event.head_commit.message }}
总结
为了写作体验,和后续可能的问题,应该提前做好各种规划。比如本文提到的写作环境隐藏、自动给图片添加水印、还有目录的规划、文章分类的划分等。