使用gitlab自动化构建及部署

日常开发中,部署最新的代码做测试,通常的流程是:提交代码,然后打包,构建,上传到服务器,最后重启服务。
一套流程下来,快则几分钟,多则遥遥无期,因为部署的过程还有可能会出错。

还有个重要的问题是,每次修改一个小问题,都要执行重复的操作,时间浪费掉了。为了解决这个问题,
现在使用gitlabCI/CD来解决这个问题,让这个问题自动化,我们只需要提交代码,然后等待部署完成就好。

1. 准备工作

开始之前请确保安装了以下环境:

  • gitlab ,可以是私服(裸机安装),可以是docker的安装方式,我使用的是docker运行的方式,版本: 13.6.3。
  • docker ,用于gitlab-runner执行各种任务,需要能够访问gitlab服务器。

除此之外对linux熟悉,能够自己构建需要的docker镜像。

2. 创建工程

我这边主要是前端工程为主,所以构建很简单,随便创建一个工程。我的前端工程package.json中的脚本如下:

1
2
3
4
5
6
7
8
9
{
"scripts": {
"build": "hexo generate",
"clean": "hexo clean",
"deploy": "hexo deploy",
"server": "hexo server"
}
}

部署的时候执行 yarn build ,然后会在项目的根目录下生成www文件夹,把www文件夹中的内容拷贝到服务器上重启服务即可。

3. 注册gitlab-runner

把上一步创建的工程提交到gitlab,然后从gitlab网页进入工程页面。

点击左边的Setting菜单,再进入CI/CD子菜单,找到Runners,点击右边的Expand,这里会显示注册的runner
runner分为两种,一种是特定性,一种是共享型。

  • 特定型就是只能给指定的项目使用,在项目里添加的就只能给这个项目使用。

  • 共享型就是管理员在管理面板(Admin->Runners)添加的,可以分配给你任何一个项目使用,所以说是共享型。

    3.1 获取注册需要的url和token

    Runners展开之后可以看到注册runner需要的tokenurl
    add-runner-page.png

我这里之前在管理面板添加了一个共享型的runner

3.2 注册gitlab-runner

首先安装 gitlab-runner ,可以使用docker的安装方式。

1
sudo docker pull gitlab/gitlab-runne

获取镜像之后运行命令进行注册:

1
sudo docker run --rm -v /volume1/docker/gitlab-runner:/etc/gitlab-runner -ti gitlab/gitlab-runner register

这里将gitlab-runner运行的配置文件挂在到本地机器上来,因为这个镜像可以注册多个runner,执行多种任务。
注册的时候要回答几个问题:

  • URL和token,就是上一个步骤获取的urltoken
  • description,描述信息,可空
  • tags,标签,这个是必须的参数,不能留空,后面的配置文件就是根据tags来指定是哪个runner来执行任务。可以添加多个tag,用英文逗号分隔。
  • executor,用哪种方式来执行任务,推荐使用dockerdocker-machinessh在将来的版本那种将被废弃。

img_11.png

3.3 注册完成

注册完成之后一定要重启!注册完成之后一定要重启!注册完成之后一定要重启! 重要的事情说三遍,很多教程都是注册完成就没有后文,导致后面配置了任务没有运行起来。

1
sudo docker run -d --name gitlab-runner -v /var.defaults/run/docker.sock:/var/run/docker.sock -v /volume1/docker/gitlab-runner:/etc/gitlab-runner gitlab/gitlab-runner

因为runner配置的是使用docker运行,并且runner也是使用docker方式运行,所我这里是将本地dockersocket共享给runner,否则执行任务的时候runner会因为找不到docker报错。
如果是本地直接安装的gitlab-runner,则需要在本地安装docker

注册完成之后在gitlab网页上的Runners下可以看到多了一个runner
img_12.png
点击Runner token,进入详细,可以修改描述信息和tag。
img_13.png
至此runner安装并成功运行,现在处于后台运行模式,等待任务来触发。

4. 配置任务

在项目的根目录创建文件.gitlab-ci.yml,按照各个项目的需要,配置不同的任务。

我这里以打包前端工程并上传打包后的文件到指定服务器为例,yaml文件任务配置如下:

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
stages:
- build
- deploy

variables:
APPHOME: /volume1/app/picture-server

build:
stage: build
image: node:latest
tags:
- node
script:
- yarn config set registry https://registry.npm.taobao.org -g
- yarn config set disturl https://npm.taobao.org/dist -g
- rm -rf yarn.lock
- yarn install
- yarn run build
artifacts:
paths:
- www
cache:
key: node
paths:
- node_modules
only:
- master


deploy:
stage: deploy
image: ssh:rean
tags:
- node
script:
- scp -r -P 1024 www/* rean@192.168.0.114:$APPHOME
- ssh rean@192.168.0.114 -p 1024 "source /etc/profile;sudo docker restart picture-server"

配置大概注释如下:

  • stages,任务,这个表示有两个任务要执行(后面有配置节点),顺序执行。先执行build,再执行deploy
  • variables,变量,可以在后面使用$加上变量名来使用。
  • build,任务名称,和后面deploy一样。
  • image,执行任务使用的docker镜像,不指定就使用注册runner时填写的默认值。
  • tags,可以执行该任务的runner,可以配置多个,哪个空闲哪个来执行,对应注册runner时填写的tags
  • script,在docker容器里面执行的命令。
  • artifacts,产出物,我这里是把www(相对于项目根目录,我这里是配置打包后的文件放在www文件夹)文件夹作为产出,这个产出可以在后面的任务中使用。
  • cache,缓存,可以将一些常用的库作为缓存
  • only,触发任务的分支,可以填写多个,只有有提交,就会执行。

我这里配置了两个任务,第一个任务负责打包,将结果保存到www文件夹。第二个任务将www文件夹上传到服务器,然后重启服务,完成部署。
这里用到了三个docker镜像:

  • node:latest,用来打包。
  • ssh:rean, 用来上传文件,这个docker已经将自己的ssh公钥上传到了目标服务器。所以执行ssh命令和scp上传文件不需要输入密码。
  • picture-server,这个是应用部署服务器,共享主机文件夹,只需要重启就能应用最新代码。

如果本地已经有了docker镜像,执行任务的时候又去获取镜像,将这个配置加到runner的配置文件(/etc/gitlab-runner/config.toml)中:
img_14.png
然后重启,执行任务的时候就会先使用本地镜像。

  1. 测试任务
    配置完成后提交代码,在gitlab后台,查看任务触发情况:

img_15.png
任务已经执行完成,点击图标进去,能看到两个任务:
img_16.png
点击具体的任务,能够看到docker执行的输出信息:
img_17.png
在右边还能下载配置的artifacts,也可以浏览。右下角还能切换任务:
img_18.png
上传的任务也执行成功。