用 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/[email protected]
        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 方法如下图所示:

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

你可能感兴趣的:(用 Github Actions 为 React Native 打包上传 APK 至蒲公英和自动发 CodePush 更新)