1. 前言
之前始终用 jeakins 部署,最近理解了一下 gitlab-ci,就想尝试一下,中途遇到很多坑。
简略的记录一下,而后谈一谈本人对于部署的一些了解。
2.gitlab-ci
简介
前端 CICD 我了解的就是代码通过本地各种校验后的一直集成到近程分支,而后触发一列行为(比方装置,打包,测试,部署)。
个别须要两个服务器,
一个是 ci 服务器,用来跑各种工作(装置,打包,测试,部署等等)
另外一个就是部署服务器,能够是一个 nginx,来展现动态资源。
jeakins 能够了解为一个 ci 服务器。
当然 gitlab 自身也提供一个 ci 服务器, 那就是 gitlab-ci
这期间我遇到了好多坑,快解体了。
装置 runner 的坑
如果是 gitlab 我的项目,在 setting-cicd 中,左侧是私人的 runner,右侧是其他人提供的 runner
runner 能够简略了解为 ci 服务器上跑的 ci 服务
然而须要留神的是他人的 runner 不肯定实用你,因为人家的 ci 服务器上的环境兴许是 java 环境,没装 node,没装你须要的一些全局包。所以个别都须要本人做一个合乎本人我的项目的前端通用 runner。
第一步:runner 服务器抉择
首先如果你是集体 gitlab 我的项目,那么你能够找轻易找一台服务器。然而你是公司的我的项目,最初找一台公司内网服务器装置,应该外网服务器不肯定能拜访你公司的本人搭的 gitlab。
第二步:装置 runner 形式抉择
装置的话能够参考官网装置,有几种形式. 然而对于我来说,因为公司的服务器不能翻墙,下载安装包特地慢,慢到解体的那种,所以我间接采纳先下载安装包,再装置的形式。留神 linux x86_64 对应的安装包是 amd64,别下错了。
第三步:装置全局依赖包
runner 只是在 ci 服务器中一个服务,本地找不到包还是得从全局找。
所以须要 ci 服务器装置 git nvm(治理 node) nrm (治理 npm 源) vue-cli-serve 等等一些罕用的全局包。
第四步:注册 runner
注册很简略,其实就是 runner 和 gitlab 建设链接
gitlab-runner register
按提醒一步步来就行了,肯定得是 ci 服务器能连的上 gitlab 才行
token 和 url 在 setting-runner 外面找完预先就能够发现自定义 runner 多了一个且可用。
第五步:更改 runner 权限
必定得用 root 权限执行,默认用户 runner 公司的服务器不认
sudo gitlab-runner uninstall # 删除 gitlab-runner
gitlab-runner install --working-directory /home/gitlab-runner --user root # 装置并设置 --user(设置为 root)
sudo service gitlab-runner restart # 重启 gitlab-runner
ps aux|grep gitlab-runner # 查看以后 runner 用户
3. 跑通部署服务
.gitlab-ci.yml
我的项目根目录上面增加.gitlab-ci.yml 文件,每次提交的时候 gitlab 依据该文件启动 runner。
具体的含意大家本人去搜,我只说几个要害的中央。
- runner 有名字,我的 runner 叫 fyy,tag 参数用来执行须要触发的 runner
- stage 是阶段,个别有三个阶段(加上单元测试、集成测试之类的代码检测的能够是四个)
- 每阶段实现,生成的文件会被删除,所以须要 cache 缓存一下
- only 参数指定只有哪个分支变动才触发 runner
一个可用的参考的脚本
stages:
- install
- build
- deploy
cache: # 缓存
paths:
- node_modules
- dist
第一阶段 -install:
tags:
- fyy
stage: install
script:
- pnpm install
- echo '依赖装置胜利!'
only:
- mono-dp
第二阶段 -build:
tags:
- fyy
stage: build
script:
- pnpm buildTest
- echo '测试环境代码打包胜利!'
only:
- mono-dp
第三阶段 -deploy:
tags:
- fyy
stage: deploy
script: # 具体的部署形式,这里是惯例的部署,也能够容器化部署
- cd dist
- tar -cf dist.tar --exclude=./dist.tar .
- 具体的 shell 脚本(ssh 链接,拷贝到指定目录,解压之类的)only:
- mono-dp
npm 装置的坑
这个时候基本上能够了,mono-dp push 下来会触发 ci 操作,在 pipeline 外面能够看到流程。
我遇到的问题是 npm 装置的时候会报一些错,这个应该是我 pnpm.lock 文件有问题引起的。
排查问题能够间接登录近程服务器手动试一试,手动在 runner 的我的项目目录外面/home/gitlab-runner/builds/-qUnF6qy/0/webproject/convergencemarketing/
npm insatll build 排查下,这个时候不要走 ci 流程了,会很慢。
runner 打包的坑
我遇到的问题是我的项目有些依赖走的全局包,比方有个包叫 chalk, 没写进 Package 里,ci 的时候因为 Package 里没有就不会装置, 导致打包谬误
解决方案就是排查下,我的项目不要有依赖全局包的,全副改成本地的
然而 vue-cli-serve 这种就没方法,只能 ci 服务器全局去装
4. 总结与思考
最初亮一下胜利的截图
总体来说和 jekins 很相似,比拟适宜团队开发与大型项目开发,流程比较清楚。
然而毛病也是有的,感觉比较慢,我这个我的项目大略 12 分钟 这还是有 pnpm+ 缓存。
对于我这种小公司小我的项目,间接本地打包传上去部署(走本人写的部署服务,或者间接应用上传软件或者自定义 plugin)会不会更适宜一点(能管制在 1 分钟)。