React Native项目自动化打包发布
今天这篇文章的目的是在rn项目的构建,并不会涉及到rn框架或者使用的讲解,说起构建,特别是前端构建大家应该很快会想到webpack、Grunt、 Gulp等。而这些工具在rn项目中就显得有些鸡肋。所以在此给大家分享一下不使用构建工具实现rn项目自动化打包发布的思路。
涉及到的工具
相关概念
1.GitLab CI是 GitLab 提供的持续集成服务,只要在你的仓库根目录 创建一个.gitlab-ci.yml 文件, 并为该项目指派一个Runner,当有合并请求或者 push的时候就会触发build。 这个.gitlab-ci.yml 文件定义GitLab runner要做哪些操作。 默认有3个[stages(阶段)]: build、test、deploy。 更详细的可以查看官方文档
2.GitLab-Runner是配合GitLab-CI进行使用的。一般地,GitLab里面的每一个工程都会定义一个属于这个工程的软件集成脚本,用来自动化地完成一些软件集成工作。当这个工程的仓库代码发生变动时,比如有人push了代码,GitLab就会将这个变动通知GitLab-CI。这时GitLab-CI会找出与这个工程相关联的Runner,并通知这些Runner把代码更新到本地并执行预定义好的执行脚本。
所以,GitLab-Runner就是一个用来执行软件集成脚本的东西。你可以想象一下:Runner就像一个个的工人,而GitLab-CI就是这些工人的一个管理中心,所有工人都要在GitLab-CI里面登记注册,并且表明自己是为哪个工程服务的。当相应的工程发生变化时,GitLab-CI就会通知相应的工人执行软件集成脚本。如下图所示:
3.Pipelines是定义于.gitlab-ci.yml中的不同阶段的不同任务。 我把Pipelines理解为流水线,流水线包含有多个阶段(stages),每个阶段包含有一个或多个工序(jobs),比如先购料、组装、测试、包装再上线销售,每一次push或者MR都要经过流水线之后才可以合格出厂。而.gitlab-ci.yml正是定义了这条流水线有哪些阶段,每个阶段要做什么事
编写gitlab—ci (以Android打包为例)
build_apk_release: stage: test when: manual variables: GIT_SUBMODULE_STRATEGY: recursive environment: Development script: - zsh build.sh android Release "" artifacts: expire_in: 2 hrs paths: - K*.apk only: - /^master$|^branch\/*|^release\/*/ tags: - mac-shell cache: paths: - node_modules/ 复制代码
关键代码script,其实就是指向我们真正的打包脚本build.sh
编写build.sh
funBundle(){ echo $1 echo $2 echo $3 funWithInit case $1 in "iOS") funWithiOS $2 ;; "android") funWithAndroid $2 $3 ;; "apks") funWithAndroidApks ;; *) echo "not mismatchimg" esac } funBundle $1 $2 $3 复制代码
找到对应的funWithAndroid代码
funWithAndroidApks(){ apkClear for flavor in kuaibao huawei 360helper yingyongbao aliyun baidu xiaomi meizu uc jifeng sougou oppo vivo yiyonghui chuizi 91helper anzhi wandoujia mumayi yingyonghui anzhuo lianxiang huawei oppo vivo yiyonghui chuizi yiyou; do pushd android && ./gradlew "assemble${flavor}Release" && popd done gradle --stop cp android/app/build/outputs/apk/apk/release/*.apk ~/Documents/Apks/ gitClear } 复制代码
funWithAndroid(){ apkClear assembleName="assemble$1$2" echo assembleName pushd android && ./gradlew --no-daemon ${assembleName} && popd cp -r android/app/build/outputs/apk/*.apk . assembleApk=`ls *.apk` if [ "$1"x = "Release"x ]; then pushApp ${assembleApk} fi gitClear } } 复制代码
pushApp(){ apiKey='cd61f47742ae6d80****************' uKey='21607fc*********************' curl -F "file=@$1" -F "uKey=$uKey" -F "_api_key=$apiKey" https://www.pgyer.com/apiv1/**** } 复制代码
脚本代码很简单,利用gradlew进行打包,通过最后一段代码上传至蒲公英 这样一个自动打包上传脚本编写完成。ios可参照。
接下来我们来看看如何利用ci实现rn的热更打包,自动上传(这里使用code-push来实现热更,服务端是小编自己搭建的,后期可以分享给大家)
编写gitlab—ci 实现打包入口
build_hot_fix_stag: stage: test when: manual script: - yarn config set registry https://registry.npm.taobao.org - yarn config set disturl https://npm.taobao.org/dist - yarn install - zsh autoppk.sh both Staging only: - /^master$|^branch\/*|^release\/*/ tags: - mac-shell cache: paths: - node_modules/ 复制代码
同样还是找重点,script中进行了3个步骤(npm/yarn)
- 设置淘宝镜像源
- 安装依赖
- 执行autoppk.sh脚本
编写打包脚本 autoppk.sh
#!/bin/bash #read env echo '正在准备发布热更新...' bundle(){ node packppk.js '****' $1 $2 } clean(){ echo 'delete react-native-packager-cache' rm -rf ./react-native-packager-cache-* } funBundle(){ bundle $1 $2 } funBundle $1 $2 #clean 复制代码
packppk.js
var codepushReleaseReact = require('./release-react') var updateConfig = require('./update') function bundle() { console.log("玩命打包中 ......") const appName = process.argv[2] || 'app' const platform = process.argv[3] || 'both' const deploymentName = process.argv[4] || 'Staging' console.log('platform:' + platform) console.log('deploymentName:' + deploymentName) switch (platform) { case 'both': console.log('开始打包双平台') codepushReleaseReact({ ...updateConfig.ios, deploymentName }, 'ios', appName) codepushReleaseReact({ ...updateConfig.android, deploymentName }, 'android', appName) break default: } } bundle() 复制代码
codepushReleaseReact
function reactNativeRelease (argv, platform, name) { return [ "code-push", "release-react", appName(name, platform), platform, `-d "${argv.deploymentName}"`, `--des "${argv.description}"`, `--dev ${argv.development}`, `-m ${argv.mandatory}`, targetBinary(argv.targetBinary) ].join(" ") } 复制代码
至此rn热更打包,自动上传就已经完成了,相信了解过code-push的同学应该很容易理解脚本的含义,在实际项目中写完脚本并不算真正的结束,我们要利用脚本实现自动化,解放双手
将我们写好的脚本部署到gitlab
说到脚本的部署其实gitlab已经帮我们做好了,当我们在项目中创建gitlab-ci.yml时,部署工作就算完成,剩下的就是编写具体的job,而我们编写好的job具体实现就得靠文章一开始所提到的Runner。
当我们push项目,或者创建merge request的时候会触发对应的CI pipeline,从而开始让runner执行我们提前编写好的job。
对于一个前端项目来说,自动化的构建是很有必要的,同时我们也可以通过gitlab实现更多的功能比如eslint/Flow代码检测,单元测试等等。利用脚本实现一些机械工作,提高工作效率。
另外这种思路同样适用于其他项目vue、react等前端项目,Android、ios等移动端项目。区别只是在于如何利用各自的资源。
文章可能有很多不足的地方,希望大家指正,同时也希望大家可以多多交流,分享出更多的技术方案,谢谢~~
技术交流群:581621024 关注小编 公众号:LearningTech 每日更新前端技术

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
React-native 开发环境配置(win版本)
搭建开发环境 1、首先下载node.js 下载链接:https://nodejs.org/zh-cn/ ; 2、安装node.js; 3、安装完成,运行打终端输入:nmp -v 显示node.js版本号,表示安装成功,如图 node.js安装成功 4、打开终端输入: npm install -g yarn react-native-cli打开react-native命令行工具,打开成功 react-native命令行工具打开中 打开成功,如图 打开成功 5、初始化第一个RN项目,在终端中输入:react-native init FirstTest,回车 初始化项目 其中 react-native init 为固定格式,FirstTest为项目名称; 成功创建项目 6、指定文件夹下出现项目 项目 7、当模拟器运行在电脑上或者有测试连接电脑之后,通过终端在项目的根目录输入 react-native run-android命令运行项目,此时会弹出node.js模拟器,如图: node.js模拟器 同时电脑会下载https://services.gradle.org/distributions...
- 下一篇
Android 弹性布局 FlexboxLayout了解一下
原文链接:https://mp.weixin.qq.com/s/Mi3cK7xujmEMI_rc51-r4g RelativeLayout、LinearLayout等常用布局相信大家早已耳熟能详,今天给大家介绍一款新的布局方式「弹性布局」--FlexboxLayout。Flex是Flexible Box的缩写,意为「弹性布局」,在前端css样式中应用甚为广泛,之前做过React-Native和微信小程序,页面布局大多使用flex弹性布局,可以在不同屏幕尺寸上提供一致的布局结构,可以简便、完整、响应式地实现各种页面布局,今天为大家打开Android移动端的flex布局大门--FlexboxLayout,在android中我们经常所见的标签、流式布局等都可以用FlexboxLayout来实现。 安装 build 依赖 dependencies { implementation 'com.google.android:flexbox:1.0.0' } FlexboxLayout 属性介绍 flexDirection flex-direction 属性决定主轴的方向(即内部子元素的排列方向)。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS关闭SELinux安全模块
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作