アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

Androidアプリの配布にGitHub Actionsを使ってみた。

adventar.org

これはactindi Advent Calendar 2019、1日目の記事です。
こんにちは!Androidアプリエンジニアのhondaです。
今日でactindi勤続4年になりました。
今回は開発中のアプリをメンバーに配布するためにGitHub Actionsを使ってみたときのことをつらつらと書きたいと思います。

GitHub Actions、使ってよかった。

Android版いこーよでは今までCIでbitriseを使っていました。
もともと、GitHub Actionsを使ってみた理由がビルド時間が短縮できるかを検証するためでした。 ビルド時間を比較したところ2分ほど短縮することができました。
また、bitriseよりGitHub Actionsのほうがビルドが安定しているようなのでとても好印象でした。
Android版いこーよでは今後もGitHub Actionsを使っていこうと思っています。

GitHub Actionsとは?

GitHubアクションは、ワークフローのすべてのステップに統合された強力な実行環境を備えています。任意のジョブを実行するアクションを検出、作成、共有し、それらを組み合わせてワークフローをカスタマイズできます。

公式のヘルプページより抜粋したものを翻訳しました。

つまり、GitHubのリポジトリ上でのアクションをトリガーにワークフローを実行して、ワークフローの中でビルドして配信したり、LintチェックしてPRに結果を載せたり、テストを実行したりすることができるCI環境です。

参考にしたもの

speakerdeck.com

サクッとGitHub ActionsのWorkFlowを定義する一連の流れを理解できます。

help.github.com

公式のヘルプページです。 日本語ドキュメントもありますが、まだ途中だったりするので英語ページでGoogle Translationで翻訳したほうが読みやすいような気がします。

使ってみた

1.GitHubのRepositoryのトップページのActionsタブをクリック。

f:id:kou_hon:20191130121221p:plain

2.New workflowをクリック。

f:id:kou_hon:20191130121248p:plain

3.「Popular continuous integration workflows」の中に「Android CI」というworkflowが用意されているのでそれの「Set up this workflow」をクリック

f:id:kou_hon:20191130121418p:plain

4.workflowが定義されているymlファイルの編集画面が表示されるので、右上の「Start commit」をタップするとmasterにymlファイルがプッシュされます。

f:id:kou_hon:20191130121448p:plain

5.デフォルトだとworkflowが実行される条件が on: [push]となっています。つまり、「Start commit」をタップするとworkflowが実行、ビルドが始まります。

6.最後に今回はデバッグビルドを試したので最後のビルドコマンドは ./gradlew assembleDebug に変更します。

ここまでやって、冒頭のビルド時間の短縮を確認することができました。
ですが、このままではいろいろ足りないのでworkflowを改修していきます。

出来上がったAPKファイルをDeployGateに配信したい。

Android版いこーよではデバッグ版APKファイルをDeployGateにアップロードして関係者に配布しています。GitHub Actionsでも同じように配信したいと思います。
runコマンドでシェルを実行できます。

ドキュメント

help.github.com

WorkFlowに追加

ymlファイルの最後に以下を追加します。

    - name: Distribute App
      run: |
        curl \
         -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \
         -F "file=@app/build/outputs/apk/debug/app-debug.apk" \
         -F "message=https://github.com/${{secrets.GITHUB_USER}}/${{secrets.GITHUB_REPOSITORY}}/commit/`git rev-parse --short $GITHUB_SHA`" \
         -F "distribution_name=$GITHUB_HEAD_REF" \
         https://deploygate.com/api/${{secrets.DEPLOYGATE_USER}}/actindi/apps

WorkFlowが終了したらslackに通知したい

今回は以下の2つを使ってみました。

Slack Notify

github.com

  • slackのWebHookで連携できるので導入が楽
  • ビルド時間が1分ほどかかる

Post Slack messages

github.com

  • slackとはボットユーザトークンで連携
  • ビルド時間が30秒ほど

WorkFlowに追加

今回はSlack Notifyを使いました。
ymlファイルの最後に以下を追加します。

    - name: Slack Notification
      uses: rtCamp/action-slack-notify@master
      env:
        SLACK_CHANNEL: ${{secrets.SLACK_CHANNEL}}
        SLACK_COLOR: '#008000'
        SLACK_TITLE: ':rocket::rocket::rocket: Finished distribute to deploygate! :rocket::rocket::rocket:'
        SLACK_MESSAGE: 'Finished distribute to deploygate! Please check deploygate!'
        SLACK_USERNAME: GitHub Actions
        SLACK_WEBHOOK: ${{secrets.SLACK_WEBHOOK}}

ビルドが失敗したときもslackに通知したい

if: failure()で直前のステップが失敗した場合に実行することができます。

ドキュメント

help.github.com

WorkFlowに追加

ビルドステップのあとに以下を追加します。

    - name: Slack Notification when build failed
      if: failure()
      uses: rtCamp/action-slack-notify@master
      env:
        SLACK_CHANNEL: mobile_app_ci
        SLACK_COLOR: '#ff0000'
        SLACK_TITLE: ':fire::fire::fire: Build error! :fire::fire::fire:'
        SLACK_MESSAGE: "Build error! Please check github!"
        SLACK_USERNAME: GitHub Actions
        SLACK_WEBHOOK: ${{secrets.SLACK_WEBHOOK}}

master以外のブランチに対するpushでworkflowを実行するようにする

branches-ignoreにmasterを設定するとmaster以外のブランチに対するpushでworkflowが実行されます

ドキュメント

help.github.com

WorkFlowに追加

on.pushのあとにbranches-ignoreを追加します。

on: 
  push:
    branches-ignore:
     - 'master'

出来上がったWorkFlow

name: Android CI on Push
on: 
  push:
    branches-ignore:
     - 'master'
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 assembleDebug
    - name: Slack Notification when build failed
      if: failure()
      uses: rtCamp/action-slack-notify@master
      env:
        SLACK_CHANNEL: mobile_app_ci
        SLACK_COLOR: '#ff0000'
        SLACK_TITLE: ':fire::fire::fire: Build error! :fire::fire::fire:'
        SLACK_MESSAGE: "Build error! Please check github!"
        SLACK_USERNAME: GitHub Actions
        SLACK_WEBHOOK: ${{secrets.SLACK_WEBHOOK}}
    - name: Distribute App
      run: |
        curl \
         -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \
         -F "file=@app/build/outputs/apk/debug/app-debug.apk" \
         -F "message=https://github.com/${{secrets.GITHUB_USER}}/${{secrets.GITHUB_REPOSITORY}}/commit/`git rev-parse --short $GITHUB_SHA`" \
         -F "distribution_name=$GITHUB_HEAD_REF" \
         https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps
    - name: Slack Notification
      uses: rtCamp/action-slack-notify@master
      env:
        SLACK_CHANNEL: mobile_app_ci
        SLACK_COLOR: '#008000'
        SLACK_TITLE: ':rocket::rocket::rocket: Finished distribute to deploygate! :rocket::rocket::rocket:'
        SLACK_MESSAGE: 'Finished distribute to deploygate! Please check deploygate! https://deploygate.com/users/${{secrets.DEPLOYGATE_USER}}/apps/${{secrets.DEBUG_APPLICATION_ID}}/binaries'
        SLACK_USERNAME: GitHub Actions
        SLACK_WEBHOOK: ${{secrets.SLACK_WEBHOOK}}

We are hiring!

ここまで読んでくれてありがとうございます!
アプリチームでは仲間を募集しています!

actindi.net

とりあえず話を聞いてみたいでも構いません!
五反田でお待ちしております!
それではよいクリスマスを!