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-runnergitlab-runner install --working-directory /home/gitlab-runner --user root   # 装置并设置--user(设置为root)sudo service gitlab-runner restart  # 重启gitlab-runnerps 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  - deploycache: # 缓存  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分钟)。