React Native项目自动化打包发布

今天这篇文章的目的是在rn项目的构建,并不会涉及到rn框架或者使用的讲解,说起构建,特别是前端构建大家应该很快会想到webpack、Grunt、 Gulp等。而这些工具在rn项目中就显得有些鸡肋。所以在此给大家分享一下不使用构建工具实现rn项目自动化打包发布的思路。

涉及到的工具
  1. gitlab
  2. docker
相关概念

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就会通知相应的工人执行软件集成脚本。如下图所示:

1171685-20170629165716758-915731937-2.png

3.Pipelines是定义于.gitlab-ci.yml中的不同阶段的不同任务。 我把Pipelines理解为流水线,流水线包含有多个阶段(stages),每个阶段包含有一个或多个工序(jobs),比如先购料、组装、测试、包装再上线销售,每一次push或者MR都要经过流水线之后才可以合格出厂。而.gitlab-ci.yml正是定义了这条流水线有哪些阶段,每个阶段要做什么事

编写gitlab—ci (以Android打包为例)
build_apk_release:stage: testwhen: manualvariables:GIT_SUBMODULE_STRATEGY: recursiveenvironment: Developmentscript:- zsh build.sh android Release ""artifacts:expire_in: 2 hrspaths:- K*.apkonly:- /^master$|^branch\/*|^release\/*/tags:- mac-shellcache:paths:- node_modules/

关键代码script,其实就是指向我们真正的打包脚本build.sh

编写build.sh
funBundle(){echo $1echo $2echo $3funWithInitcase $1 in"iOS")funWithiOS $2;;"android")funWithAndroid $2 $3;;"apks")funWithAndroidApks;;*)echo "not mismatchimg"esac}
funBundle $1 $2 $3

找到对应的funWithAndroid代码

funWithAndroidApks(){apkClearfor 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;dopushd android && ./gradlew "assemble${flavor}Release" && popddonegradle --stopcp  android/app/build/outputs/apk/apk/release/*.apk ~/Documents/Apks/gitClear
}
funWithAndroid(){apkClearassembleName="assemble$1$2"echo assembleNamepushd android && ./gradlew --no-daemon ${assembleName} && popdcp -r android/app/build/outputs/apk/*.apk .assembleApk=`ls *.apk`if [ "$1"x = "Release"x ]; thenpushApp ${assembleApk}figitClear}
}
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: testwhen: manualscript:- yarn config set registry https://registry.npm.taobao.org- yarn config set disturl https://npm.taobao.org/dist- yarn install- zsh autoppk.sh both Stagingonly:- /^master$|^branch\/*|^release\/*/tags:-  mac-shellcache:paths:- node_modules/

同样还是找重点,script中进行了3个步骤(npm/yarn)

  1. 设置淘宝镜像源
  2. 安装依赖
  3. 执行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)breakdefault:}
}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 每日更新前端技术

qrcode_for_gh_4dda50fa73f6_430.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python程序员之面试必回习题

写在前面 近日恰逢学生毕业季,课程后期大家“期待苦逼”的时刻莫过于每天早上内容回顾和面试题问答部分【临近毕业每天课前用40-60分钟对之前内容回顾、提问和补充,专挑班里不爱说话就的同学回答】。 期待的是可以检验自己学习的成功;苦逼的是…

如何用正则表达式杀死Java

我们最近偶然发现了一个我们绝对不了解的现象:您可以使用简单的正则表达式杀死任何Java IDE以及任何Java进程… 回到大学后,我被告知正则表达式(称为正则语法或3型语法)总是以有限状态的自动机结束,因此可以在线性时间…

php for next,Nextcloud停留无限登录页面 PHP7的问题及解决方案

Nextcloud 14或者15 无法打开登录界面出现错误信息如下:内部服务器错误服务器不能完成你的请求。如果再次发生,请在下方将技术详情发送给服务器管理员。更多细节可以在服务器日志中找到.技术细节远程地址: 210.22.126.186请求 ID: kSPvbdWDU7yvwng3516v请…

开发VUE使用第三库,发现有bug怎么办?

写在前面 本文只针对使用vue技术栈,进行讨论。 正文 使用vue技术栈开发,难免会使用第三库,这大大提高了我们开发的效率。然而,这是第三方库有bug怎么办? 既然有bug,就是现有功能没有达到预想效果。除了&a…

Java正则表达式中的反向引用

Java正则表达式中的反向引用是Java提供的另一个重要功能。 要了解反向引用 ,我们首先需要了解群组 。 正则表达式中的分组意味着将多个字符视为一个单元。 通过将要分组的字符放在一组括号“()”中来创建它们。 每组括号对应一个组 。 反向引…

SpringMVC原理MVC设计思想

什么是MVC? MVC是一种架构模式 --- 程序分层,分工合作,既相互独立,又协同工作 MVC是一种思考方式 --- 需要将什么信息展示给用户? 如何布局? 调用哪些业务逻辑? MVC流程图如下图所示: MVC核心思…

Hbase 的javaAPI基本操作用 在idea上的实现

