今天這篇文章的目的是在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。 更詳細的能夠查看官方文檔vue
2.GitLab-Runner是配合GitLab-CI進行使用的。通常地,GitLab裏面的每個工程都會定義一個屬於這個工程的軟件集成腳本,用來自動化地完成一些軟件集成工做。當這個工程的倉庫代碼發生變更時,好比有人push了代碼,GitLab就會將這個變更通知GitLab-CI。這時GitLab-CI會找出與這個工程相關聯的Runner,並通知這些Runner把代碼更新到本地並執行預約義好的執行腳本。node
因此,GitLab-Runner就是一個用來執行軟件集成腳本的東西。你能夠想象一下:Runner就像一個個的工人,而GitLab-CI就是這些工人的一個管理中心,全部工人都要在GitLab-CI裏面登記註冊,而且代表本身是爲哪一個工程服務的。當相應的工程發生變化時,GitLab-CI就會通知相應的工人執行軟件集成腳本。以下圖所示:react
3.Pipelines是定義於.gitlab-ci.yml中的不一樣階段的不一樣任務。 我把Pipelines理解爲流水線,流水線包含有多個階段(stages),每一個階段包含有一個或多個工序(jobs),好比先購料、組裝、測試、包裝再上線銷售,每一次push或者MR都要通過流水線以後才能夠合格出廠。而.gitlab-ci.yml正是定義了這條流水線有哪些階段,每一個階段要作什麼事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.shwebpack
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代碼ios
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可參照。git
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)web
#!/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
複製代碼
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()
複製代碼
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的同窗應該很容易理解腳本的含義,在實際項目中寫完腳本並不算真正的結束,咱們要利用腳本實現自動化,解放雙手docker
說到腳本的部署其實gitlab已經幫咱們作好了,當咱們在項目中建立gitlab-ci.yml時,部署工做就算完成,剩下的就是編寫具體的job,而咱們編寫好的job具體實現就得靠文章一開始所提到的Runner。
當咱們push項目,或者建立merge request的時候會觸發對應的CI pipeline,從而開始讓runner執行咱們提早編寫好的job。
對於一個前端項目來講,自動化的構建是頗有必要的,同時咱們也能夠經過gitlab實現更多的功能好比eslint/Flow代碼檢測,單元測試等等。利用腳本實現一些機械工做,提升工做效率。
另外這種思路一樣適用於其餘項目vue、react等前端項目,Android、ios等移動端項目。區別只是在於如何利用各自的資源。
文章可能有不少不足的地方,但願你們指正,同時也但願你們能夠多多交流,分享出更多的技術方案,謝謝~~
技術交流羣:581621024 關注小編 公衆號:LearningTech 每日更新前端技術