Gitlab上部署Hexo博客

今天成功在Gitlab上部署了以我的名字全称命名的Hexo博客,本文记录配置过程及和Github上的方便程度。

Github 和Gitlab 上撰写博客的流程对比分析

Github 撰写博客

之前在Github上部署了Hexo博客,这个过程可以参考文章使用Hexo搭建博客,在Github上部署博客写作的流程为:

  1. 在本地电脑上安装好撰写Hexo博客的软件

  2. 在Github上建立和用户名相同的仓库,并配置好主站配置文件_config.yml ,同时配置ssh方式登录github

  3. 使用hexo n xxx 新建博文xxx ,然后使用nvim source/_post/xxx.md来编辑内容,执行命令hexo s 可以在本地监控博客的最终显示。待完成博客,hexo g 生成文件, 以hexo d上载到github 上,这个方式需要在_config.yml 中进行设置,具体方法参见本文开始时引用的博文。

  4. 由于使用这个方式上载的文是位于文件夹public的由hexo生成的内容,所以对于博客的源文档需要另立仓库单独存放,我之前在github上以hexosource来保存这源文件,所以在写完博客后以命令git add .git commit -m "xxx"git push 将源码上载到hexosource中。

Gitlab 撰写博客

Gitlab上撰写博客,由于Gitlab的工作特点,他应该比Github方便不少,这也是以后我决定从Gitlab上发文章的主要考虑要点。Gitlab当监控到上载文件到其仓库时,其会触发系统执行脚本gitlab-ci.yml,从而实现自动部署。然而这依懒于一个应用就是gitlab-runner,其一这个服务可以由其他用户共享,即所谓的Shared runners,其二可以在本机安装此服务,并设置开机自启动,由于第一种方式需要自己绑定信用卡来确认账号,很不方便,于是我选择了在自己的Archlinux上来安装gitlab-runner服务,自己有针对性的配置主机,反而更加方便。

  1. 在本地电脑上安装好撰写Hexo博客的软件

  2. Gitlab上审请账号,同时建立一个yourname.gitlab.io仓库,用来存放博客源文件

  3. 配置ssh这点和Github相同

  4. 将你的Hexo站点文件夹推送到repository中。默认情况下public目录将不会(并且不应该)被推送到repository中,建议你检查 .gitignore文件中是否包含public一行,如果没有请加上。(这一点相当重要)

由于Gitlab可以设置为私有,所以我们当然是只需要展示博客而不是展示源码,设置如下:

  1. 选择 Settings > General。

  2. 在弹出的界面中,选择 Visibility, project features, permissions 后面的 Expand 按钮。

  3. Project visibility 设置为 Private

  4. Pages 设置为 Everyone

  1. 在你的站点文件夹中新建.gitlab-ci.yml文件:
    .gitlab-ci.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # To contribute improvements to CI/CD templates, please follow the Development guide at:
    # https://docs.gitlab.com/ee/development/cicd/templates.html
    # This specific template is located at:
    # https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Hexo.gitlab-ci.yml

    # Full project: https://gitlab.com/pages/hexo
    image: node:18.9.0
    cache:
    paths:
    - node_modules/

    before_script:

    pages:
    script:
    # - npm run build
    - hexo g
    artifacts:
    paths:
    - public
    rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

注意这里before_script下面不应当添加和npm相关命令,因为一切配置都在本机完成了,所以添加后反而导致系统不能部署成功。

  1. 安装和配置gitlab-runner
