$30 off During Our Annual Pro Sale. View Details »

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. GitHub Actionsを用いたDeployGate
    アプリ配布の自動化

    2019/10/01 potatotips #65

    株式会社ZOZOテクノロジーズ

    開発部

    堀江 亮介
    Copyright © ZOZO Technologies, Inc.

    View Slide

  2. © ZOZO Technologies, Inc.
    今日話す内容

    2
    ● 自己紹介

    ● ZOZOTOWN Androidチームでの課題

    ● GitHub Actions概要

    ● DeployGateでのアプリ配布を行う設定の解説と躓いたポイントの紹介


    View Slide

  3. © ZOZO Technologies, Inc.
    自己紹介

    3
    ZOZOテクノロジーズ
    開発部 Androidエンジニア Tech Lead
    堀江 亮介 Ryosuke Horie
    ・自動化とビールが好き
    ・Androidテスト全書という本を書きました
    ・ @Horie1024

    View Slide

  4. © ZOZO Technologies, Inc.
    https://zozo.jp/

    ・ 日本最大級のファッションショッピングサイト / アプリ

    ・ 1,200以上のショップ、7,000以上のブランドの取り扱い

      (2019年3月末時点)

    ・ 常時73万点以上の商品アイテム数と毎日平均3,200点以上の新着  商
    品を掲載

    ・ 即日配送サービス

    ・ ギフトラッピングサービス

    ・ ツケ払い など

    4

    View Slide

  5. © ZOZO Technologies, Inc.
    https://wear.jp/

    ・ 日本最大級のファッションコーディネートアプリ

    ・ 1,300万ダウンロード突破、コーディネート投稿総数は800万件 

    以上(ともに2019年3月末時点)

    ・ 全世界(App Store / Google Playが利用可能な全ての国)で

    ダウンロードが可能

    ・ 10万人以上のフォロワーを持つユーザー(WEARISTA)も誕生

    5

    View Slide

  6. © ZOZO Technologies, Inc.
    ZOZOTOWN Androidチームでの課題

    6
    ● デザイン確認用アプリの共有が面倒

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


    View Slide

  7. © ZOZO Technologies, Inc.
    ZOZOTOWN Androidチームでの課題

    7
    ● デザイン確認用アプリの共有が面倒

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

    ● もっと簡単に共有したい


    View Slide

  8. © ZOZO Technologies, Inc.
    ZOZOTOWN Androidチームでの課題

    8
    ● デザイン確認用アプリの共有が面倒

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

    ● もっと簡単に共有したい

    ● どうにかして解決できないか?

    ○ Pull Requestを出すとデザイン確認用アプリが自動配布される仕組みを作る


    View Slide

  9. © ZOZO Technologies, Inc.
    どう作るか?

    9
    ● Pull Requestを作成したタイミングでビルドを実行


    View Slide

  10. © ZOZO Technologies, Inc.
    どう作るか?

    10
    ● Pull Requestを作成したタイミングでビルドを実行

    ● ブランチごとにDeployGateの配布ページでアプリを配布

    ○ 配布ページは無制限に作成できdistribution_nameパラメータで配布ページを自動生成可能

    ○ Pull Requestのcompareで指定するブランチ名で配布ページを作成

    ○ 参考: gitのブランチごとに別のバージョンのアプリをDeployGateで並行して配信する


    View Slide

  11. © ZOZO Technologies, Inc.
    CIサービスの選択

    11
    ● ZOZOTOWN、WEARチームではBitriseを使用


    View Slide

  12. © ZOZO Technologies, Inc.
    CIサービスの選択

    12
    ● ZOZOTOWN、WEARチームではBitriseを使用

    ● BitriseのPull Requestトリガーで実行するWorkflowのstepを増やしたくない

    ○ ビルド時間が伸びるのを防ぎたい


    View Slide

  13. © ZOZO Technologies, Inc.
    CIサービスの選択

    13
    ● ZOZOTOWN、WEARチームではBitriseを使用

    ● BitriseのPull Requestトリガーで実行するWorkflowのstepを増やしたくない

    ○ ビルド時間が伸びるのを防ぎたい

    ● 別チームがZOZOテクノロジーズのOrganizationでGitHub Actionsの検証を開始


    View Slide

  14. © ZOZO Technologies, Inc.
    CIサービスの選択

    14
    ● ZOZOTOWN、WEARチームではBitriseを使用

    ● BitriseのPull Requestトリガーで実行するWorkflowのstepを増やしたくない

    ○ ビルド時間が伸びるのを防ぎたい

    ● 別チームがZOZOテクノロジーズのOrganizationでGitHub Actionsの検証を開始

    ● ZOZOTOWN AndroidチームでもGitHub Actionsを検証を兼ねて利用してみることに決定


    View Slide

  15. © ZOZO Technologies, Inc.
    GitHub Actions

    15

    View Slide

  16. © ZOZO Technologies, Inc.
    GitHub Actions

    16
    ● GitHubが提供するCIサービス (Public beta)

    ● Workflowを構築することでタスクの自動化を行う

    ● Workflowとは?

    ○ Repository単位でカスタムできる自動化プロセス

    ○ Repositoryに関する様々なイベントを起点に任意の処理を実行できる



    View Slide

  17. © ZOZO Technologies, Inc.
    Workflowの構成要素

    17
    ● 次の3つが基本の構成要素

    ○ Job

    ■ Stepから構成されるタスクの定義

    ■ 並列・シーケンシャルでの実行が可能

    ○ Step

    ■ Jobが実行するタスクの集合

    ■ コマンドまたはActionを実行可能

    ○ Action

    ■ CircleCI Orbのような仕組み

    ■ 特定の処理・設定をまとめてパッケージ化されたものを利用可能

    ■ 自作のカスタムアクションを作成し公開することも可能


    View Slide

  18. © ZOZO Technologies, Inc.
    実装したWorkflow

    18

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    ● on: イベント名

    ● 1つまたは複数のイベントを指定可能

    ● Pull Requestのタイミングでトリガーにしたい場合 pull_request を指定

    ● 指定できるイベント名は次のドキュメントにまとまっている

    ○ https://help.github.com/en/articles/events-that-trigger-workflows

    22

    View Slide

  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

    View Slide

  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

    View Slide

  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]

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  33. © ZOZO Technologies, Inc.
    設定で躓いたポイント

    33

    View Slide

  34. © ZOZO Technologies, Inc.
    Secretsの登録と利用

    ● SettingsのSecretsから登録

    ● Workflowから利用するには                のように参照する

    34
    ${{secrets.DEPLOYGATE_TOKEN}}

    View Slide

  35. © ZOZO Technologies, Inc.
    ブランチ名の取得

    ● 環境変数に関するドキュメントを確認

    ○ https://help.github.com/en/articles/virtual-environments-for-github-actions

    ● 環境変数GITHUB_REFでWorkflowのトリガーとなったブランチのrefを取得可能とある

    ○ 実際に試すと refs/pull//merge と返ってくる

    ○ 同様にGITHUB_SHAはWorkflowをトリガーとなったコミットを指していない

    ● 暫定で環境変数GITHUB_HEAD_REFからブランチ名を取得

    ○ ドキュメントではForkしたRepositoryのみに設定とあるが通常のRepositoryでも取得できてしまっている

    35

    View Slide

  36. © ZOZO Technologies, Inc.
    まとめ

    ● GitHub ActionsでPull RequestをトリガーにDeployGateでのアプリ配布を簡単に実現できた

    ● GitHub Actionsは豊富なGitHubのイベントをトリガーにWorkflowを実行できる

    ○ GitHubを中心とした開発フローの自動化がとてもやりやすい

    ● 自作Actionの作成も可能なのでDeployGateでの配布をActionとして公開したい

    36

    View Slide

  37. © ZOZO Technologies, Inc.
    サンプルコード

    ● https://github.com/horie1024/github_actions_android_sample

    37

    View Slide

  38. View Slide