通过 GitLab CI 自动部署博客

2018 年 9 月 9 日 · 共 1133 字

能自动的绝不手动。

本文简单介绍了本博客使用 GitLab CI 进行自动部署的过程。

介绍

GitLab CI 的设置通过.gitlab-ci.yml来实现,其中定义了不同的阶段(stages),每个阶段有不同的任务(jobs),每个任务由一系列需要执行的命令组成。除此之外还有很多可选的设置,可以实现非常复杂的流程。

本博客的部署因为难度不高,并没有使用很多.gitlab-ci.yml支持的特性。

使用现有 Docker 镜像

能用一个已经预装好工具链的 Docker 镜像直接进行编译和部署是最方便的,但 Docker Hub 上经常没有现成的镜像可以直接使用。为此,GitLab 提供了 GitLab Container Registry 用于存放自己的镜像,适合那些找不到现成镜像且工具链配置较为复杂的项目。

本博客只依赖 Hugo 用于渲染,所以使用现有的镜像 monachus/hugo 即可。

.gitlab-ci.yml中的体现如下所示:

image: monachus/hugo

定义阶段

本博客分为两个阶段,build 和 deploy。其中 build 阶段用于生成要部署的 public 目录,deploy 阶段用于部署。

其实放在一起也是可以的,直接生成部署一条龙。我分开只是考虑到可能要部署到不同的地方,不用重复生成了。

.gitlab-ci.yml中的体现如下所示:

stages:
  - build
  - deploy

定义任务

每个阶段有不同的任务,需要注意的是不同任务之间通过artifacts来共享目录,并且需要有依赖关系。另外artifacts里定义的目录如果没有下载回来的需求,建议加上过期时间expire_in,因为 GitLab.com 里默认是永久存储的。

针对 build 阶段,我只定义了一个生成内容到public目录的任务,设置public/artifacts的位置并且 30 分钟后删除。

.gitlab-ci.yml中的体现如下所示:

generate-html:
  stage: build
  script:
    - hugo
  artifacts:
    expire_in: 30 min
    paths:
      - public/

针对 deploy 阶段,我使用lftp来同步博客内容到 BunnyCDN。静态博客要什么源站

lftp并没有预装在镜像里,所以我选择手动安装,以后可能会打包自己的镜像来加快部署速度。

BunnyCDN 需要把 404.html 放到 bunnycdn_errors 目录才能支持自定义的 404 页面。新建一个文件夹,复制进去就好了。

GitLab CI 支持设置环境变量,可以避免隐私信息直接明文写在.gitlab-ci.yml的风险。

任务通过指明依赖关系来传递artifacts

.gitlab-ci.yml中的体现如下所示:

push-to-bunnycdn:
  stage: deploy
  only:
    - master
  script:
    - apt-get update -qq && apt-get install -y -qq lftp
    - mkdir -p public/bunnycdn_errors
    - cp public/404.html public/bunnycdn_errors/404.html
    - lftp -e "mirror -P10 -Revvv public/ .; quit;" -u $USERNAME,$PASSWORD $HOST
  dependencies:
    - generate-html

总结

本博客的部署只是一个很简易的项目,比如只有master分支、不需要测试、不需要定时执行等等,因此也只需要使用 GitLab CI 中提供的一部分功能即可实现。如果有更高的要求,请参阅官方文档

本文所用完整.gitlab-ci.yml如下:

image: monachus/hugo

stages:
  - build
  - deploy

generate-html:
  stage: build
  script:
    - hugo
  artifacts:
    expire_in: 30 min
    paths:
      - public/

push-to-bunnycdn:
  stage: deploy
  only:
    - master
  script:
    - apt-get update -qq && apt-get install -y -qq lftp
    - mkdir -p public/bunnycdn_errors
    - cp public/404.html public/bunnycdn_errors/404.html
    - lftp -e "mirror -P10 -Revvv public/ .; quit;" -u $USERNAME,$PASSWORD $HOST
  dependencies:
    - generate-html

lftp镜像内容时不定时出错,感觉 BunnyCDN 不是很稳啊