gitlab-ci从入门到差点放弃

蚀刻阈值
• 阅读 2079

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。
gitlab-ci从入门到差点放弃

第一步: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多了一个且可用。
gitlab-ci从入门到差点放弃

第五步:更改runner权限
肯定得用root权限执行,默认用户runner 公司的服务器不认
gitlab-ci从入门到差点放弃

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

gitlab-ci从入门到差点放弃
gitlab-ci从入门到差点放弃

一个可用的参考的脚本

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.总结与思考

最后亮一下成功的截图
gitlab-ci从入门到差点放弃
总体来说和jekins很类似,比较适合团队开发与大型项目开发,流程比较清楚。
但是缺点也是有的,感觉比较慢,我这个项目大概12分钟 这还是有pnpm+缓存。
对于我这种小公司小项目,直接本地打包传上去部署(走自己写的部署服务,或者直接使用上传软件或者自定义plugin)会不会更适合一点(能控制在1分钟)。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
代码还原的技术: Unidbg hook_add_new实现条件断点(二)
一、目标在做代码还原的时候,有时候会分析一组结果,希望在中途下个条件断点,比如在代码行0x1234,R00x5678的时候触发断点。今天我们就来试着搞一下。TIP:Unidbg代码同步到官方最新版,最新版已经支持浮点寄存器的显示了。二、步骤先写个floatdemotwo把祖传算法升个级extern"C"JNIEXPORTjstringJNIC
Stella981 Stella981
3年前
Python Challenge Level 18
初学Python,挑战一下流行的PythonChallenge,很不幸,卡在了18关~~被字符字节码之间的转换搞得焦头烂额,不过终于搞定了还是很happy的~~~主要的问题就是16进制形式的字符如何转成字节码(注意:不是encoding)如:\'89','50','4e','47','0d','0a','1a','0a','00
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
Linux日志安全分析技巧
0x00前言我正在整理一个项目,收集和汇总了一些应急响应案例(不断更新中)。GitHub地址:https://github.com/Bypass007/EmergencyResponseNotes本文主要介绍Linux日志分析的技巧,更多详细信息请访问Github地址,欢迎Star。0x01日志简介Lin
Stella981 Stella981
3年前
Hibernate纯sql查询结果和该sql在数据库直接查询结果不一致
问题:今天在做一个查询的时候发现一个问题,我先在数据库实现了我需要的sql,然后我在代码中代码:selectdistinctd.id,d.name,COALESCE(c.count_num,0),COALESCE(c.count_fix,0),COALESCE(c