Githubアクションを用いたExpoアプリケーションのシームレス展開(その2 )


継続


このシリーズの第1部では、Githubアクションでエキスポを使用する前にいくつかの前提条件を通過し、最初のアクションを設定する方法を示した.テストを実行してブランチを発行する方法についてもっと知りたい場合は、チェックアウトすることができます!
このセクションでは、アプリケーションの配布のためのEXPOタートルサービスを使用してアプリケーションを構築する方法と、アプリケーションの構築について説明します.

バージョン管理の重要性


なぜ我々はバージョンですか?必要ですか.どのように、これはユーザー経験を改善しますか?プロジェクトが成長するにつれて、依存関係の数が増加し、管理するのが難しくなります.最終的に、他のサービスと契約を破ることなくアップグレードするのは難しいかもしれません.バージョンコントロールは、誰もが同じページにすることができるように、我々はルールの一般的なセットを使用してこれらの依存関係を管理することができます簡単な方法です.これはSemantic Versioningであり、フォーマットMajor.Minor.Patchの指定ルールに従う.主な変更点は、APIの変更を破る、マイナーな変更は、後方互換性のある機能を追加し、パッチのバグ修正を追加します.
バージョン管理の適切な使用は、アプリケーションへの利点のスルーをもたらす可能性があります.アプリケーションのバージョン管理では、コードベースとアプリケーションのバージョンを検証することによって報告されたバグの簡単なデバッグを可能にすることができます.空気のアップデート(OTA)を設定するだけでマイナーとパッチの更新を送信するには、アプリケーションを損なうことから変更を中断を防ぐことができます.これはまた、アプリケーションの異なるメジャーバージョンを既存のアプリケーションストアから最新バージョンを取得していないユーザーのために維持することができます.
私の実装では、私の具体的には、Githubリリースタグを使用して、私のワークフローをトリガーし、また、アプリケーションを配備するためにリリースチャネルが動作することを通知するために、prod-Major.Minor.Patchと一致するようにタグの名前を指定します.
そのコードにはたくさんのことが起こっている.私は最初にコードを提供します.そして、私がした若干の選択の詳細な説明が続きました.
name: Create Release
on:
  push:
    tags:
      - "prod-[1-9]+.[0-9]+.[0-9]+" # Push events to matching prod-*, i.e.prod-20.15.10

jobs:
  deploy_prod:
    name: Deploy To Production
    needs: test
    runs-on: ubuntu-latest
    outputs:
      releaseChannel: ${{ steps.releaseChannel.outputs.releaseChannel }}
      latestBinaryVersion: ${{ steps.latestBinaryVersion.outputs.version }}
    steps:
      - uses: actions/checkout@v2
        with:
          ref: ${{ github.head_ref }}
      - name: Fetch Tags
        run: |
          git fetch --prune --unshallow --tags -f
      - uses: actions/setup-node@v1
        with:
          node-version: 12.x
      - uses: expo/expo-github-action@v5
        with:
          expo-packager: npm
          expo-username: ${{ secrets.EXPO_CLI_USERNAME }}
          expo-password: ${{ secrets.EXPO_CLI_PASSWORD }}
          expo-cache: true
      - uses: rlespinasse/[email protected]
      - name: Generate Release Channel # Release Channels are named prod-<Major Release>, i.e. prod-1, prod-3
        id: releaseChannel
        run: |
          RELEASE_CHANNEL=$(echo ${{ env.GITHUB_REF_SLUG }} | sed -r 's/\.[0-9]+\.[0-9]+$//')
          echo "::set-output name=releaseChannel::$RELEASE_CHANNEL"
      - name: Install Packages
        run: npm install
      - name: Get Latest Binary Version # Binary Version will be x.x.x based on the latest tag
        id: latestBinaryVersion
        run: |
          # Release tag finds the lastest tag in the tree branch - i.e. prod-x.x.x
          RELEASE_TAG=$(echo $(git describe --tags --abbrev=0))
          # Using param substitution, we output x.x.x instead
          echo "::set-output name=version::${RELEASE_TAG#*-}"
      - name: Echo Version Details
        run: |
          echo Build number is $GITHUB_RUN_NUMBER
          echo Latest release is ${{ steps.latestBinaryVersion.outputs.version }}
      - name: Expo Publish Channel
        run: expo publish --non-interactive --release-channel=${{ steps.releaseChannel.outputs.releaseChannel }}
