えんじにあ雑記!

開発していて学んだことをまとめていきます!

Github ActionsでAndroidアプリのCI/CDをやってみた

f:id:flat-M_M:20200913180921j:plain

FlutterでiOS/Androidアプリを開発していた際に、GithubActionsを使ってAndroidのCI/CD環境を構築した際のまとめです。

この記事 is 何?

Yahoo!さん主催のハッカソン「HackU」に向けてチーム開発している際に、デザイナーのメンバーにもアプリを手元の実機で確認してもらえる環境が作りたい!

できればGithubActionsとか使ってmasterにプッシュされたら自動でビルドとデプロイを行うみたいなカッコよさげなことしてみたい!

と思ってCI/CD環境を整えた際に得た知見をまとめた記事です。

兎にも角にも完成品のyamlファイルをひとまず次に載せておきます。

完成品

name: Android CI/CD

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:
    runs-on: macos-latest

    steps:
      - uses: actions/checkout@v2

      - name: install java 12.x
        uses: actions/setup-java@v1
        with:
          java-version: '12.x'

      - name: setup cache
        uses: actions/cache@v1
        with:
          path: /Users/runner/hostedtoolcache/flutter
          key: ${{ runner.OS }}-flutter-install-cache
      
      - name: install flutter
        uses: subosito/flutter-action@v1
        with:
          flutter-version: '1.20.2'
          channel: 'stable'
      
      - name: flutter dependencies install
        run: flutter pub get
      
      - name: build apk
        run: flutter build apk

      - name: Distribute android apk
        run: |
          curl \
            -H "Authorization: token ${{secrets.DEPLOYGATE_API_KEY}}" \
            -F "file=@build/app/outputs/flutter-apk/app-release.apk" \
            -F "message=git:$GIT_HASH" \
            -F "distribution_name=$GIT_BRANCH" \
            -F "release_note=new build" \
            -F "distribution_key=${{secrets.DEPLOYGATE_DIST_PAGE_HASH}}" \
            "https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps"

使用したもの

publicなリポジトリにした理由は特に隠さなければいけない情報がリポジトリに含まれていないことと、GithubActionsの使用制限がpublicリポジトリの場合は無いらしいから、という理由です。

yamlファイルの説明

ビルドが走るタイミングの設定

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

この部分で、masterブランチにpushされた時と、masterブランチに向けたpull_requestが作成・更新された時にワークフローが実行されるように設定しています。

Flutternのインストールをキャッシュしておく

- name: setup cache
uses: actions/cache@v1
with:
    path: /Users/runner/hostedtoolcache/flutter
    key: ${{ runner.OS }}-flutter-install-cache

この部分でFlutterのインストール先のファイルをキャッシュ対象にしておきます。

毎回インストールしていると遅くなってしまうので、同じバージョンでビルドする際にはキャッシュを使った方が早いです。

ビルドとデプロイ

- name: flutter dependencies install
run: flutter pub get

- name: build apk
run: flutter build apk

- name: Distribute android apk
run: |
    curl \
    -H "Authorization: token ${{secrets.DEPLOYGATE_API_KEY}}" \
    -F "file=@build/app/outputs/flutter-apk/app-release.apk" \
    -F "message=git:$GIT_HASH" \
    -F "distribution_name=$GIT_BRANCH" \
    -F "release_note=new build" \
    -F "distribution_key=${{secrets.DEPLOYGATE_DIST_PAGE_HASH}}" \
    "https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps"
flutter pub get

を実行してライブラリ関係のインストールを行います。

次に

flutter build apk

でビルドを実行してapkファイルを出力します。

最後にcurlコマンドを実行してdeploygateにデプロイしているのですが、詳細はDeploygateを利用したアプリのアップロードをみてもらえると良いかと思います。

使用しているSecretsの詳細

名前 内容
DEPLOYGATE_API_KEY Deploygateのアカウント設定>APIKeyに記載されている値です
DEPLOYGATE_DIST_PAGE_HASH Deploygateのアプリ配布ページURLに記載されているハッシュ値です
DEPLOYGATE_USER Deploygateのアカウントに登録されたユーザ名です