能自动的绝不手动。
本文简单介绍了本博客使用 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 不是很稳啊