1.保证集群开启&#xff1a; jps有如下进程 2.pom文件中的依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sche…

用php求矩形周长,PHP实现的简单三角形、矩形周长面积计算器分享

运用php面向对象的知识设计一个图形计算器&#xff0c;同时也运用到了抽象类知识&#xff0c;这个计算器可以计算三角形的周长和面积以及矩形的周长和面积。本图形计算器有4个页面&#xff1a;1.php图形计算器主页index.php; 2.形状的抽象类shape.class.php; 3三角形计算…

ECMAScript Decorators---装饰器

ECMAScript Decorators---装饰器 Decorators是什么 Decorators可以改变类方法和类实例字段的属性和行为&#xff0c;使我们可以灵活地使用更简单的语法动态实现这些内容&#xff0c;是非侵入式的。---举例&#xff0c;你给手机添加一个外壳罢了&#xff0c;并不影响手机原有的…

php试卷A高质量含答案,php试卷A高质量含答案

《php试卷A高质量含答案》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《php试卷A高质量含答案(4页珍藏版)》请在金锄头文库上搜索。1、装订线得 分评卷人合肥滨湖职业技术学院17-18学年度第二学期PHP期末考试卷(A)班级&#xff1a; 学号&#xff1a; 姓名&#xff1…

旅行报告:JavaOne 2013 –重归荣耀

我已经回来几天了&#xff0c;需要赶上过去几天一直搁置的所有事情。 对我来说&#xff0c;这是一年中最忙的时间。 JavaOne和OpenWorld在旧金山的整整一周。 一个非常简短的旅行报告。 年度ACED简报 你们中许多人都知道我是Oracle社区认可计划&#xff08;称为“ ACE计划 ”&…

ElasticSearch 数据分片

一、ElasticSearch 分片 ElasticSearch集群中有许多个节点(Node)&#xff0c;每一个节点实例就是一个实例&#xff1b;数据分布在分片之间。集群的容量和性能主要取决于分片如何在节点上如何分配。将数据分片是为了提高可处理的容量和易于进行水平扩展&#xff0c;为分片做副本…

Unity3D_(游戏)2D坦克大战 像素版

2D坦克大战 像素版 游戏规则&#xff1a;  玩家通过上、下、左、右移动坦克&#xff0c;空格键发射子弹 敌人AI出身时朝向己方大本营(未防止游戏快速结束&#xff0c;心脏上方三个单位障碍物设为刚体)    当玩家被击杀次数>3  或  心脏被子弹击穿  重新加载游戏…

认识Skeleton Screen【屏幕加载骨架】

一直以来&#xff0c;无论是web还是iOS、android的应用中&#xff0c;为了提升应用的加载等待这段时间的用户感知体验&#xff0c;各种奇门遁甲之术层出不穷。其中&#xff0c;菊花图以及由它衍生各种加载动画是一个非常大的流派&#xff0c;如下图所示&#xff1a;由它衍生而出…

一日三项令人兴奋的Lucene功能

昨天是富有成效的一天&#xff1a;突然&#xff0c;Lucene有了三个令人兴奋的新功能。 表达式模块 昨天提交的第一个功能是新的expressions模块 。 这使您可以使用任意String表达式定义用于排序的动态字段。 内置了对JavaScript解析的支持&#xff0c;但是如果您想创建自己的语…

php date当天,php5中date()获得的时间不是当前时间的解决方法

自php5.10起加入了时区的设置&#xff0c;在php中显示的时间都是格林威治标准时间&#xff0c;因此便与中国的用户会差八个小时。修改php.ini中的 date.timezone 参数&#xff1a;复制代码 代码如下:[Date]; Defines the default timezone used by the date functions;date.tim…

listening for variable changes in javascript

https://stackoverflow.com/questions/1759987/listening-for-variable-changes-in-javascript转载于:https://www.cnblogs.com/wangjixianyun/p/9115336.html

JPA EntityListeners中的Spring注入的Bean

在使用JPA侦听器进行数据库加密中&#xff0c;我讨论了使用JPA EntityListener进行透明加密。 从某种意义上说&#xff0c;这种方法是透明的&#xff0c;因为JPA实体&#xff08;几乎&#xff09;完全不知道正在加密&#xff0c;而JPA EntityListener本身也不知道细节。 有一个…

php sql 去除重复数据,MSSQL_快速删除重复记录,SQL Server如何实现?,如果一张表的数据达到上百万 - phpStudy...

如果一张表的数据达到上百万条&#xff0c;用游标的方法来删除简直是个噩梦&#xff0c;因为它会执行相当长的一段时间……开发人员的噩梦——删除重复记录想必每一位开发人员都有过类似的经历&#xff0c;在对数据库进行查询或统计的时候不时地会碰到由于表中存在重复的记录而…

Python运行的方式

Python的运行方式多种多样&#xff0c;下面列举几种: 交互式 在命令行中输入python&#xff0c;然后在>>>提示符后面输入Python语句&#xff0c;这里需要注意: 1 语句前面不能有空格&#xff0c;否则会报错 2 对于符合语句&#xff0c;前面会有...提示符&#xff0c;结…