【篇四】通过Jenkins打包ReactNative APP

2017/4/21 14:37 下午 posted in  持续集成  

系统版本:CentOS release 6.7 (Final)。
待打包的APP:原生+ReactNative的混合Android APP。

1. CentOS下安装ReactNative依赖

sudo su

# 安装node环境
curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -

# 安装React Native CLI
npm install -g react-native-cli

2. 打包流程

  1. 若项目根目录下没有node_modules目录,则执行以下命令

     # 根据当前目录下的package.json文件安装所需依赖
     npm install
    
  2. 打js bundle文件

    # 生成inde.android.js、index.android.bundle文件,并复制到相应目录
    react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output app/src/main/assets/index.android.bundle --assets-dest app/src/main/res/
    
  3. 打apk包

    # 与打原生的apk包相同,assembleDebug或assembleRelease
    gradlew assembleRelease
    

3. 集成到Jenkins打包流程

根据上一步的打包流程,编写shell脚本,并将其置于Jenkins中项目Job的“构建”环节第一步。

脚本中在项目所在目录的上一级目录新建了default_node_modules目录,用于存放生成的node_modules副本,以便下一次打包时可以直接复制使用而不用执行npm install,以节省打包时间。同时在打包参数中新增了ReinitNodeModules选项,打包时勾选此选项可以强制本次打包重新初始化node_modules。

# 【ReactNative相关】

# 初始化node_modules

# 默认node_modules目录
default_node_modules_dir="${PWD}/../default_node_modules"

# 若打包时勾选了ReinitNodeModules选项,或默认node_modules目录不存在,
# 则需要通过npm重新初始化node_modules
if [ ${ReinitNodeModules} == true ] || [ ! -d $default_node_modules_dir ]
then
    # 初始化node_modules。这里使用了taobao的镜像
    npm --registry https://registry.npm.taobao.org install
    
    # 若默认node_modules目录存在,则删除之
    if [ -d $default_node_modules_dir ]
    then
        rm -rf $default_node_modules_dir
    fi
    
    # 将当前目录下新初始化的node_modules复制到默认node_modules目录
    cp -rf ./node_modules $default_node_modules_dir
else
    # 若不需要重新初始化node_modules,则检查当前目录下是否存在node_modules目录,
    # 若其不存在,则需要从默认node_modules目录下复制过来
    if [ ! -d './node_modules' ]
    then
        cp -rf $default_node_modules_dir ./node_modules
    fi
fi

# 打js bundle文件
react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output app/src/main/assets/index.android.bundle --assets-dest app/src/main/res/

4. 参考