在项目开发过程中,我们经常会使用GitLab的CI/CD来自动部署项目,今天就让我们来实现一个在Linux下启用GItLab的CI/CD来实现Go项目的自动部署。

我们需要在GitLab上有一个项目,这里就不做演示了,我们直接开始先安装runners。

1 安装runners

GitLab有三种Runner,分别是:

  • Shared runners are available to all groups and projects in a GitLab instance.
  • Group runners are available to all projects and subgroups in a group.
  • Specific runners are associated with specific projects. Typically, specific runners are used for one project at a time.

理解来说的话,就是:

  • Shared runners是所有组和项目都可以使用共享流道,管理员来操作,通常只用在小团队中,GitLab中,默认是没有的。
  • Group runners比较常用,可以支持团队内多个项目共享。 可复用的Runner,可以同时支持一类项目的CI,提高资源复用率。
  • Specific runners则是与特定的项目关联,不能共享。 而且,对个人项目来说,没有Group这一层,使用Specific runners是比较合适的。

Runner是由运行在服务器上的守护进程来管理,一个守护进程可以管理多个runner,多个runner之间是根据token和url,注册到指定的GitLab上。

下面的教程也是基于Specific runners来做演示,首先我们先下载GitLab的runner,我们先进入GitLab的runner下载页面:https://docs.gitlab.com/runner/install/,可以看到官方的安装教程。

我现在使用的机器是一台腾讯云的Linux服务器,因此我需要选择Install on GNU/Linux,如下图所示:




如果大家使用的是别的系统,可以选择对应的下载方式即可。

然后可以根据提示进入下载页面,也可直接看下面的例子,下载对应的安装包,演示的机器使用的是Centos,选择下面的例子即可。


这时候会发现,这个命令里有一个${arch}的参数,我们看注释:

${arch}可以替换为任何支持的体系架构,也就是我们需要改成这个样子:

这个也要根据自己实际的机器的情况来做选择,我当前使用的是amd64。我们也可以使用uname -m 命令来查看机器的架构,如:

我的服务器是x86架构的,用m1的Mac查询,返回如下:


然后我们也可以使用自己的电脑直接使用浏览器访问curl的地址,查看链接是否正常,能否正常下载。

测试过后,直接在服务器上的终端里使用上面列出的curl命令来下载对应的rpm包。


由于服务器上下载较慢,我直接使用浏览器下载的,截图里做个示范。

然后使用rpm命令安装即可

安装gitlab-runner需要有git的环境,如果没有需要自行安装一下,Centos可以直接使用yum安装。

安装完成后,使用命令

查看版本,显示如下,说明安装成功。




2 在GitLab里获取token

在runner安装完成之后,我们回到GitLab的项目的Settings页面,进入CI/CD后,点开Runners里的Expand按钮,如图所示:




点开后会看到 Specific runners用来注册的URL和token,这个我们在注册runners的时候需要填写。



继续回到服务器里,使用gitlab-runner开始注册

几个参数说明:

  • GitLab instance URL:写上面截图里CI/CD里注册用的那个地址;
  • token:写上面截图里CI/CD里注册用的那个token
  • description:填写相关描述
  • tags:选填,也可在GitLab的网页上修改,和gitlab的.gitlab-ci.yml文件里配置的tags有关;比如对一个runner设置了某个标签后,对应的Job必须要设置这个标签,才能在这个runner上执行。
  • executor:直接就选shell吧,使用shell命令,简单有效。

当我们注册成功后,就可以在GitLab的界面看到这个runner。


这样,一个runner就注册成功了。

3 写.gitlab-ci.yml文件,实现自动部署

到目前为止,我们已经成功安装了runner和完成了runner的注册,接写来,模拟一个简单的.gitlab-ci.yml文件,来实现Go项目的自动部署。

在job运行时,我们重新打包的进程,需要重启,这时候我们可以考虑使用守护进程来启动项目,需要如何操作呢,首先在/etc/systemd/system目录下新建一个配置文件,

然后粘贴如下代码

  • User和Group要填写对应的用户和组;
  • ExecStart,是打包后的可执行文件的目录


.gitlab-ci.yml文件我给出了一个示例,具体的语法可以去参考GitLab的官方文档。

yml文件里的tags就是在注册runner的时候填写的tags,刚才我们留空了,是因为可以在GitLab的网页端进行修改,在网页端对应的runner处,点击编辑,进去后就可以修改了。



然后修改成在yml文件里配置的就可以了。

4 补充:gitlab-runner权限的问题

其实我们使用了systemctl来守护进程,也会遇到一个问题就是,gitlab-runner在执行的时候,使用的是gitlab-runner用户,因此会导致权限不足,而们可以修改gitlab-runner的默认用户来解决这个问题,

然后将--user的参数从gitlab-runner改成root即可。


最后代码push上去之后,就可以在GitLab网页端的CI/CD里的jobs里看到job的状态了。




这样就实现了一个基础的CI/CD的流水线部署了。


如有问题,欢迎留言,祝大家工作顺利~