FlutterアプリをGitHub ActionsでDeployGateのデプロイを自動化!

18619 ワード

概要

こんな感じの説明をする。

私はいわゆるITゼネコンのSEなので、仕事ではなかなか新しい技術を習得することが難しい。そこで、仕事とは別にSingularitySociety(社会を技術で良くしていこうNPO)でMaaSプロジェクトに参加している。
SingularitySocietyでは小規模のFlutterアプリの配布にDeployGateを使用しており、GitHub ActionsでのCI/CDを実施している。Societyからの勧めもあるが、どなたかの参考になればと思い公開する。
Flutterの開発スピードが尋常ではないので、少し古いバージョン(8.1.1)になる。最新のバージョンでの確認はしていない。

GitHub Actions の登録

ワークフローを新規作成する。
GitHubの "Actions" タブをクリックし、"set up a workflow yourself" をクリックする。

workflow の名称 "main.yaml"(デフォルト) を設定し、
"Edit new file" にGitHub Actions のスクリプト を入力する。
"Start commit" ボタンをクリックする。

GitHub Actions に登録するスクリプト。

name: iOS CI/CD

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: macos-latest

    steps:
      - uses: actions/checkout@v2

      - name: Select Xcode version 13.1
        run: sudo xcode-select -s '/Applications/Xcode_13.1.app/Contents/Developer'

      - name: Show Xcode version
        run: xcodebuild -version

      - 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: '2.8.1'
          channel: 'stable'

      - name: flutter dependencies install
        run: flutter pub get

      - name: Import Provisioning Profile
        run: |
          mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
          touch ~/Library/MobileDevice/Provisioning\ Profiles/decoded.mobileprovision
          echo -n '${{ secrets.PROVISIONING_PROFILE }}' | base64 -d -o ~/Library/MobileDevice/Provisioning\ Profiles/decoded.mobileprovision
      - name: Import Code-Signing Certificates
        uses: Apple-Actions/import-codesign-certs@v1
        with:
          p12-file-base64: ${{ secrets.CERTIFICATES_P12 }}
          p12-password: ${{ secrets.CERTIFICATE_PASSWORD }}

      - name: Import Export Options
        run: echo -n '${{ secrets.EXPORT_OPTIONS }}' >> ExportOptions.plist

      - run: flutter build ipa --export-options-plist=ExportOptions.plist

      - name: Distribute iOS app
        run: |
          curl \
            -H "Authorization: token ${{secrets.DEPLOYGATE_API_KEY}}" \
            -F "file=@/Users/runner/work/kochi_bus_photo_app/kochi_bus_photo_app/build/ios/ipa/xxxxxxxxxx_app.ipa" \
            -F "message=git:$GIT_HASH" \
            -F "distribution_name=$GIT_BRANCH" \
            -F "release_note=new ios build" \
            -F "distribution_key=${{secrets.IOS_DISTRIBUTION_HASH}}" \
            "https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps"

スクリプト内で{secrets.XXXXXX} となっている箇所は暗号化されたシークレットを入力する必要がある。

Secretsに設定する内容

シークレット 内容
PROVISIONING_PROFILE プロビジョニングファイルの内容
EXPORT_OPTIONS ExportOptions.plistファイルの内容
DEPLOYGATE_API_KEY アカウントのAPIキー
DEPLOYGATE_USER DeployGateアカウントのユーザー名
IOS_DISTRIBUTION_HASH アプリの配布ページのリンクの末尾部分(/distributions/の後ろの値)

Secretsに設定する内容は、Apple Developer で発行する証明書(プロビジョニングファイル)や、DeployGata 関連の情報が必要となるため、以下に順を追って説明していく。

Secrets の登録について

GitHub の"Settings"でsecretsを登録する。
ただし、情報漏れ対策のため参照は出来ない。

また、VSCodeのGitHub Actions機能拡張によりSecretsの設定ができる。
こちらも、Webと同様、設定は可能であるが参照はできない。

GitHub Actions機能拡張について

以下はVSCodeの機能拡張をインストールする手順である。