Automating app distribution with DeployGate using the GitHub Actions
by
Ryosuke Horie
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
GitHub Actionsを用いたDeployGate アプリ配布の自動化 2019/10/01 potatotips #65 株式会社ZOZOテクノロジーズ 開発部 堀江 亮介 Copyright © ZOZO Technologies, Inc.
Slide 2
Slide 2 text
© ZOZO Technologies, Inc. 今日話す内容 2 ● 自己紹介 ● ZOZOTOWN Androidチームでの課題 ● GitHub Actions概要 ● DeployGateでのアプリ配布を行う設定の解説と躓いたポイントの紹介
Slide 3
Slide 3 text
© ZOZO Technologies, Inc. 自己紹介 3 ZOZOテクノロジーズ 開発部 Androidエンジニア Tech Lead 堀江 亮介 Ryosuke Horie ・自動化とビールが好き ・Androidテスト全書という本を書きました ・ @Horie1024
Slide 4
Slide 4 text
© ZOZO Technologies, Inc. https://zozo.jp/ ・ 日本最大級のファッションショッピングサイト / アプリ ・ 1,200以上のショップ、7,000以上のブランドの取り扱い (2019年3月末時点) ・ 常時73万点以上の商品アイテム数と毎日平均3,200点以上の新着 商 品を掲載 ・ 即日配送サービス ・ ギフトラッピングサービス ・ ツケ払い など 4
Slide 5
Slide 5 text
© ZOZO Technologies, Inc. https://wear.jp/ ・ 日本最大級のファッションコーディネートアプリ ・ 1,300万ダウンロード突破、コーディネート投稿総数は800万件 以上(ともに2019年3月末時点) ・ 全世界(App Store / Google Playが利用可能な全ての国)で ダウンロードが可能 ・ 10万人以上のフォロワーを持つユーザー(WEARISTA)も誕生 5
Slide 6
Slide 6 text
© ZOZO Technologies, Inc. ZOZOTOWN Androidチームでの課題 6 ● デザイン確認用アプリの共有が面倒 ○ タスク毎に必要になったら手動でビルドしGoogleドライブで共有
Slide 7
Slide 7 text
© ZOZO Technologies, Inc. ZOZOTOWN Androidチームでの課題 7 ● デザイン確認用アプリの共有が面倒 ○ タスク毎に必要になったら手動でビルドしGoogleドライブで共有 ● もっと簡単に共有したい
Slide 8
Slide 8 text
© ZOZO Technologies, Inc. ZOZOTOWN Androidチームでの課題 8 ● デザイン確認用アプリの共有が面倒 ○ タスク毎に必要になったら手動でビルドしGoogleドライブで共有 ● もっと簡単に共有したい ● どうにかして解決できないか? ○ Pull Requestを出すとデザイン確認用アプリが自動配布される仕組みを作る
Slide 9
Slide 9 text
© ZOZO Technologies, Inc. どう作るか? 9 ● Pull Requestを作成したタイミングでビルドを実行
Slide 10
Slide 10 text
© ZOZO Technologies, Inc. どう作るか? 10 ● Pull Requestを作成したタイミングでビルドを実行 ● ブランチごとにDeployGateの配布ページでアプリを配布 ○ 配布ページは無制限に作成できdistribution_nameパラメータで配布ページを自動生成可能 ○ Pull Requestのcompareで指定するブランチ名で配布ページを作成 ○ 参考: gitのブランチごとに別のバージョンのアプリをDeployGateで並行して配信する
Slide 11
Slide 11 text
© ZOZO Technologies, Inc. CIサービスの選択 11 ● ZOZOTOWN、WEARチームではBitriseを使用
Slide 12
Slide 12 text
© ZOZO Technologies, Inc. CIサービスの選択 12 ● ZOZOTOWN、WEARチームではBitriseを使用 ● BitriseのPull Requestトリガーで実行するWorkflowのstepを増やしたくない ○ ビルド時間が伸びるのを防ぎたい
Slide 13
Slide 13 text
© ZOZO Technologies, Inc. CIサービスの選択 13 ● ZOZOTOWN、WEARチームではBitriseを使用 ● BitriseのPull Requestトリガーで実行するWorkflowのstepを増やしたくない ○ ビルド時間が伸びるのを防ぎたい ● 別チームがZOZOテクノロジーズのOrganizationでGitHub Actionsの検証を開始
Slide 14
Slide 14 text
© ZOZO Technologies, Inc. CIサービスの選択 14 ● ZOZOTOWN、WEARチームではBitriseを使用 ● BitriseのPull Requestトリガーで実行するWorkflowのstepを増やしたくない ○ ビルド時間が伸びるのを防ぎたい ● 別チームがZOZOテクノロジーズのOrganizationでGitHub Actionsの検証を開始 ● ZOZOTOWN AndroidチームでもGitHub Actionsを検証を兼ねて利用してみることに決定
Slide 15
Slide 15 text
© ZOZO Technologies, Inc. GitHub Actions 15
Slide 16
Slide 16 text
© ZOZO Technologies, Inc. GitHub Actions 16 ● GitHubが提供するCIサービス (Public beta) ● Workflowを構築することでタスクの自動化を行う ● Workflowとは? ○ Repository単位でカスタムできる自動化プロセス ○ Repositoryに関する様々なイベントを起点に任意の処理を実行できる
Slide 17
Slide 17 text
© ZOZO Technologies, Inc. Workflowの構成要素 17 ● 次の3つが基本の構成要素 ○ Job ■ Stepから構成されるタスクの定義 ■ 並列・シーケンシャルでの実行が可能 ○ Step ■ Jobが実行するタスクの集合 ■ コマンドまたはActionを実行可能 ○ Action ■ CircleCI Orbのような仕組み ■ 特定の処理・設定をまとめてパッケージ化されたものを利用可能 ■ 自作のカスタムアクションを作成し公開することも可能
Slide 18
Slide 18 text
© ZOZO Technologies, Inc. 実装したWorkflow 18
Slide 19
Slide 19 text
© 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
Slide 20
Slide 20 text
© 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
Slide 21
Slide 21 text
© 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
Slide 22
Slide 22 text
© ZOZO Technologies, Inc. WorkflowのトリガーとなるGitHubイベント名 ● on: イベント名 ● 1つまたは複数のイベントを指定可能 ● Pull Requestのタイミングでトリガーにしたい場合 pull_request を指定 ● 指定できるイベント名は次のドキュメントにまとまっている ○ https://help.github.com/en/articles/events-that-trigger-workflows 22
Slide 23
Slide 23 text
© 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
Slide 24
Slide 24 text
© 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
Slide 25
Slide 25 text
© 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]
Slide 26
Slide 26 text
© 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
Slide 27
Slide 27 text
© 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
Slide 28
Slide 28 text
© 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
Slide 29
Slide 29 text
© 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
Slide 30
Slide 30 text
© 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
Slide 31
Slide 31 text
© 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
Slide 32
Slide 32 text
© 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
Slide 33
Slide 33 text
© ZOZO Technologies, Inc. 設定で躓いたポイント 33
Slide 34
Slide 34 text
© ZOZO Technologies, Inc. Secretsの登録と利用 ● SettingsのSecretsから登録 ● Workflowから利用するには のように参照する 34 ${{secrets.DEPLOYGATE_TOKEN}}
Slide 35
Slide 35 text
© 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
Slide 36
Slide 36 text
© ZOZO Technologies, Inc. まとめ ● GitHub ActionsでPull RequestをトリガーにDeployGateでのアプリ配布を簡単に実現できた ● GitHub Actionsは豊富なGitHubのイベントをトリガーにWorkflowを実行できる ○ GitHubを中心とした開発フローの自動化がとてもやりやすい ● 自作Actionの作成も可能なのでDeployGateでの配布をActionとして公開したい 36
Slide 37
Slide 37 text
© ZOZO Technologies, Inc. サンプルコード ● https://github.com/horie1024/github_actions_android_sample 37
Slide 38
Slide 38 text
No content