基于GitLab Pages部署Hexo博客

引言

之前我的博客都是部署在GitHub Pages上的,但是后来因为GitHub Education到期,私有仓库无法使用GitHub Pages,而GitLab Pages则是可以的,所以就想把博客迁移到GitLab Pages上。与GitHub 相比,GitLab Pages的部署要麻烦一些,因而做个记录。

基本方案

部署的基本方案如下:

  1. 使用Hexo的hexo generate离线生成静态网页内容,然后使用hexo deploy推送到GitLab的私有仓库;
  2. 在GitLab的私有仓库创建Pages,使用nginx提供Web服务;
  3. 使用Cloudflare提供DNS和缓存功能,并配置自定义域名。

具体如下。

GitLab上的设置

GitLab Pages配置工作流

与GitHub类似,GitLab Pages可以创建项目的,也可以创建个人账户的,因为是个人博客,所以选择创建个人账户的Pages。具体步骤如下:

  1. 创建项目username.gitlab.io,对应的URL 为http(s)://username.gitlab.io;

  2. 上传Hexo生成的静态内容。

  3. 编写.gitlab-ci.yml文件,具体内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    image: nginx:latest # 使用nginx提供静态页面服务

    # 通过gitlab的pages功能实现静态网站功能。
    pages:
    stage: deploy
    script: # GitLab Pages制定从public文件夹读取内容
    - mkdir .public
    - cp -r * .public
    - mv .public public
    - mv public/nginx.conf /etc/nginx/nginx.conf # nginx的配置文件
    artifacts:
    paths:
    - public
    rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
  4. 配置自定义域名,在左侧边栏的Deploy > Pages 选择New Domain,然后可以看到DNS记录和证书信息:

    GitLab Pages自定义域名

    需要注意的是,在配置自定义域名时,如果勾选GItLab Pages下的Use unique domain,自定义域名会跳转到GitLab生成的域名,自定义域名的意义就大打折扣了。但是如果不用unique domain,而是用project pages,那么root url就会是 .gitlab.io/projectname ,那么Hexo的配置也要相应改变。

  5. 修改Pages的可见性,由于我使用的是私有仓库,但是Pages的可见性需要设置为Everyone

    1689040954138

  6. 查看Pipeline的运行情况

    image-20230710155433692

    注意:需要先提交静态内容再运行Pipeline,为了方便起见,.gitlab-ci.yml直接在hexo文件中添加。

Hexo的修改

为了方便部署,我直接在Hexo的源文件中做了修改,具体如下:

  1. source文件夹下增加.gitlab-ci.yml文件,内容如前所示;

  2. source文件夹下增加nginx.conf文件,内容如下:

    1
    2
    3
    4
    5
    6
    7
    server {
    listen 80;
    location / {
    root public;
    index index.html;
    }
    }
  3. 修改Hexo的_config.yml,具体包括:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 跳过对.gitlab-ci.yml的渲染
    skip_render:
    - .gitlab-ci.yml

    # 包含隐藏文件.gitlab-ci.yml
    include:
    - .gitlab-ci.yml

    # 部署设置
    ## Docs: https://hexo.io/docs/deployment.html
    deploy:
    type: git
    repo: [email protected]:username/username.gitlab.io.git
    branch: master
    ignore_hidden: false

修改后,运行hexo d -g,就会将生成的静态文件上传到指定项目,即username.gitlab.io

Cloudflare的设置

Cloudflare的设置相对简单,就是在DNS记录中,添加前面在GitLab Pages的New Domain下生成的记录,具体如下:

1689006029753image-20230711002212050

添加后,回到GitLab Pages下面验证即可。

需要注意的是,对于上面的A记录,GItLab Pages还提到了用ALIAS或者CNAME,不过也有博客提到用A会更可靠。

如果GItLab的Pipeline能够运行成功,理论上应该就成功了。

总结

以上就是使用GitLab Pages + Hexo + Cloudflare部署个人博客的过程,感觉速度比GItHub Pages要快一些,是一个值得考虑的选择。

参考资料

  1. GitLab Pages | GitLab
  2. 使用 GitLab Pages 建立靜態網站 | 艦長,你有事嗎? (chengweichen.com)
  3. 将 Hexo 部署到 GitLab Pages | Hexo
  4. GitLab Pages custom domains | GitLab
  5. Configuration | Hexo
  6. nginx - Official Image | Docker Hub
  7. 使用GitLab Pages托管静态网站_tongshuyang的博客-CSDN博客