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