Automating app distribution with DeployGate using the GitHub Actions

Automating app distribution with DeployGate using the GitHub Actions

Dbab5e5a1fd54531e1119ede6b3b9e65?s=128

Ryosuke Horie

October 01, 2019
Tweet

Transcript

  1. 2.

    © ZOZO Technologies, Inc. 今日話す内容
 2 • 自己紹介
 • ZOZOTOWN

    Androidチームでの課題
 • GitHub Actions概要
 • DeployGateでのアプリ配布を行う設定の解説と躓いたポイントの紹介

  2. 3.

    © ZOZO Technologies, Inc. 自己紹介
 3 ZOZOテクノロジーズ 開発部 Androidエンジニア Tech

    Lead 堀江 亮介 Ryosuke Horie ・自動化とビールが好き ・Androidテスト全書という本を書きました ・ @Horie1024
  3. 4.

    © ZOZO Technologies, Inc. https://zozo.jp/
 ・ 日本最大級のファッションショッピングサイト / アプリ
 ・

    1,200以上のショップ、7,000以上のブランドの取り扱い
   (2019年3月末時点)
 ・ 常時73万点以上の商品アイテム数と毎日平均3,200点以上の新着  商 品を掲載
 ・ 即日配送サービス
 ・ ギフトラッピングサービス
 ・ ツケ払い など
 4
  4. 5.

    © ZOZO Technologies, Inc. https://wear.jp/
 ・ 日本最大級のファッションコーディネートアプリ
 ・ 1,300万ダウンロード突破、コーディネート投稿総数は800万件 


    以上(ともに2019年3月末時点)
 ・ 全世界(App Store / Google Playが利用可能な全ての国)で
 ダウンロードが可能
 ・ 10万人以上のフォロワーを持つユーザー(WEARISTA)も誕生
 5
  5. 6.

    © ZOZO Technologies, Inc. ZOZOTOWN Androidチームでの課題
 6 • デザイン確認用アプリの共有が面倒
 ◦

    タスク毎に必要になったら手動でビルドしGoogleドライブで共有

  6. 7.

    © ZOZO Technologies, Inc. ZOZOTOWN Androidチームでの課題
 7 • デザイン確認用アプリの共有が面倒
 ◦

    タスク毎に必要になったら手動でビルドしGoogleドライブで共有
 • もっと簡単に共有したい

  7. 8.

    © ZOZO Technologies, Inc. ZOZOTOWN Androidチームでの課題
 8 • デザイン確認用アプリの共有が面倒
 ◦

    タスク毎に必要になったら手動でビルドしGoogleドライブで共有
 • もっと簡単に共有したい
 • どうにかして解決できないか?
 ◦ Pull Requestを出すとデザイン確認用アプリが自動配布される仕組みを作る
 

  8. 10.

    © ZOZO Technologies, Inc. どう作るか?
 10 • Pull Requestを作成したタイミングでビルドを実行
 •

    ブランチごとにDeployGateの配布ページでアプリを配布
 ◦ 配布ページは無制限に作成できdistribution_nameパラメータで配布ページを自動生成可能
 ◦ Pull Requestのcompareで指定するブランチ名で配布ページを作成
 ◦ 参考: gitのブランチごとに別のバージョンのアプリをDeployGateで並行して配信する

  9. 12.

    © ZOZO Technologies, Inc. CIサービスの選択
 12 • ZOZOTOWN、WEARチームではBitriseを使用
 • BitriseのPull

    Requestトリガーで実行するWorkflowのstepを増やしたくない
 ◦ ビルド時間が伸びるのを防ぎたい

  10. 13.

    © ZOZO Technologies, Inc. CIサービスの選択
 13 • ZOZOTOWN、WEARチームではBitriseを使用
 • BitriseのPull

    Requestトリガーで実行するWorkflowのstepを増やしたくない
 ◦ ビルド時間が伸びるのを防ぎたい
 • 別チームがZOZOテクノロジーズのOrganizationでGitHub Actionsの検証を開始

  11. 14.

    © ZOZO Technologies, Inc. CIサービスの選択
 14 • ZOZOTOWN、WEARチームではBitriseを使用
 • BitriseのPull

    Requestトリガーで実行するWorkflowのstepを増やしたくない
 ◦ ビルド時間が伸びるのを防ぎたい
 • 別チームがZOZOテクノロジーズのOrganizationでGitHub Actionsの検証を開始
 • ZOZOTOWN AndroidチームでもGitHub Actionsを検証を兼ねて利用してみることに決定

  12. 16.

    © ZOZO Technologies, Inc. GitHub Actions
 16 • GitHubが提供するCIサービス (Public

    beta)
 • Workflowを構築することでタスクの自動化を行う
 • Workflowとは?
 ◦ Repository単位でカスタムできる自動化プロセス
 ◦ Repositoryに関する様々なイベントを起点に任意の処理を実行できる
 
 

  13. 17.

    © ZOZO Technologies, Inc. Workflowの構成要素
 17 • 次の3つが基本の構成要素
 ◦ Job


    ▪ Stepから構成されるタスクの定義
 ▪ 並列・シーケンシャルでの実行が可能
 ◦ Step
 ▪ Jobが実行するタスクの集合
 ▪ コマンドまたはActionを実行可能
 ◦ Action
 ▪ CircleCI Orbのような仕組み
 ▪ 特定の処理・設定をまとめてパッケージ化されたものを利用可能
 ▪ 自作のカスタムアクションを作成し公開することも可能

  14. 19.

    © ZOZO Technologies, Inc. 19 name: Android CI on Pull

    Request on: pull_request jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Gradle run: ./gradlew assemblDebug - name: Distribute App run: | curl \ -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=git-hash:`git rev-parse --short $GITHUB_SHA`" \ -F "distribution_name=$GITHUB_HEAD_REF" \ https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps
  15. 20.

    © ZOZO Technologies, Inc. 20 name: Android CI on Pull

    Request #Workflow名 on: pull_request jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Gradle run: ./gradlew assemblDebug - name: Distribute App run: | curl \ -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=git-hash:`git rev-parse --short $GITHUB_SHA`" \ -F "distribution_name=$GITHUB_HEAD_REF" \ https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps
  16. 21.

    © ZOZO Technologies, Inc. 21 name: Android CI on Pull

    Request on: pull_request #Pull RequestのタイミングでWorkflowをトリガー jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Gradle run: ./gradlew assemblDebug - name: Distribute App run: | curl \ -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=git-hash:`git rev-parse --short $GITHUB_SHA`" \ -F "distribution_name=$GITHUB_HEAD_REF" \ https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps
  17. 22.

    © ZOZO Technologies, Inc. WorkflowのトリガーとなるGitHubイベント名 
 • on: イベント名
 •

    1つまたは複数のイベントを指定可能
 • Pull Requestのタイミングでトリガーにしたい場合 pull_request を指定
 • 指定できるイベント名は次のドキュメントにまとまっている
 ◦ https://help.github.com/en/articles/events-that-trigger-workflows
 22
  18. 23.

    © ZOZO Technologies, Inc. 23 name: Android CI on Pull

    Request on: pull_request jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Gradle run: ./gradlew assemblDebug - name: Distribute App run: | curl \ -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=git-hash:`git rev-parse --short $GITHUB_SHA`" \ -F "distribution_name=$GITHUB_HEAD_REF" \ https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps
  19. 24.

    © ZOZO Technologies, Inc. 24 name: Android CI on Pull

    Request on: pull_request jobs: #Jobの定義 build: #Job id runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Gradle run: ./gradlew assemblDebug - name: Distribute App run: | curl \ -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=git-hash:`git rev-parse --short $GITHUB_SHA`" \ -F "distribution_name=$GITHUB_HEAD_REF" \ https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps
  20. 25.

    © ZOZO Technologies, Inc. Jobの定義とJob id
 • Jobs 以下に複数のJobを定義可能
 ◦

    デフォルトではJobは平行に実行される
 • 各jobごとに違う名前(Job id)を使用
 
 
 
 • needsキーワードを使用するとJobの依存関係を定義可能
 25 jobs: build: #Job id build2: #Job id build3: #Job id jobs: build: build2: needs: build build3: needs: [build, build2]
  21. 26.

    © ZOZO Technologies, Inc. 26 name: Android CI on Pull

    Request on: pull_request jobs: build: runs-on: ubuntu-latest #Jobを実行する仮想マシンの種類 steps: - uses: actions/checkout@v1 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Gradle run: ./gradlew assemblDebug - name: Distribute App run: | curl \ -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=git-hash:`git rev-parse --short $GITHUB_SHA`" \ -F "distribution_name=$GITHUB_HEAD_REF" \ https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps
  22. 27.

    © ZOZO Technologies, Inc. 27 name: Android CI on Pull

    Request on: pull_request jobs: build: runs-on: ubuntu-latest steps: #Stepの定義 書かれた順に実行 - uses: actions/checkout@v1 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Gradle run: ./gradlew assemblDebug - name: Distribute App run: | curl \ -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=git-hash:`git rev-parse --short $GITHUB_SHA`" \ -F "distribution_name=$GITHUB_HEAD_REF" \ https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps
  23. 28.

    © ZOZO Technologies, Inc. name: Android CI on Pull Request

    on: pull_request jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 #usesでactions/checkoutを使用しソースコードをCheckout - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Gradle run: ./gradlew assemblDebug - name: Distribute App run: | curl \ -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=git-hash:`git rev-parse --short $GITHUB_SHA`" \ -F "distribution_name=$GITHUB_HEAD_REF" \ https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps 28
  24. 29.

    © ZOZO Technologies, Inc. usesキーワード
 • StepはコマンドまたはActionを実行可能
 • usesキーワードにより公開されているActionをStepの中で使用
 •

    actions/checkoutはGitHubが公開しているAction
 ◦ https://github.com/actions/checkout
 • ActionはMarketplaceで探せる他、3rdパーティ製ActionをまとめたRepositoryがある
 ◦ https://github.com/marketplace?type=actions
 ◦ https://github.com/sdras/awesome-actions
 
 29
  25. 30.

    © ZOZO Technologies, Inc. name: Android CI on Pull Request

    on: pull_request jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: set up JDK 1.8 uses: actions/setup-java@v1 #usesでactions/setup-javaを使用しJDKをSetup with: #withでActionへパラメータを渡す java-version: 1.8 - name: Build with Gradle run: ./gradlew assemblDebug - name: Distribute App run: | curl \ -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=git-hash:`git rev-parse --short $GITHUB_SHA`" \ -F "distribution_name=$GITHUB_HEAD_REF" \ https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps 30
  26. 31.

    © ZOZO Technologies, Inc. name: Android CI on Pull Request

    on: pull_request jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Gradle run: ./gradlew assemblDebug #buildType debugでAPKをビルド - name: Distribute App run: | curl \ -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=git-hash:`git rev-parse --short $GITHUB_SHA`" \ -F "distribution_name=$GITHUB_HEAD_REF" \ https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps 31
  27. 32.

    © ZOZO Technologies, Inc. name: Android CI on Pull Request

    on: pull_request jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Gradle run: ./gradlew assemblDebug - name: Distribute App run: | #cURLコマンドでDeployGateへAPKをアップロード curl \ -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=git-hash:`git rev-parse --short $GITHUB_SHA`" \ -F "distribution_name=$GITHUB_HEAD_REF" \ https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps 32
  28. 35.

    © ZOZO Technologies, Inc. ブランチ名の取得
 • 環境変数に関するドキュメントを確認
 ◦ https://help.github.com/en/articles/virtual-environments-for-github-actions
 •

    環境変数GITHUB_REFでWorkflowのトリガーとなったブランチのrefを取得可能とある
 ◦ 実際に試すと refs/pull/<Pull Request番号>/merge と返ってくる
 ◦ 同様にGITHUB_SHAはWorkflowをトリガーとなったコミットを指していない
 • 暫定で環境変数GITHUB_HEAD_REFからブランチ名を取得
 ◦ ドキュメントではForkしたRepositoryのみに設定とあるが通常のRepositoryでも取得できてしまっている
 35
  29. 36.

    © ZOZO Technologies, Inc. まとめ
 • GitHub ActionsでPull RequestをトリガーにDeployGateでのアプリ配布を簡単に実現できた
 •

    GitHub Actionsは豊富なGitHubのイベントをトリガーにWorkflowを実行できる
 ◦ GitHubを中心とした開発フローの自動化がとてもやりやすい
 • 自作Actionの作成も可能なのでDeployGateでの配布をActionとして公開したい
 36
  30. 38.