React Native項目自動化打包發布,reactnative

今天這篇文章的目的是在rn項目的構建,并不會涉及到rn框架或者使用的講解,說起構建,特別是前端構建大家應該很快會想到webpack、Grunt、 Gulp等。愛掏網 - it200.com而這些工具在rn項目中就顯得有些雞肋。愛掏網 - it200.com所以在此給大家分享一下不使用構建工具實現rn項目自動化打包發布的思路。愛掏網 - it200.com

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

1.GitLab CI是 GitLab 提供的持續集成服務,只要在你的倉庫根目錄 創建一個.gitlab-ci.yml 文件, 并為該項目指派一個Runner,當有合并請求或者 push的時候就會觸發build。愛掏網 - it200.com 這個.gitlab-ci.yml 文件定義GitLab runner要做哪些操作。愛掏網 - it200.com 默認有3個[stages(階段)]: build、test、deploy。愛掏網 - it200.com 更詳細的可以查看官方文檔

2.GitLab-Runner是配合GitLab-CI進行使用的。愛掏網 - it200.com一般地,GitLab里面的每一個工程都會定義一個屬于這個工程的軟件集成腳本,用來自動化地完成一些軟件集成工作。愛掏網 - it200.com當這個工程的倉庫代碼發生變動時,比如有人push了代碼,GitLab就會將這個變動通知GitLab-CI。愛掏網 - it200.com這時GitLab-CI會找出與這個工程相關聯的Runner,并通知這些Runner把代碼更新到本地并執行預定義好的執行腳本。愛掏網 - it200.com

所以,GitLab-Runner就是一個用來執行軟件集成腳本的東西。愛掏網 - it200.com你可以想象一下:Runner就像一個個的工人,而GitLab-CI就是這些工人的一個管理中心,所有工人都要在GitLab-CI里面登記注冊,并且表明自己是為哪個工程服務的。愛掏網 - it200.com當相應的工程發生變化時,GitLab-CI就會通知相應的工人執行軟件集成腳本。愛掏網 - it200.com如下圖所示:

1171685-20240629165716758-915731937-2.png

3.Pipelines是定義于.gitlab-ci.yml中的不同階段的不同任務。愛掏網 - it200.com 我把Pipelines理解為流水線,流水線包含有多個階段(stages),每個階段包含有一個或多個工序(jobs),比如先購料、組裝、測試、包裝再上線銷售,每一次push或者MR都要經過流水線之后才可以合格出廠。愛掏網 - it200.com而.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進行打包,通過最后一段代碼上傳至蒲公英 這樣一個自動打包上傳腳本編寫完成。愛掏網 - it200.comios可參照。愛掏網 - it200.com

接下來我們來看看如何利用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)

  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)
      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。愛掏網 - it200.com

當我們push項目,或者創建merge request的時候會觸發對應的CI pipeline,從而開始讓runner執行我們提前編寫好的job。愛掏網 - it200.com

對于一個前端項目來說,自動化的構建是很有必要的,同時我們也可以通過gitlab實現更多的功能比如eslint/Flow代碼檢測,單元測試等等。愛掏網 - it200.com利用腳本實現一些機械工作,提高工作效率。愛掏網 - it200.com

另外這種思路同樣適用于其他項目vue、react等前端項目,Android、ios等移動端項目。愛掏網 - it200.com區別只是在于如何利用各自的資源。愛掏網 - it200.com

文章可能有很多不足的地方,希望大家指正,同時也希望大家可以多多交流,分享出更多的技術方案,謝謝~~

技術交流群:581621024 關注小編

聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
發表評論
更多 網友評論0 條評論)
暫無評論

返回頂部

主站蜘蛛池模板: 草莓污污视频在线观看| 欧美成人一区二区三区在线电影 | 纯爱无遮挡h肉动漫在线播放| 亚洲一级片在线观看| 波多野结衣bd| hqsexmovie| 伊人久久大香线蕉影院95| 成全高清视频免费观看| 草莓污视频在线观看午夜社区| 久久精品国产精品国产精品污| 国产欧美一区二区精品久久久| 欧美性69式xxxx护士| 2021国产麻豆剧果冻传媒影视 | 奇米影视777me| 男女性色大片免费网站| 99国内精品久久久久久久| 亚洲综合精品伊人久久| 国内女人喷潮完整视频| 欧美黄色大片免费观看| 一二三四视频中文字幕在线看| 亚洲国产精品无码久久久蜜芽| 国产粉嫩白浆在线观看| 日韩内射美女片在线观看网站| 试看120秒做受小视频免费| 中文字幕一精品亚洲无线一区| 另类ts人妖专区| 在线观看国产亚洲| 欧美大香线蕉线伊人图片| 国产精品色拉拉免费看| 久久91精品国产91久久户| 内射干少妇亚洲69xxx| 国产色视频一区| 日韩av无码精品一二三区| 精品无码国产污污污免费| 亚洲人成电影青青在线播放| 国产小视频免费在线观看| 恋恋视频2mm极品写真| 亚洲精品老司机| 久久机热re这里只有精品15 | 自慰被室友看见强行嗯啊男男| 一个人看的www片免费中文 |