安装和注册`gitlab-runner`
1
2
3
4
5
6
7
8
9
# pacman -S gitlab-runner
$ gitlab-runner --help %查看帮助
$ gitlab-runner register %注册命令
Please enter the gitlab-ci coordinator URL (e.g.https://gitlab.com/ ):
$ https://gitlab.com/
Please enter the gitlab-ci token for this runner:
$ 8sjydnrsPuSRhKiQTQky
Please enter the executor: custom, docker-ssh, parallels, kubernetes, docker-ssh+machine, docker, shell, ssh, virtualbox, docker+machine:
$ shell

注意,以上注册方法仅输入了必要信息,具体可以参见gitlab Runner 安装与部署。关于注册中需要的token可以从settings->CI/CD->Runners中找到。他的工作原理为,在本地安装的gitlab-runner通过这一仓库的token唯一的与此仓库相关联,当gitlab检测到系统此仓库发生变化时就会调用此token对应的gitlab-runner来运行.gitlab-ci.yml中对应的命令,从而完成相应工作的自动化。所以一个仓库会有一个token来标记一个gitlab-runner,同时也会有一个.gitlab-ci.yml来指明此gitlab-runner需要运行的命令,以完成工作。此处只是采用了此自动化功能来完成了博客自动部署。

  1. 配置gitlab-runner开机启动
配置`gitlab-runner`开机启动
1
2
# systemctl enable gitlab-runner
# systemctl disable gitlab-runner

上面第二行代码是开机启动gitlab-runner服务,第三行是关闭gtilab-runner服务 ,同时如果不设置开机启动的话也可以手动启动服务,即

1
2
3
$ sudo gitlab-runner start %以root身份启动
$ gitlab-runner run %以user身份启动
$ sudo gitlab-runner run %以root身份启动
具体gitlab-runner命令也可以参考GitLabRunner命令 或直接使用gitlab-runner --help 来确认使用方法。

gitlab-runner --help
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
NAME:
gitlab-runner - a GitLab Runner

USAGE:
gitlab-runner [global options] command [command options] [arguments...]

VERSION:
15.4.0 (43b2dc3d)

AUTHOR:
GitLab Inc. <support@gitlab.com>

COMMANDS:
exec execute a build locally
list List all configured runners
run run multi runner service
register register a new runner
reset-token reset a runner's token
install install service
uninstall uninstall service
start start service
stop stop service
restart restart service
status get status of a service
run-single start single runner
unregister unregister specific runner
verify verify all registered runners
artifacts-downloader download and extract build artifacts (internal)
artifacts-uploader create and upload build artifacts (internal)
cache-archiver create and upload cache artifacts (internal)
cache-extractor download and extract cache artifacts (internal)
cache-init changed permissions for cache paths (internal)
health-check check health for a specific address
read-logs reads job logs from a file, used by kubernetes executor (internal)
help, h Shows a list of commands or help for one command

GLOBAL OPTIONS:
--cpuprofile value write cpu profile to file [$CPU_PROFILE]
--debug debug mode [$RUNNER_DEBUG]
--log-format value Choose log format (options: runner, text, json) [$LOG_FORMAT]
--log-level value, -l value Log level (options: debug, info, warn, error, fatal, panic) [$LOG_LEVEL]
--help, -h show help
--version, -v print the version

由于Gitlab的工作方式与Github不同,编译博客是在上传仓库后触发的,经测试如果以_config.next.yml放入根目录下,其不能切换主题,于是需要修改themes/next/_config.yml 才可以实现自动部署后切换相应的主题。特别注意,升级Next主题的时候不要直接执行git pull命令,务必先备份主题的配置文件themes/next/_config.yml

2022-09-28 我对本文章进行了升级,原因是我在北师大配发的电脑上安装配置gitlab-runner的时候,不能正确使博客渲染,这个问题是因为对安装流程不熟悉,而注册了两个不同的gitlab-runner,于是全部删除后重新部署了一个gitlab-runner后,问题解决。特此声明,以后注意!

结论

通过对比我们发现,Github需要两个仓库,同时需要使用hexogit分别完成部署博客和保存源码操作较复杂,但是不需要安装其他软件。而Gitlab可以配置自动部署操作,其只需要git上载源码到指定仓库即可,但是其需要安装gitlab-runner,为了方便可以进一步设置开机启动,对于现代计算机而言,这点资源消耗可以忽略不计。所以我们从实用方便角度讲,Gitlab更加接近于之前的网易博客之类的网站,但是其完全自主可控。这里还有一个问题,在申请Gitlab账号时,由于需要接收一个由Google服务发送的验证码,所以通常国内不能正常申请,但是我们可以借助于VPN或者torbrowser来解决这个问题,一旦申请账号成功,则后面的操作将变得非常开心。正是由于这个原因,我的姓名全拼的域名才没有被抢占,同时也由于便捷性,今后的文章我将主要在Gitlab上发布。