服務器端code-push-server、mysql服務的架設
CodePush 簡介
CodePush 是微軟提供的一套用於熱更新 React Native 和 Cordova 應用的服務。
CodePush 是提供給 React Native 和 Cordova 開發者直接部署移動應用更新給用戶設備的雲服務。CodePush 作為一個中央倉庫,開發者可以推送更新 (JS, HTML, CSS and images),應用可以從客戶端 SDK 裏面查詢更新。CodePush 可以讓應用有更多的可確定性,也可以讓你直接接觸用戶群。在修復一些小問題和添加新特性的時候,不需要經過二進制打包,可以直接推送代碼進行實時更新。
code-push官方github地址:https://github.com/Microsoft/code-push
code-push 應用更新的流程
從上圖大家可以了解到,CodePush的雲服務是Microsoft的,服務器有可能在國外,身在天朝的我們以及用戶更新速度肯定是無比的慢;為了給用戶最佳的用戶體驗,以及讓代碼和服務掌握在自己的手裏,自己搭建code-push-server成為了必須!
code-push-server 簡介
一個相對不錯的code-push-server庫官方github地址
根據官方說明要啟動server大致需要這麽幾步:
$ git clone https://github.com/lisong/code-push-server.git $ cd code-push-server $ npm install $ ./bin/db init --dbhost localhost --dbuser root --dbpassword #初始化mysql數據庫 $ ./bin/www #啟動服務 瀏覽器中打開 http://127.0.0.1:3000
如果你只是測試玩玩這麽幾步下來一個完美的server已經可以跑起來了!但是為了保證我們服務的健壯性我們還是有必要打成docker,打成docker 鏡像之後我們就可以交給運維人員幫我們把負載均衡、監控、日誌的收集最重要的一點就是CDN,OK那麽咱們只需要打成docker 鏡像就可以了,剩下的還是交給運維同學吧!
使用 docker 啟動一個 mysql 數據庫
由於code-push服務需要數據庫,沒有數據庫的同學可以提前搭建一個,我在這裏用docker啟動一個,登陸阿裏雲服務器或者登陸之前創建jenkins的虛擬機,將下面的腳本保存為start-mysql.sh
或者參考我的另一篇文章Contos 7 安裝 Mysql 5.7
#mysql環境變量的說明
#MYSQL_ROOT_PASSWORD:必填項,設置root用戶的密碼
#MYSQL_DATABASE :啟動時創建的數據庫名稱
#MYSQL_USER, MYSQL_PASSWORD 啟動時創建數據的用戶和密碼
#MYSQL_ALLOW_EMPTY_PASSWORD :允許數據庫密碼為空啟動(root)[yes/no]
#MYSQL_ONETIME_PASSWORD : 強制用戶首次登錄修改密碼[yes/no]
#MYSQL_ROOT_PASSWORD_FILE : 作為環境變量傳遞敏感信息的替代方案/run/secrets/mysql-root(目前,這僅支持MYSQL_ROOT_PASSWORD,MYSQL_ROOT_HOST,MYSQL_DATABASE,MYSQL_USER,和MYSQL_PASSWORD)
#數據庫默認存儲在/var/lib/mysql下,-v "$PWD/mysql":/var/lib/mysql #定義容器名稱名稱
DOCKER_NAME=mysql
#定義容器的端口號
DOCKER_PORT=3306
docker run -d --rm -p ${DOCKER_PORT}:3306 --name ${DOCKER_NAME} -e "MYSQL_ROOT_PASSWORD=123456" -e "MYSQL_DATABASE=code-push-db" -v "$PWD/mysql_datadir":/var/lib/mysql mysql:5.7
我們只要執行下這個start-mysql.sh腳本一個數據庫名稱為 code-push-db 數據庫用戶為 root 數據庫密碼為 123456 的mysql服務就起來了
$ sh start-mysql.sh
將 code-push-server 打成 docker 鏡像
開始之前聲明下:這個庫的作者也提供了docker版 說明文檔在這裏,作者寫的挺好,用的docker-compose 和 docker swarm 挺強大挺厲害了,但是不同的業務場景下可能會有不同的需求!我們公司現在有k8s環境,所以需要單獨寫個docker image 給運維同學用!
首先我們創建一個code-push文件夾,用於我們的工作目錄,之後進入該目錄,在終端下運行:
shell $ mkdir code-push $ cd code-push
獲取code-push-server代碼
$ git clone https://github.com/lisong/code-push-server.git
- 創建code-push-server所需要的目錄
shell $ mkdir code-push-files $ mkdir code-push-files/storage $ mkdir code-push-files/tmp #創建兩個文件使目錄不為空就好 $ touch code-push-files/storage/README.md $ touch code-push-files/tmp/README.md
- 安裝依賴文件及初始化數據庫
shell $ cd code-push-server #安裝依賴 $ npm install #初始化mysql數據庫 $ ./bin/db init --dbname codepush --dbhost localhost --dbport 3306 --dbuser root --dbpassword 123456
編輯配置文件
shell $ vim config/config.js
請檢查如下配置是否和你的環境一致,尤其是downloadUrl參數#數據庫的配置 db: { username: process.env.RDS_USERNAME || "root", password: process.env.RDS_PASSWORD || "123456", database: process.env.DATA_BASE || "codepush", host: process.env.RDS_HOST || "127.0.0.1", port: process.env.RDS_PORT || 3306, dialect: "mysql", logging: false, operatorsAliases: false, }, //七牛雲存儲配置 當storageType為qiniu時需要配置 qiniu: { accessKey: "", secretKey: "", bucketName: "", downloadUrl: "" //文件下載域名地址 }, //阿裏雲存儲配置 當storageType為oss時需要配置 oss: { accessKeyId: "", secretAccessKey: "", endpoint: "", bucketName: "", prefix: "", // 對象Key的前綴,允許放到子文件夾裏面 downloadUrl: "", // 文件下載域名地址,需要包含前綴 }, //文件存儲在本地配置 當storageType為local時需要配置 local: { storageDir: "/code-push-files/storage", //文件下載地址 CodePush Server 地址 + ‘/download‘ download對應app.js裏面的地址 //這裏拿百度的網址舉例子 downloadUrl: "http://codepush.baidu.com:3000/download", // public static download spacename. public: ‘/download‘ }, jwt: { // 登錄jwt簽名密鑰,必須更改,否則有安全隱患,可以使用隨機生成的字符串 // Recommended: 63 random alpha-numeric characters // Generate using: https://www.grc.com/passwords.htm tokenSecret: ‘INSERT_RANDOM_TOKEN_KEY‘ }, common: { dataDir: "code-push-files/tmp", //選擇存儲類型,目前支持local,oss,qiniu,s3配置 storageType: "local" },
Dockerfile的編寫
將下面的腳本保存名為Dockerfile文件,註意大小寫,沒有文件後綴名!位置放在code-push文件夾下,也就是同code-push-server同級下FROM node:9.11.1-alpine MAINTAINER shuoer [email protected] RUN rm -rf /app && mkdir -p /app && mkdir /code-push-files COPY code-push-server /app/ WORKDIR /app RUN npm install CMD [ "npm","start" ] EXPOSE 3000
在當前目錄下打開命令行執行以下命令build出docker image
#註意最後還有一個 點 別丟了! $ docker build -t codepush .
喝杯茶,抽根煙,稍等片刻就編譯成功了!編譯完成之後我們可以執行以下命令測試是否可以啟動
$ docker run -d --rm --name codepush -v "$PWD/code-push-files":/code-push-files -p 3000:3000 codepush:latest
打開瀏覽器看到這個頁面表示啟動成功了
說明
如果將以上技術棧描述清楚需要不小的篇幅,所以我會將文章進行拆分:
1. Hybrid App 開發實踐總結 ~開篇
2. cordova的環境配置和創建第一個android App
3. 使用 jenkins 自動化編譯cordova android 生成 APK
4. 服務器端code-push-server、mysql服務的架設(本文)
5. 客戶端code-push插件的引入及code-push-cli的使用
7. 如何使用純shell編寫一個快速搭建開發者環境的命令行工具和安卓端真機調試
服務器端code-push-server、mysql服務的架設