altive / flutter_app_template

Flutter App Templete is a project that introduces an approach to architecture and project structure for developing Flutter apps.
MIT License
212 stars 21 forks source link

Creating an automated iOS distribution workflow #393

Closed riscait closed 1 week ago

riscait commented 3 weeks ago

Add the tasks you need.

### Tasks
- [x] Check ExportOptions.plist
naipaka commented 2 weeks ago

Note

Required Items

The request comments for a different project are as follows:

> iOSアプリのビルド自動化を行うために必要なApp Store Connect API Keyというものを作成していただきたいです 作成手順は[こちら](https://zenn.dev/welchi/articles/flutter-ios-ci-cd-xcode-cloud#3.-app-store-connect-api-key%E3%81%AE%E4%BD%9C%E6%88%90)の「3. App Store Connect API Keyの作成」の章になります。 手順内に出てくる「User and Access」のページは[こちら](https://appstoreconnect.apple.com/access/users)です。 また、API Keyの名前は「Xxx API Key」でお願いしたいです。 上記作成完了しましたら、手順内でも言及されている下記の3つの情報をいただきたいです > - Issuer ID > - KEY ID > - ダウンロードしたAPI Key

yamlファイル

action.yaml

```yaml name: Deploy ios app description: "Deploy iOS App" inputs: working-directory: description: "working-directory. example: ./packages/flutter_app" required: false default: "./" flavor: description: "Flavor name" required: true asc-key-id: description: "App Store Connect Key ID" required: true asc-issuer-id: description: "App Store Connect Issuer ID" required: true asc-key-base64: description: "App Store Connect Key Base64" required: true certificates-p12-base64: description: 'Certificates p12 file base64' required: true certificates-p12-password: description: 'Certificates p12 file password' required: true runs: using: "composite" steps: # 開発者証明書をインポートする。 # NOTE: flutter build で --no-codesign を指定する場合、Entitlementを正しく含めるために # アーカイブ時に署名する必要があり、そのためには開発者証明書をキーチェーンにインポートする必要がある。 # Secretsに登録した証明書は自動で更新されるため、 # 毎年 SecretsのCERTIFICATES_P12 と CERTIFICATES_P12_PASSWORD を更新する必要がある。 # Flutter側での改善に期待。 - name: Import Code Signing Certificate uses: apple-actions/import-codesign-certs@v2 with: p12-file-base64: ${{ inputs.certificates-p12-base64 }} p12-password: ${{ inputs.certificates-p12-password }} # App Store Connect API Keyをデコードする。 - name: Decode App Store Connect API Key run: | mkdir ./private_keys echo "${{ inputs.asc-key-base64 }}" | base64 --decode > ./private_keys/AuthKey_${{ inputs.asc-key-id }}.p8 echo "API_KEY_PATH=$(pwd)/private_keys/AuthKey_${{ inputs.asc-key-id }}.p8" >> $GITHUB_ENV shell: bash working-directory: ${{ inputs.working-directory }} # FlutterでiOSアプリをビルドする。 # この段階で署名を行うとエラーになるため--no-codesignを指定する。 - name: Run flutter build ios run: | flutter build ios --release --dart-define-from-file=dart_defines/${{ inputs.flavor }}.json --no-codesign shell: bash working-directory: ${{ inputs.working-directory }} # Xcodeでアーカイブを作成する。 - name: Archive by xcodebuild run: | xcodebuild archive \ -workspace ./ios/Runner.xcworkspace \ -scheme Runner \ -configuration Release \ -archivePath build/ios/Runner.xcarchive \ -allowProvisioningUpdates \ -authenticationKeyIssuerID ${{ inputs.asc-issuer-id }} \ -authenticationKeyID ${{ inputs.asc-key-id }} \ -authenticationKeyPath ${{ env.API_KEY_PATH }} shell: bash working-directory: ${{ inputs.working-directory }} # アーカイブをExportしてipaファイルを作成する。 - name: Export archive by xcodebuild run: | xcodebuild -exportArchive \ -archivePath ./build/ios/Runner.xcarchive \ -exportPath ./build/ios/ipa \ -exportOptionsPlist ./ios/${{ inputs.flavor }}/ExportOptions.plist \ -allowProvisioningUpdates \ -authenticationKeyIssuerID ${{ inputs.asc-issuer-id }} \ -authenticationKeyID ${{ inputs.asc-key-id }} \ -authenticationKeyPath ${{ env.API_KEY_PATH }} shell: bash working-directory: ${{ inputs.working-directory }} # ipaファイルのパスを環境変数に設定する。 - name: Detect path for ipa file run: | echo "IPA_PATH=$(find build/ios/ipa -type f -name '*.ipa')" >> "$GITHUB_ENV" shell: bash working-directory: ${{ inputs.working-directory }} # App Store Connectにipaファイルをアップロードする。 - name: Upload ipa file to App Store Connect run: | xcrun altool --upload-app -t ios -f "${IPA_PATH}" --apiKey ${{ inputs.asc-key-id }} --apiIssuer ${{ inputs.asc-issuer-id }} shell: bash working-directory: ${{ inputs.working-directory }} # App Store Connect API Keyを削除する。 - name: Remove App Store Connect API Key if: ${{ always() }} run: > rm ./private_keys/AuthKey_${{ inputs.asc-key-id }}.p8 shell: bash working-directory: ${{ inputs.working-directory }} ```

deploy-staging-ios-app.yaml

```yaml name: Deploy staging ios app on: # main向けのPRがCloseされたときに実行する。 pull_request: types: [closed] branches: - main # 手動で実行も可とする。 workflow_dispatch: jobs: deploy-app: name: Deploy staging app (ios) # macos-latest だとアーカイブ時にエラーが発生するため、macos-13を指定する。 runs-on: macos-13 timeout-minutes: 60 # 手動実行 または PRがマージされたとき、かつPR元のブランチ名に「release/」が含まれている場合に実行する。 if: github.event_name == 'workflow_dispatch' || (github.event.pull_request.merged == true && contains(github.head_ref, 'release/')) env: ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} ASC_KEY_BASE64: ${{ secrets.ASC_KEY_BASE64 }} CERTIFICATES_P12: ${{ secrets.CERTIFICATES_P12 }} CERTIFICATES_P12_PASSWORD: ${{ secrets.CERTIFICATES_P12_PASSWORD }} steps: - uses: actions/checkout@v4 # Flutterをセットアップする。 - name: Setup Flutter uses: ./.github/actions/setup_flutter # App Store Connectにipaファイルをアップロードする。 - name: Deploy ios app uses: ./.github/actions/deploy_ios_app with: working-directory: ./packages/flutter_app_template flavor: stg asc-key-id: ${{ env.ASC_KEY_ID }} asc-issuer-id: ${{ env.ASC_ISSUER_ID }} asc-key-base64: ${{ env.ASC_KEY_BASE64 }} certificates-p12-base64: ${{ env.CERTIFICATES_P12 }} certificates-p12-password: ${{ env.CERTIFICATES_P12_PASSWORD }} ```

deploy-production-ios-app.yaml

```yaml name: Deploy production ios app on: # main向けのPRがCloseされたときに実行する。 pull_request: types: [closed] branches: - main # 手動で実行も可とする。 workflow_dispatch: jobs: deploy-app: name: Deploy production app (ios) # macos-latest だとアーカイブ時にエラーが発生するため、macos-13を指定する。 runs-on: macos-13 timeout-minutes: 60 # 手動実行 または PRがマージされたとき、かつPR元のブランチ名に「release/」が含まれている場合に実行する。 if: github.event_name == 'workflow_dispatch' || (github.event.pull_request.merged == true && contains(github.head_ref, 'release/')) env: ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} ASC_KEY_BASE64: ${{ secrets.ASC_KEY_BASE64 }} CERTIFICATES_P12: ${{ secrets.CERTIFICATES_P12 }} CERTIFICATES_P12_PASSWORD: ${{ secrets.CERTIFICATES_P12_PASSWORD }} steps: - uses: actions/checkout@v4 # Flutterをセットアップする。 - name: Setup Flutter uses: ./.github/actions/setup_flutter # App Store Connectにipaファイルをアップロードする。 - name: Deploy ios app uses: ./.github/actions/deploy_ios_app with: working-directory: ./packages/flutter_app_template flavor: prod asc-key-id: ${{ env.ASC_KEY_ID }} asc-issuer-id: ${{ env.ASC_ISSUER_ID }} asc-key-base64: ${{ env.ASC_KEY_BASE64 }} certificates-p12-base64: ${{ env.CERTIFICATES_P12 }} certificates-p12-password: ${{ env.CERTIFICATES_P12_PASSWORD }} ```