用 Github Actions 为 React Native 打包上传 APK 至蒲公英和自动发 CodePush 更新

一、打 Android APK 后,上传至蒲公英

在GitHub项目根目录下创建 .github/workflows/release.yml 文件,代码如下:

name: CI

on:
  push:
    branches: [ release ]
  pull_request:
    branches: [ release ]

env:
  PGYER_API_KEY: 9b8a407f285532d6759289xxxxxxxxxx
  APK_FILE_PATH: android/app/build/outputs/apk/release
  APK_FILE_NAME: app-release.apk

jobs:
  build-and-upload:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 1

      - name: Get yarn cache
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - name: Cache dependencies
        uses: actions/cache@v1.2.0
        id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
        with:
          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - name: Install yarn dependencies
        run: |
          echo Node.js runtime version: $(node -v)
          yarn config set registry https://registry.npm.taobao.org
          yarn

      - name: Run unit test
        run: yarn test

      - name: Build release apk
        run: |
          cd android
          echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
          bash gradlew assembleRelease

      - name: Upload apk to artifact
        uses: actions/upload-artifact@v1
        with:
          name: ${{env.APK_FILE_NAME}}
          path: ${{env.APK_FILE_PATH}}

      - name: Upload apk to Pgyer
        run: |
          curl -F 'file=@${{env.APK_FILE_PATH}}/${{env.APK_FILE_NAME}}' -F '_api_key=${{env.PGYER_API_KEY}}' https://www.pgyer.com/apiv2/app/upload
  • push: [ release ] 和 pull_request : [ release ] 表示代码 push 和 PR 到 release 分支就触发这个 CI
  • env 表示该脚本的全局环境变量,使用时用 ${{env.PGYER_API_KEY}}
  • jobs 表示下面有几个任务需要执行,我这里只有 build-and-upload 一个任务
  • runs-on 表示运行在什么系统上,目前(截止2020-4-20)支持:ubuntu, windows, macOS 三种系统,更多信息
  • name 表示每个最小任务,但下面又可以 run 一或多个命令,一条命令就直接跟在 run 后面就行,如果是多条命令只需写在 : | 符下
  • fs.inotify.max_user_watches 提高监听的文件数量,该值默认只有 128 个,我在脚本里改为了 524288。因为我们在执行 assembleRelease 时需要监听项目代码和 node_modules 的代码,所以 128 肯定是不够的。
  • yarn config set registry 每次安装项目依赖前,先设置淘宝源。(注:不需要先安装 Node.js 、再安装 npm i -g yarn,而是直接使用 yarn 命令即可,我猜是 GitHub Actions 自动帮我们安装好了
  • bash gradlew assembleRelease 表示在 like Unix 的系统下,用 bash 来执行 shell 文件。如果你是 runs-on: windows-latest,需要改为 gradlew.bat assembleRelease
  • curl -F 这行是将 apk 文件上传至蒲公英(完整命令如:curl -F 'file=@android/app/build/outputs/apk/release/app-release.apk' -F '_api_key=9b8a407f285532d6759289xxxxxxxxxx' https://www.pgyer.com/apiv2/app/upload),这里推荐大家使用 v2 的接口,官方说 v1 不再维护了,https://www.pgyer.com/doc/view/api#uploadApp
  • 蒲公英 API Key 获取地址 https://www.pgyer.com/account/api

二、自动发 Code Push 热更新

在GitHub项目根目录下创建 .github/workflows/hotfix.yml 文件,代码如下:

name: CI

on:
  push:
    branches: [ hotfix ]
  pull_request:
    branches: [ hotfix ]

env:
  CODE_PUSH_SECRET_KEY: 9a5bc0c5507d4a3524b9cc76xxxxxxxxx

jobs:
  push-hotfix-bundle:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Get package.json version
        id: version
        uses: notiz-dev/github-action-json-property@release
        with:
          path: ./package.json
          prop_path: version
      - run: echo ${{steps.version.outputs.prop}}

      - name: Install code push service for react native
        run: sudo npm install -g code-push-cli

      - name: Login code push service center
        run: code-push login --accessKey ${{env.CODE_PUSH_SECRET_KEY}}

      - name: Install yarn dependencies
        run: |
          echo Node.js runtime version: $(node -v)
          yarn config set registry https://registry.npm.taobao.org
          yarn

      - name: Run unit test
        run: yarn test

      - name: Set ubuntu fs max user watch
        run: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

      - name: Push hotfix bundle to every registered apps
        run: |
          code-push whoami
          code-push release-react myApp android --dev false --targetBinaryVersion "${{steps.version.outputs.prop}}" --des "有紧急版本更新,请及时安装" -d Production -m
  • push: [ hotfix ] 和 pull_request : [ hotfix ] 表示代码 push 和 PR 到 hotfix 分支就触发这个 CI
  • notiz-dev/github-action-json-property@release 是一个读取 package.json 的包,用于给指定的版本发 code push。id 表示获取值后存放在该变量下,path 表示指定读取文件,prop_path 表示需取值的 key,使用方法:${{steps.version.outputs.prop}}
  • code-push-cli 安装 code push 需求 sudo 权限来执行
  • code-push login 每次执行 code push 前要先登录
  • code-push release-react 就是发 code push 的命令

三、特别说明

1、在哪儿取到 Code Push accessKey

答:先在本地安装 sudo npm install -g code-push-cli,然后执行 code-push login,就能看到获取到 accessKey 了。

2、为什么把 key 直接写在 yml 文件里?好像不安全呢?

答:我这个项目属于 private,项目之外的人没有权限看到,所以偷个懒(如果你的项目是 public 千万别这么做),安全的做法是:创建 GitHub secret,然后在项目中用 ${{secrets.CODE_PUSH_SECRET_KEY}} 这种形式使用,添加 GitHub secret 方法如下图所示:

如果本文对你有帮助,请点赞、分享!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容