Hugo 站点部署

第一次部署方案

部署到自己的服务器:提交到源码仓库服务器后,实现自动部署

  • 源码裸仓库 Git Hook
  • 用 Hugo 在临时目录中构建网站
  • 拷贝网站到 Web Server 的目录中
  • 要考虑 Web Server 目录的权限和执行 Git Hook 的权限
  • 主题以 git submodule 方式 pull 下来,那么在自动部署时要每次都要下载主题,岂不是很费事。目前采用强制 push submodule 到远程仓库的方式来解决。每次添加一个新的主题时,手动登录服务器
  • 尤其优化,Git Hook 只应该作为事件触发机制,不应将工作放在其中,因为客户端要一直等待结果

https://www.digitalocean.com/community/tutorials/how-to-deploy-a-hugo-site-to-production-with-git-hooks-on-ubuntu-14-04

https://www.digitalocean.com/community/tutorials/how-to-use-git-hooks-to-automate-development-and-deployment-tasks

第二次部署方案

这次更新主要是使用了第三方主题(https://wowchemy.com/docs/),具体部署方案依然沿用第一次的,流程如下:

  1. 本地更新博客 Git 仓库,然后 push 到服务器裸 Git 仓库

  2. 通过在服务器裸 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
    
  3. 关于服务器 go 和 hugo 环境有若干要点:

    1. hugo 环境:由于主题往往依赖特定版本 hugo,比如我这次博客主题就依赖 v0.79.1/extended 版本,而且官方预编译好的二进制无法成功在服务器上运行,因此手动编译构建了 hugo,具体步骤如下:
      1. https://github.com/gohugoio/hugo.git
      2. cd hugo && git checkout v0.79.1
      3. CGO_ENABLED=1 go install --tags extended
      4. sudo cp ~/go/bin/hugo /usr/local/bin/hugo
    2. go 环境:同样特定版本 hugo 要依赖特定版本 go,比如这次不论是编译还是运行时都要依赖 go1.15 版本,为了避免同系统已安装 go 版本冲突,所以使用了 gvm 用来管理多个 go 版本。hugo 编译时,编译账户下通过 gvm 来安装 go1.15,然后将其拷贝到系统可执行路径下。hugo 运行时,由于通过 git 账户启动,所以同样需要为 git 安装 go1.15。
Previous
Next