Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Automating app distribution with DeployGate using the GitHub Actions

Automating app distribution with DeployGate using the GitHub Actions

Ryosuke Horie

October 01, 2019
Tweet

More Decks by Ryosuke Horie

Other Decks in Programming

Transcript

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

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

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

    Lead 堀江 亮介 Ryosuke Horie ・自動化とビールが好き ・Androidテスト全書という本を書きました ・ @Horie1024
  3. © ZOZO Technologies, Inc. https://zozo.jp/
 ・ 日本最大級のファッションショッピングサイト / アプリ
 ・

    1,200以上のショップ、7,000以上のブランドの取り扱い
   (2019年3月末時点)
 ・ 常時73万点以上の商品アイテム数と毎日平均3,200点以上の新着  商 品を掲載
 ・ 即日配送サービス
 ・ ギフトラッピングサービス
 ・ ツケ払い など
 4
  4. © ZOZO Technologies, Inc. https://wear.jp/
 ・ 日本最大級のファッションコーディネートアプリ
 ・ 1,300万ダウンロード突破、コーディネート投稿総数は800万件 


    以上(ともに2019年3月末時点)
 ・ 全世界(App Store / Google Playが利用可能な全ての国)で
 ダウンロードが可能
 ・ 10万人以上のフォロワーを持つユーザー(WEARISTA)も誕生
 5
  5. © ZOZO Technologies, Inc. ZOZOTOWN Androidチームでの課題
 6 • デザイン確認用アプリの共有が面倒
 ◦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

  14. © 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. © 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. © 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. © ZOZO Technologies, Inc. WorkflowのトリガーとなるGitHubイベント名 
 • on: イベント名
 •

    1つまたは複数のイベントを指定可能
 • Pull Requestのタイミングでトリガーにしたい場合 pull_request を指定
 • 指定できるイベント名は次のドキュメントにまとまっている
 ◦ https://help.github.com/en/articles/events-that-trigger-workflows
 22
  18. © 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. © 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. © 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. © 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. © 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. © 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. © 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. © 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. © 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. © 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. © 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. © ZOZO Technologies, Inc. まとめ
 • GitHub ActionsでPull RequestをトリガーにDeployGateでのアプリ配布を簡単に実現できた
 •

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