Hugo 站点部署
第一次部署方案
部署到自己的服务器:提交到源码仓库服务器后,实现自动部署
- 源码裸仓库 Git Hook
- 用 Hugo 在临时目录中构建网站
- 拷贝网站到 Web Server 的目录中
- 要考虑 Web Server 目录的权限和执行 Git Hook 的权限
- 主题以 git submodule 方式 pull 下来,那么在自动部署时要每次都要下载主题,岂不是很费事。目前采用强制 push submodule 到远程仓库的方式来解决。每次添加一个新的主题时,手动登录服务器
- 尤其优化,Git Hook 只应该作为事件触发机制,不应将工作放在其中,因为客户端要一直等待结果
第二次部署方案
这次更新主要是使用了第三方主题(https://wowchemy.com/docs/),具体部署方案依然沿用第一次的,流程如下:
-
本地更新博客 Git 仓库,然后 push 到服务器裸 Git 仓库
-
通过在服务器裸 Git 仓库添加 hook 来实现博客的自动生成和发布,具体如下:
编辑仓库的
hooks/post-receive
# 在git账户下使用[gvm](https://github.com/andrewkroh/gvm)来安装主题依赖的特定版本go # 并且在该脚本中重写go相关环境变量 # use gvm to manage the go version # you should run `sudo -u git /usr/local/bin/gvm 1.15` first to create the go version export GOROOT="/home/git/.gvm/versions/go1.15.linux.amd64" export PATH="/home/git/.gvm/versions/go1.15.linux.amd64/bin:$PATH" # 具体部署hook脚本 # hugo也应该是主题依赖的特定版本,编译好后将其拷贝到/usr/local/bin/hugo dependencies="hugo" hugo=/usr/local/bin/hugo baseurl=http://blog.wikty.com repodir=/srv/git/blog.wikty.com.git wwwdir=/var/www/blog.wikty.com # check if push on master branch, only trigger hook script on master branch while read oldrev newrev ref; do # check master branch if [[ $ref =~ .*/master$ ]]; then # check third-party dependencies for cmd in $dependencies; do if ! [ -x "$(command -v $cmd)" ]; then echo "Master ref received, but due to $cmd not found, deploying failed" >&2 exit 1 fi done # do clean up job when error occurred set -e # backup wwwdir backupdir=$(mktemp -d) rsync -aqz $wwwdir/ $backupdir # cleanup wwwdir rm -rf $wwwdir/* # make hugo working directory and clone bare repo tmpdir=$(mktemp -d) currentdir=$(pwd) cd $tmpdir git --work-tree=$tmpdir --git-dir=$repodir checkout -f git --work-tree=$tmpdir --git-dir=$repodir submodule init git --work-tree=$tmpdir --git-dir=$repodir submodule update cd $currentdir #git clone $repodir $tmpdir # hugo publish content into wwwdir HUGO_ENV=production $hugo -s $tmpdir -d $wwwdir -b $baseurl # if error occurred, do some clean job trap "echo 'A error occurred. Reverting to backup.'; rsync -aqz --del $backupdir/ $wwwdir; rm -rf $backupdir; rm -rf $tmpdir;" EXIT # remove tmpdir, backupdir rm -rf $tmpdir rm -rf $backupdir trap - EXIT echo "Master ref received. Deploying master branch to production..." else echo "Ref $ref successfully received. Doing nothing: only the master branch may be deployed on this server." fi done
-
关于服务器 go 和 hugo 环境有若干要点:
- hugo 环境:由于主题往往依赖特定版本 hugo,比如我这次博客主题就依赖
v0.79.1/extended
版本,而且官方预编译好的二进制无法成功在服务器上运行,因此手动编译构建了 hugo,具体步骤如下:https://github.com/gohugoio/hugo.git
cd hugo && git checkout v0.79.1
CGO_ENABLED=1 go install --tags extended
sudo cp ~/go/bin/hugo /usr/local/bin/hugo
- go 环境:同样特定版本 hugo 要依赖特定版本 go,比如这次不论是编译还是运行时都要依赖 go1.15 版本,为了避免同系统已安装 go 版本冲突,所以使用了 gvm 用来管理多个 go 版本。hugo 编译时,编译账户下通过 gvm 来安装 go1.15,然后将其拷贝到系统可执行路径下。hugo 运行时,由于通过 git 账户启动,所以同样需要为 git 安装 go1.15。
- hugo 环境:由于主题往往依赖特定版本 hugo,比如我这次博客主题就依赖