-
Notifications
You must be signed in to change notification settings - Fork 50
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
基于 GitLab CI 的前端工程CI/CD实践 #27
Comments
Jenkins+SonarQube+Gitlab搭建自动化持续代码扫描质量平台 |
12.5版本,出了个 |
没了解到,是针对文件缓存? |
我们 cache key 现在配的 CI_COMMIT_REF_SLUG,每切一个分支没有更新 npm 包的情况也会创建 cache,后来发现这个功能: 不用手动改 NODE_MODULES_VERSION 变量了。 |
那真是好东西啊 |
基于 GitLab CI 的前端工程CI/CD实践
CI/CD 是 Gitlab 提供的一整套持续集成、持续交付解决方案。
概念:「持续集成(Continuous Integration)」、「持续交付(Continuous Delivery)」和「持续部署(Continuous Deployment)」,概念理解详细见文章:简单理解持续集成、持续交付、持续部署 与 谈谈持续集成,持续交付,持续部署之间的区别
近期在抽空把团队工程化这块做好,CI/CD只是其中的九牛一毛。在运维文开同学协助配合下,以公司某项目前端工程做试验,实现了 CI 的过程,本质上CD也是支持了的,主要是看CD这个过程怎么做更好。自动触发了构建操作,还是直接使用构建后的
artifacts
直接部署,走不走Jenkins后续方案等……下边简单介绍一下。GitLab 的CI配置
前提:服务器部署配置了 Runner 。 如图,搞了一个
共享型的 Runner
,十几个前端工程都可以基于此 Runner 执行CI脚本。因为Runner是共享的,所以gitlab-ci.yml
中的 docker 镜像 image 建议保证每个项目不一致,这样就可以共同使用一个 Runner 来并行执行多个项目CI,本质上在不同的 docker 镜像中运行脚本,这样就不会冲突了。Runner: gitlab-runner下边是举例 Angular 前端工程 在 Gitlab 上实践的
CI
脚本,目前只做了代码检查和自动构建过程检测。实现自动化检查代码是否规范,前端限制了一些代码拼写规范、console.log禁用、alert禁用
等 tslint的约束,这些都可以在工程下自定义维护规则。aot构建是为了进一步检查一些编译问题。只要两者通过,Jenkins 构建100%是无差错的。配置:
Angular
gitlab-ci.yml
配置还可以参考:https://stackoverflow.com/questions/46269681/gitlab-ci-failing-with-angular-cli配置中有几个关键点需要了解,如:
变量
variables
用户可以自定义变量或者读取Gitlab系统自带的变量,用来动态在脚本中获取,也可以根据变量写一下if语句来执行不同的逻辑,如下:
下图是某工程下的构建配置
阶段 stages
定义 stage,stage 可以简单的理解为“步骤”,会顺序执行,如果上一步错了,那不会继续执行下一步,比如像上边定义的,第一步先
lint
检查代码规范,第二步构建。完整的阶段划分应该为:第一步先初始化,第二步检查代码规范,第三步进行单元测试,第四步构建,第五步就直接将项目部署到服务器
缓存 cache
GitLab CI/CD提供了一种 缓存机制,可用于在运行作业时节省时间。
定义全局的缓存策略,如上所说,每个不同的
stage
,CI 都会重新启动一个新的容器,所以我们之前stage
中的文件都会消失,在前端开发中,就意味着每个stage
都要重新完整装一次node_modules
,这样的时间和网络成本都不低,所以我们选择将这些文件缓存下来。但是,缓存也要讲究实效性,例如我在第二次的提交中增加了一个库,那第二次的 CI 就不能再重复使用上一次的
node_modules
缓存了,在.gitlab-ci.yml
中,我们通过设置cache
的key
来区分不同的缓存,从配置中可以看到,通过自定义变量 NODE_MODULES_VERSION 来标识node_modules
的版本,决定是否下载新的依赖,每次工程修改依赖版本或者新增模块时,维护一下这个NODE_MODULES_VERSION 版本号就可以了。可以通过监听package.json 文件版本更新,然后脚本自动修改NODE_MODULES_VERSION版本号。如脚本:compare-pk.js任务 Job
剩下就是
Job
来定义脚本了,以上的东西都是给Job
来使用的。下边举例详细说明:有缓存和无缓存CI速度对比
无缓存做一个lint检查需要约 8 分钟
有缓存则约一分半
更多配置项介绍见官方文档yaml/README
开发分支
每次提交或者
PR
都会自动触发job:lint
,PR
在代码lint或者测试没有通过的情况下,是默认无法合并的(按钮禁用,权限大的用户才能跳过检查,但不建议,除非你想出错)。更方便的是,
PR
可以设置为脚本执行通过后自动合并,当然如果需要CR (code review)
的话,可以设置为手动合并。 如果连测试都没有通过的代码,就没有必要CR
了。master 分支
可以在 master 分支做持续交付操作(CD), 主要就是自动化构建;将构建成功结果物,通过脚本来部署即可。如果还有后期的自动化接口或者组件测试,部署后执行测试,如果失败则回滚。按理是测试成功的代码,部署后就一般没有问题,除非是环境和数据引起的问题。
因为 master 分支是 dev 或者 test 分支 PR 合并过来的,所以他们的测试和代码检查一般都通过了的,当然,合并之前也会重新执行一次代码检查和测试,最后才会走构建的job。
Pipeline
Gitlab 的
Pipeline
下可以看到每次提交触发Job的执行状态,可以对执行日记查看,对应job执行成功或失败都可以发生通知给开发者。持续交付(Continuous Delivery)
持续交付在持续集成的基础上,将集成后的代码署到更贴近真实运行环境的「类生产环境」中。比如,我们完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。
从0起做好持续交付并不容易,涉及很多东西,从简单的做起吧。自动触发了构建操作,目前如何自动部署,走不走 Jenkins 后续方案讨论再定。可以保留 Jenkins 手动构建(出问题可以规避),也可以有自动化构建部署两种方案都有
后边又尝试了Gitlab Pages的CI/CD,构建后上传到远程服务器:
是一个基于
vuepress
的工程,CI 自动构建后,会将打包后的dist文件夹
上传到artifacts
, CD 操作的时候从这里那就好了。构建生成的附件可以通过
sshpass
或rsync
将附件上传到远程服务器。相关文章可以参考:App CI
Android 和 IOS CI 环境搭建参考:
以上是网友的分享文章,前半部分工作主要是搭建 Runner 和 docker 环境,有更快速的方式来搭建。我在搭建 android 环境时,使用了共享性 Runner,image选用的是开源社区的 react-native-community/ci-sample docker 镜像,然后配置对应的执行脚本即可。越过了繁琐的 android 环境搭建,这就是 docker 的好处了。
CI 工具集
常用的有以下几种:
详情了解:http://dockone.io/article/8173
Jenkins CI/CD 流程图
分享两个来自 ProcessOn 网友分享的 Jenkins CI/CD 流程图:
总结
把Runner搞成共享型的,前端的工程就不需要重复配置Runner了,后续逐步的改善即可。一个完整的ci配置应该包含这些过程:
第一步先初始化,第二步检查代码规范,第三步进行单元测试,第四步构建,第五步就直接将项目部署到服务器
。整合 DevOps,CI/CD 实现是必须的,目前市场和工具方案都特别成熟,个人认为,小团队或者大团队都有必要去学习掌握,以便改善团队的效能问题。一切能脚本自动化的工作,都不应该人工参与。无论如何,频繁部署、快速交付以及开发测试流程自动化都将成为未来软件工程的重要组成部分。
欢迎讨论~
推荐:
The text was updated successfully, but these errors were encountered: