前端框架设计

浅谈前端组件发布自动化

2019-03-19  本文已影响0人  golddream_y

浅谈前端组件发布自动化

从09年angularJS被谷歌推出以来,涌现了很多前端应用的开发、设计等方面优秀的解决方案(框架 、库、设计规范)。随着SPA的普及,"Web Components"的设计标准渐渐开始影响各个框架的设计方向,开发人员的逻辑封装也不再像以前效率相对低下,优秀的框架给开发者提供了简洁且快速的组件化解决方案。

本文会尽量少的贴代码,尽量少的谈及工程化本身的东西,旨在分享组件自动化基础设施建设过程中的些许经验。

工程化的内容后续会有单独的“毒文”来祸害大家。

一、应用背景

如上所述,中大型的团队或公司在未来的一段时间,都需要封装足够多且完善的UI组件来支撑快速开发降低学习成本。这样的情境下,就会有一些人,去进行组件的标准化开发,快速迭代,而随之而来且亟待解决的问题:

组件发布自动化的目的不仅仅是减少你的手动构建、发布的工作量,它的本质是对多人协同组件开发方式的规范和管控

没有这些你的前端研发工作也能支撑?能用和好用是两个概念。

二、涉众及相关技术栈

1、人员涉众

2、相关技术名词

了解以下,阅读过程会相对轻松:

3、工程职责

为了详略得当,这里列举工程的一些基础功能(这里默认已经实现,实际需要我们自己根据我们的实际情况去实现),以免赘述与本文不相关的内容。

  1. 包输出:工程提供构建的基础功能(将源码输出为npm仓库的package的功能)
  2. 文档输出:工程提供文档输出的功能(推荐markdown手写合成的体验较好的文档输出机制)
  3. 测试:提供单元或e2e测试的基础框架

三、流程概览

自动化流程.png

如上图所示,发布流程主要为(区别化的内容加粗):

  1. 开发人员提交代码(git push)/配置管理员打tag
  2. git接到push/tag,根据配置好的webhook给jenkins发请求
  3. jenkins接收请求并触发指定的task,根据jenkinsFile执行pipeline:
    • 更新项目并检查设置
    • sonar:推送代码到sonar
    • 测试:单元测试&&e2e测试
    • package构建
    • package发布:计算版本号并发布package
      • 根据git 的最后一条log计算下一版本号
      • 根据git的最后一条log区分发布测试版本(snapshots)还是正式版本(release)
    • 构建doc
    • 发布doc:根据git的最后一条log区分发布测试版本文档(snapshots)还是正式版本文档(release)

四、流程详述(冗长的细节,可略)

1、update project - 更新项目并检查设置

echo 'update source'
checkout scm
echo 'reset config'
sh './gradlew widget-pkg-reset-config -q'
echo 'update dependencies'
sh 'npm install && npm update'

2、test - 测试

暂略。

3、build source - 构建资源

echo 'Building source..'
sh 'npm run pre-release'
echo 'Build source completed'

4、publish source

sh './gradlew widget-pkg-modify-version -q'
sh './gradlew widget-pkg-set-config -q'
echo 'Publish source..'
sh 'npm run publish-to-npm'

5、build doc

echo 'Building doc..'
sh 'npm run build'
echo 'Build doc completed'

6、publish doc

echo 'Publish doc..'
sh './gradlew widget-docs-publish -q'
echo 'source doc completed'

五、专项剖析

1、不同层级的行为及调用关系分析

行为及调用关系分析.png

2、版本的计算

2.1、版本发布到正式、测试仓库的判断规则

检查当前仓储的最后一次行为(git log):

2.2、版本递增计算规则

请综合参照:

3、如何指定版本号发布

在发布时遇到的一个问题,java的包发布的版本可以通过gradle变量来指定,那前端的package的版本号如何动态指定?在npm文档搜索无果后,决定写插件去修改“package.json”的version来指定发布版本。

为了避免导致其他问题,建议在初始化的步骤将“package.json”进行checkout

五、总结和思考

1、如何在“简化技术栈”与“前后端自动化统一”上做出取舍?

这其中的一个关键点为,前端自动化为什么要使用gradle。

在本文的实践中,受我们团队已经存在后端的自动化工作流的影响,为了与其统一版本的升级规则,会用到gradle的“axion-release-plugin”插件,以及在发布到webdav时会用到“uk.co.firstzero.webdav”,出于前后端统一和不重复造轮子考虑,前端才增加gradle的使用。

那么我们不用gradle可以吗?当然可以,你只需要以上提到的内容用node再造一遍轮子,祝你好运。

送一个版本计算的node轮子(不再更新,但可供参考):axion-release-node-plugin

2、前端有各种lint,sonar相对前端的意义大吗?

后续补充。

上一篇 下一篇

猜你喜欢

热点阅读