使用gitlab自动化构建及部署
日常开发中,部署最新的代码做测试,通常的流程是:提交代码,然后打包,构建,上传到服务器,最后重启服务。
一套流程下来,快则几分钟,多则遥遥无期,因为部署的过程还有可能会出错。
还有个重要的问题是,每次修改一个小问题,都要执行重复的操作,时间浪费掉了。为了解决这个问题,
现在使用gitlab
的CI/CD
来解决这个问题,让这个问题自动化,我们只需要提交代码,然后等待部署完成就好。
1. 准备工作
开始之前请确保安装了以下环境:
- gitlab ,可以是私服(裸机安装),可以是
docker
的安装方式,我使用的是docker
运行的方式,版本: 13.6.3。 - docker ,用于
gitlab-runner
执行各种任务,需要能够访问gitlab
服务器。
除此之外对linux
熟悉,能够自己构建需要的docker
镜像。
2. 创建工程
我这边主要是前端工程为主,所以构建很简单,随便创建一个工程。我的前端工程package.json
中的脚本如下:
1 |
|
部署的时候执行 yarn build
,然后会在项目的根目录下生成www
文件夹,把www
文件夹中的内容拷贝到服务器上重启服务即可。
3. 注册gitlab-runner
把上一步创建的工程提交到gitlab
,然后从gitlab
网页进入工程页面。
点击左边的Setting
菜单,再进入CI/CD
子菜单,找到Runners
,点击右边的Expand
,这里会显示注册的runner
。runner
分为两种,一种是特定性,一种是共享型。
特定型就是只能给指定的项目使用,在项目里添加的就只能给这个项目使用。
共享型就是管理员在管理面板(
Admin->Runners
)添加的,可以分配给你任何一个项目使用,所以说是共享型。3.1 获取注册需要的url和token
Runners
展开之后可以看到注册runner
需要的token和url:
我这里之前在管理面板添加了一个共享型的runner
。
3.2 注册gitlab-runner
首先安装 gitlab-runner ,可以使用docker
的安装方式。
1 |
|
获取镜像之后运行命令进行注册:
1 |
|
这里将gitlab-runner
运行的配置文件挂在到本地机器上来,因为这个镜像可以注册多个runner
,执行多种任务。
注册的时候要回答几个问题:
- URL和token,就是上一个步骤获取的
url
和token
。 - description,描述信息,可空
- tags,标签,这个是必须的参数,不能留空,后面的配置文件就是根据
tags
来指定是哪个runner
来执行任务。可以添加多个tag
,用英文逗号分隔。 - executor,用哪种方式来执行任务,推荐使用docker,
docker-machine
和ssh
在将来的版本那种将被废弃。
3.3 注册完成
注册完成之后一定要重启!注册完成之后一定要重启!注册完成之后一定要重启! 重要的事情说三遍,很多教程都是注册完成就没有后文,导致后面配置了任务没有运行起来。
1 |
|
因为runner
配置的是使用docker
运行,并且runner
也是使用docker
方式运行,所我这里是将本地docker
的socket
共享给runner
,否则执行任务的时候runner
会因为找不到docker
报错。
如果是本地直接安装的gitlab-runner
,则需要在本地安装docker
。
注册完成之后在gitlab
网页上的Runners
下可以看到多了一个runner
。
点击Runner token
,进入详细,可以修改描述信息和tag。
至此runner安装并成功运行,现在处于后台运行模式,等待任务来触发。
4. 配置任务
在项目的根目录创建文件.gitlab-ci.yml
,按照各个项目的需要,配置不同的任务。
我这里以打包前端工程并上传打包后的文件到指定服务器为例,yaml文件任务配置如下:
1 |
|
配置大概注释如下:
- 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
)中:
然后重启,执行任务的时候就会先使用本地镜像。
- 测试任务
配置完成后提交代码,在gitlab
后台,查看任务触发情况:
任务已经执行完成,点击图标进去,能看到两个任务:
点击具体的任务,能够看到docker
执行的输出信息:
在右边还能下载配置的artifacts
,也可以浏览。右下角还能切换任务:
上传的任务也执行成功。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!