最初のいくつかの行では、このアクションがprod-x.x.xという名前のタグが押された場合にのみ起こることがわかります.これは、GitコマンドラインツールまたはGithub GUI作成リリースページのいずれかで動作を実行する柔軟性を与えます.
次に、ステップFetch TagおよびGet Latest Binary Versionを詳しく見ることができる.通常、我々がちょうどレポから最新のタグをつかむことになっていたならば、最新のリリースタグはつかまれるでしょう、その代わりに、私は我々が参照しているその枝から最新のタグをとるだけで、この失敗証明をすることに決めました.buildNumberも、建設されるアプリケーションのためにapp.jsonに提供されなければなりません.この場合、私はgithub action run numberを使用することを選択しました(Rununsを含まないアクションが実行されているユニークな時間をカウントします.
hereCreate Releaseの場合、buildNumber3です
また、私は、それらのチャンネルにOTA更新をルートしたいので、EXPOのためのリリースチャンネルを最新のTAGから主要なバージョンだけをつかんでいるように、EXPOのためにリリースチャンネルを変えました.これはまた、何も壊れないように別の枝にリリースを作成することにより、アプリケーションの古いバージョンのホットフィックスを行うことができます.

リリース


リリースからリリースへの変更を追跡することができることはゲームチェンジャーです.しかし、リリースへのリリースのためのchangelogを作成する面倒は、重要な変更に欠落するストレスをもたらします.恐れはない、コミュニティは我々が過去のコミットからchangelogを生成するのを助けるために我々が利用することができる多くの若干の行動を書きました.私のケースでは、私は を選択したので、それは簡単ですし、仕事を取得します.これが完了したら、既存のリリースタグを作成または更新するために別のコミュニティアクションmetcalfc/changelog-generatorを使用します.
以下に例を示します.
create_release:
    name: Create Release
    needs: deploy_prod
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: rlespinasse/[email protected]
      - name: Generate Changelog
        id: changelog
        uses: metcalfc/[email protected]
        with:
          myToken: ${{ secrets.GITHUB_TOKEN }}
          base-ref: 'prod-0'
      - name: Creating Release
        uses: ncipollo/release-action@v1
        with:
          body: |
            Changes in this Release: 
            ${{ steps.changelog.outputs.changelog }}
          token: ${{ secrets.GITHUB_TOKEN }}
          name: Release ${{ env.GITHUB_REF_SLUG }}
          allowUpdates: true

リリースアクション 建築・流通


最後の、そして最も重要なステップは、アプリケーションを大衆に配布して、配布するでしょう.アプリケーションのビルド時間は通常、万博ビルドサービスのために に依存して、このプロセスは、通常、かなり長い(20〜30分)です.約1時間のためにちょうどすべてのリリースの前にAndroidとIOSのバイナリの両方を構築するのを待つことを想像し、それは痛みになります.しかし、ありがたいことに、我々はアクションを自動的にすべてのリリースを書くことができますし、リリース自体、またはそれぞれのApp Storeでバイナリをアップロード!一般的に、2つのアプローチがあります.それは、URLを取得する前にサービスを完了するか、またはビルドされたバイナリが生成されたときにサーバにPOSTリクエストを送信するためのフックを使用して完了するのを待つ無料EXPOビルドサービスを使用する場合です.Githubアクションのフックのためのジョブのリスニングをスピンしたくないシンプルさのために、私は元のオプションで行くことにした.
ここでは、ジョブがAndroid APKパッケージのようにどのように見えるかのコード断片があります.IOSは、代わりにprod-Majorを実行しているミラーだけです.
 build_android:
    needs: [deploy_prod, create_release]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: rlespinasse/[email protected]
      - uses: expo/expo-github-action@v5
        with:
          expo-packager: npm
          expo-username: ${{ secrets.EXPO_CLI_USERNAME }}
          expo-password: ${{ secrets.EXPO_CLI_PASSWORD }}
          expo-cache: true
      - name: Install Packages
        run: npm install
      - name: Build Android Release
        env:
          APP_BUILD_VERSION: ${{ github.run_number }}
          APP_BINARY_VERSION: ${{ needs.deploy_prod.outputs.latestBinaryVersion }}
        run: |
          expo build:android --release-channel=${{ needs.deploy_prod.outputs.releaseChannel }} > buildLogAndroid.txt
          cat buildLogAndroid.txt
      - name: Parse Asset URL
        id: androidUrl
        run: |
          ASSET_URL=$(cat buildLogAndroid.txt | tail | egrep -o 'https?://expo\.io/artifacts/[^ ]+')
          echo The android url is $ASSET_URL
          echo "::set-output name=assetUrl::$ASSET_URL"
      - name: Download APK Asset
        run: wget -O example-${{ env.GITHUB_REF_SLUG }}.apk ${{ steps.androidUrl.outputs.assetUrl }}
      - name: Upload Release Asset
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: ./example-${{ env.GITHUB_REF_SLUG }}.apk
          asset_name: example-${{ env.GITHUB_REF_SLUG }}.apk
          tag: ${{ github.ref }}
私が直面した1つの課題は、ビルドが完了したときbuild:iosアセットをつかんでいた.場合によっては、.apkを使用して、最新のビルドだけが更新されないので、間違った結果を生むでしょう、したがって、私は問題を解決するために良い古い信頼できるregexを使うことに固執することに決めました.その後、リリースへの資産のアップロードスムーズなセーリングだった.
リリースの最終的な出力はこのように見えるはずです!我々が必要とするすべての部分を簡潔にしてください.
number of projects queuing

改善


我々ができるいくつかの改善は、タグとして最新バージョンを格納し、自動的にPRの説明のバージョンベースをバンプする のようなコミュニティアクションを使用することですが、それは別の時間の話になります.改良のためのもう一つの地域は、自動的にアップロードをビルトインexpo url:apk.apk BinariesをApp Storeに直接加えることです.あなたがそれをしたいならば、あなたはプロセスGitHub Tag Bumpについてより多くを読むことができます.改善の多くの他の分野があります、そして、私はci/cdワークフローに機能を加えるためにrepoに取り組み続けます.

ヒア 結論


全体的に、それは楽しい旅私はどのように実行するワークフローを望んでどのように実装する必要が計画している.また、他の人から学ぶことができますし、自分自身のためにGithubアクションを使用するようにプロセスを文書化楽しい.私は、私のメンターセバスチャンにも、プロセスで私を案内して、同じ仕事と別のプロジェクトのためにワークフローを概説するために大声を出したいです.
あなたはここでレポ全体をチェックアウトすることができます!それをフォークして、それを再生してください.

/ ジュシュシュー



エキスポギタブアクションスターター


これはdev . to postで説明された例です.詳細はすぐに利用できます.
github-actions-expo-boiler-template