今天这篇文章的目的是在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就会通知相应的工人执行软件集成脚本。如下图所示:


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 每日更新前端技术


React Native项目自动化打包发布相关推荐

  1. linux maven 发布项目,Linux下基于Maven的自动化打包发布项目

    基于Maven的自动化打包发布项目 1.配置项目文件 prolist.config svn://10.1.23.215/Hive/HiveUDFIK hive-ik jar 10.130.2.245 ...

  2. React Native进行签名打包成Apk

    为什么80%的码农都做不了架构师?>>>    Android签名文件生成 上面有一个Android官方的签名生成方法的地址,大家可以进行详情查看,不过需要翻墙哦~.我现在给大家讲解 ...

  3. React Native 项目整合 CodePush 完全指南

    作者 | 钱凯 杏仁移动开发工程师,前嵌入式工程师,关注大前端技术新潮流. 本文使用的环境: React@16.3.1 React Native@0.55.4 react-native-code-pu ...

  4. 技术实践丨React Native 项目 Web 端同构

    摘要:尽管 React Native 已经进入开源的第 6 个年头,距离发布 1.0 版本依旧是遥遥无期."Learn once, write anywhere",完全不影响 Re ...

  5. 苹果收购英特尔手机芯片业务;西门子将在华建立 5G 研发中心;React Native 0.60.4 发布 | 极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

  6. iOS自动化打包发布之fastlane 实现 发布AppStore 蒲公英

    iOS自动化打包发布之fastlane 实现 fastlane官方文档 前提插件配置 首先要安装xcode-select 然后安装fastlane sudo gem install fastlane ...

  7. 9月27日科技资讯|余承东吐槽苹果续航;贾扬清担任阿里巴巴开源技术委员会负责人;React Native 0.61.0 发布

    「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 整理 | 胡 ...

  8. 【腾讯Bugly干货分享】React Native项目实战总结

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e16a7640ad7b4682c64a7 "8小时内拼工作,8小 ...

  9. React native 项目进阶(redux, redux saga, redux logger)

    之前利用知乎日报的api写了react-native的一个入门项目,传送文章地址React Native 项目入门和源码地址RN入门项目源码,目前github上的代码已经在原文的基础上增加了新的功能, ...

最新文章

  1. 字符串的模式匹配,KMP算法
  2. Mysql和Oracle获取自增主键
  3. 使用生成器创建新的迭代模式
  4. 牛客网 【每日一题】6月8日 [SCOI2005]最大子矩阵
  5. python 跳过计算错误_在python中计算分数时如何跳过被0除的错误?
  6. eclipse常用窗口和功能总结
  7. python输入的方式有几种_Python输入方式具体的三种实现方式
  8. Windows 64位下装Oracle 11g,PLSQL Developer的配置问题,数据库处显示为空白的解决方案...
  9. 终极破产的原因——20年玩儿钱与玩观念的的新经济
  10. Kubernetes部署软件应用的步骤思路
  11. 技术人员要拿百万年薪的修仙之路
  12. JS加入收藏夹操作代码
  13. 使用typescript开发集成阿里云短信接口
  14. 多源信息融合技术研究综述
  15. php手机页面中文输出乱码,如何解决php输出中文乱码的问题?
  16. 一位10年Java工作经验的架构师聊Java和工作经验
  17. hibernate无法自动建表:ERROR: HHH000388
  18. 计算机专业的在职研究生怎么样,计算机专业在职研究生难度大吗?
  19. 赢了世界冠军不意外,和AI在DOTA中并肩作战才让人又纠结又兴奋
  20. 春风吹又生(1年工作经验感悟)

热门文章

  1. Java面向对象(13)--==操作符与equals方法
  2. 计算机二级web题目(6)--动态网页技术概述
  3. 信号与系统 chapter2 冲激偶函数与阶跃函数
  4. python做些什么项目_Python 的练手项目有哪些值得推荐
  5. windows常用服务命令
  6. Pycharm Anaconda 安装dlib
  7. JavaScipt30(第八个案例)(主要知识点:canvas)
  8. 201771010112罗松《面向对象程序设计(java)》第三周学习总结
  9. 软件测试实验1:为三角形问题编写一个Java程序,并用Junit测试程序
  10. ajax长链接--拉实现