江湖夜雨十年灯

使用 gitlab CI/CD 部署静态站点

李二花 / 2020-05-16


关键词:GitLab CI/CD 静态站点

前面两篇文章我分别介绍了如何使用 GitHub Project Pages 部署静态站点,如何将静态站点部署到阿里云的 OSS,这一篇我们讲解如何在 GitLab 的私有仓库通过使用 CI/CD 部署我们的静态站点到 EC2 上去。

基本介绍

使用 GitLab ,我们可以自己搭建自己的服务器部署 GitLab 服务,也可以使用互联网提供的 GitLab 服务,我选择了后者,如果你是团队办公,对代码仓库的私密性要求很高,推荐直接自己在服务器搭建你的 GitLab 服务。

我们依旧使用 Hugo 作为例子,我们将整个目录都作为版本控制的对象

public 目录就是我们生成的静态文件的存放位置。

GitLab CI/CD 介绍

CI/CD 的意思是持续集成和持续部署,我们其实想用的是里面的持续部署,GitLab 的这部分简单来讲是由这几部分构成的,首先需要有 GitLab 仓库,然后需要我们有台机器部署 GitLab-runner,他们二者不能部署到一台机器中,我们可以在任意一台 EC2 机器上部署 GitLab-runner,部署文档请参考这里

在项目根目录下添加 .gitlab-ci.yml 文件,整个持续集成系统是 Gitlab 自带的,添加的这个 Runner 就是用来到系统里解析文件中的 script 部分。

安装 GitLab-runner

以 Ubuntu 为例,直接使用 apt 安装即可,apt install gitlab-runner

注册 runner

如果你的 .gitlab-ci.yml 涉及到 docker 部分,请先在机器上安装 docker 环境,如果不需要,则直接开始注册即可。

注册前必须做的一步是获取 GitLab 的 token,位置为 Settings -> CI/CD -> Runners

下面开始进行注册的步骤,一个小例子

运行下面的命令:

sudo gitlab-runner register

输入 Gitlab 实例的 URL:

 Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
 https://gitlab.com

输入用来注册 Runner 的 token:

Please enter the gitlab-ci token for this runner
xxx

输入 Runner 的描述,随后可在 GitLab 界面中修改:

 Please enter the gitlab-ci description for this runner
 [hostame] tencentyun

输入与 Runner 绑定的标签(可修改):

 Please enter the gitlab-ci tags for this runner (comma separated):
 cicd

选择 Runner 的执行方式:

 Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
 ssh

如果选择的执行方式是 ssh,会要求填写对应一些配置,例子如下:

 # 你可以认为 runner 机器就是一个跳板机,而你选择了 ssh 执行方式之后,就相当于这个跳板机要去控制另一台机器
 # 所以需要在跳板机上配置需要提供服务的机器的用户名和 key 或者配置密码,以便于可以跳板机可以登录机器进行
 # 操作配置等相关操作
 concurrent = 1
 check_interval = 0
 
 # 第一个例子,这个使用的是 ssh 的用户名和密码
 [[runners]]
   name = "tencentyun"
   url = "https://gitlab.com"
   token = "你从 GitLab 拿到的 token"
   executor = "ssh"
   [runners.ssh]
     user = "root"  # 需要搭建静态网站的机器的用户名
     password = "xxxxxx"  # 网站机器的密码
     host = "207.246.122.100"
     port = "22"
   [runners.cache]
   
# 有一个例子,这里使用的 key   
[[runners]]
  executor = "ssh"
  [runners.ssh]
    host = "example.com"
    port = "22"
    user = "root"
    password = "password"
    identity_file = "/path/to/identity/file" # 网站机器的秘钥

注册流程走完会在 ~/etc/gitlab-runner/ 目录下生成 config.toml 配置文件,这时候就可以在 Gitlab 的设置中看到激活的 Runner:

到此我们就将我们的 GitLab 注册到了这个 runner 里去了

编写 .gitlab-ci.yml

下面我们开始编写 .gitlab-ci.yml 这个需要放到项目仓库的根目录下,里面是 yml 的脚本,一旦发生 push 或者打 tag 等的操作,就会触发 .gitlab-ci.yml,如果这个配置里的 tag 刚好关联到的 runner,这个 runner 就会执行我们这个脚本文件里的 script,实现持续集成和持续部署的操作

下面是我这个项目编写的 .gitlab-ci.yml 内容

stages:
  - deploy

# 定义 deploy 阶段的一个 job
deploy:
  stage: deploy
  tags:
    - cicd
  script:
    - echo "nihao ~~" > ~/test.txt   # 可以通过这个脚本测试,看看是否在跳板机执行到脚本了
    - rm -rf /opt/public
    - cp -r public /opt/public

需要注意的是 tags,需要和注册 runner 时配置的一致,这样才会选择那个 runner 执行下面的 script 操作,我的 script 里的操作比较简单,就是通过 runner 机器,删除对应目录下的内容,然后将我 GitLab 里的新发布的 public 目录拷贝到原来的地址,这样就完成了文档的更新。

触发自动部署

当我们进行仓库的 push 操作或者打 tag 操作时(什么时候触发也是需要我们自己配置),如果跟我们配置的触发条件一致了,就会进行自动部署,执行 script 操作。

这是个失败的操作图:

这是个成功的图:

附录:

提供服务的机器安装了 NGINX,下面是 NGINX 对于这个静态站点服务的配置

server {
    listen       80;
    #设置站点域名
    server_name 这里是你的域名;
    #指向hugo public 文件夹
    root /opt/public/;

    location / {
    }

    error_page 404 /404.html;
        location = /404.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

参考文章