iOS署名の準備から、配布先へのアップロードへ。
前回のv2.2.0では、App Store ConnectのキーをCLIで準備する流れと、実装途中のIPAビルドを紹介しました。v2.3.0では、署名付きIPAを生成し、その成果物をTestFlightやFirebase App Distributionへアップロードするところまで、Dartのワークフローでつなげられるようになりました。
この記事では、10月9日のv2.2.0から10月23日のv2.3.0までの変更をまとめます。モバイルアプリの配布に加えて、WebダッシュボードのGitHub連携、Cloudのチーム向け料金プラン、CLIのシークレット登録後の同期も更新しました。
署名付きIPAを作って、そのままTestFlightへ。
buildIpa() に、証明書のインポート、プロビジョニングプロファイルの適用、ExportOptions.plistの生成、flutter build ipa の実行までを組み込みました。Ad HocとApp Store向けの署名に対応し、生成したIPAの絶対パスを返します。
返されたパスを配布用のAPIに渡せるので、成果物の保存先をワークフロー側で組み立てる必要がなくなります。たとえば、App Store向けに署名してTestFlightへ送る処理は次のように書けます。
final ipaPath = await ci.flutter.buildIpa(
distributionMethod: IosDistributionMethod.appStore,
ascKeys: ascKeys,
certificatePrivateKey: certificatePrivateKey,
);
await ci.flutter.deployIpaToTestFlight(
ipaPath: ipaPath,
ascKeys: ascKeys,
);OpenCI.init() で作成した ci を使う処理部分です。ascKeys はチームのシークレットから用意した AppStoreConnectKeys、certificatePrivateKey は署名証明書用の秘密鍵です。importと初期化は省略しています。iOSのビルドには、Xcodeと署名用ツールを備えたmacOS環境が必要です。
deployIpaToTestFlight() はアップロード後、Apple側のビルド処理が完了するまで待ちます。テスターグループへの割り当てや外部テストの審査は、その後に行う操作です。
Firebase App Distributionには deployIpaToFirebaseAppDistribution() を追加しました。Base64形式のサービスアカウントJSONで認証し、REST APIからIPAをアップロードします。Firebase CLIやNode.jsのインストールは不要です。テスターやグループを指定しなければ、アップロードのみを行います。
AndroidとShorebirdも、配布の流れをDartで。
Androidでは、APK・AABのビルドに加えて、次のアップロード用APIを使えるようになりました。
| 配布先 | 成果物 | API |
|---|---|---|
| Firebase App Distribution | APK | deployApkToFirebaseAppDistribution() |
| Firebase App Distribution | AAB | deployAabToFirebaseAppDistribution() |
| Google Play Console | AAB | deployAabToPlayConsole() |
Google Play ConsoleへのアップロードはAABが対象で、デフォルトのトラックは内部テストです。Firebase App DistributionでAABを扱う場合は、FirebaseとGoogle Playの連携が必要です。いずれも、対象アプリの登録と必要な権限を持つサービスアカウントを準備して使います。
buildApk() と buildAab() には dartDefines も追加しました。環境ごとに異なる設定を、マップで渡せます。
await ci.flutter.buildAab(
flavor: 'production',
dartDefines: {'API_BASE_URL': 'https://api.example.com'},
);Shorebirdには ci.shorebird.releaseIos()、releaseApk()、releaseAab() を追加しました。flavor、Dart defines、dry runを指定でき、それぞれ生成したIPA・APK・AABの絶対パスを返します。ビルド環境にはShorebird CLIと SHOREBIRD_TOKEN を用意してください。今回対応したのはShorebirdのリリース作成です。
これらの配布機能と、後述のGoヘルパーは、公開済みの openci_workflow 0.1.4 で利用できます。
GitHub連携を、ダッシュボードから確認しながら。
Webダッシュボードに、GitHub.comとの接続を進めるフローを追加しました。
- チームの設定から Connect GitHub を開く。
- GitHubで認証し、ダッシュボードに戻る。
- 接続可能なGitHub Appのインストール先を選び、チームへの接続を確認する。
サーバーが接続権限を確認したうえで、リポジトリとブランチを取得します。接続可能なインストール先がない場合には、GitHub Appのインストール案内から設定を進め、再取得できます。
以前の設定でGitHubを利用していたチームは、Connect GitHubから再接続してください。 Installation IDやGitHub URLを手入力していた設定は、この確認付きの接続フローに移行しました。
Cloudに、チームで使える月額プランを。
Cloudの購入と契約管理を、Webダッシュボードから行えるようにしました。チーム単位でStripe Checkoutから購入し、支払い方法の変更、請求書の確認、期間末での解約にはStripe Customer Portalを使います。
| プラン | 月額 | 請求期間ごとのCI実行時間 |
|---|---|---|
| Light | US$10 | チーム共有600分 |
| Pro | US$100 | チーム共有6,000分 |
利用時間は、各ジョブが実際に実行された時間の合計です。キューや依存ジョブの完了を待つ時間は含みません。たとえば、10分かかるジョブを10本並列で動かした場合は、100分を消費します。
プランやチーム単位の同時実行数制限はありません。実際に開始できるジョブ数は、ワーカーの空き状況によって決まります。
実行時間の枠を使い切ると、新しいCIの開始を止めます。すでに実行中のジョブは完了まで継続し、追加の従量料金は発生しません。利用期限が切れた場合も、実行中のジョブを途中で打ち切ることはありません。ログや設定は引き続き開けます。
初回から決済が発生し、7日間の返金保証を用意しています。初回決済の成功から168時間以内の申請が対象で、更新・再契約は対象外です。返金時には即時解約となります。申請先と条件は、Webダッシュボードの料金画面で確認できます。
今回の料金画面では、プラン、CIを開始できるかどうか、支払い済み期間の終了日を確認できます。消費済み・残り時間の数値表示と初回無料トライアルは今後の対応です。Cloudの料金設定はセルフホストには適用されません。
シークレットを登録したら、生成ファイルも同期。
公開した genuineci_cli 0.6.0 では、genuineci register secret と genuineci register secretFile が登録に成功したあと、ワークスペースのパスとシークレットの定義を自動で同期します。
前回追加した openci/generated/ の生成ファイルまで更新するため、シークレットを追加するたびに別途 genuineci sync を実行する手間が減ります。同期に失敗した場合も、保存済みのシークレットは保持されます。原因を解消したあと、genuineci sync で再生成してください。
CLIの更新には、次のコマンドを使えます。
genuineci updateGoのチェックも、同じワークフローに。
openci_workflow にGo用のヘルパーを追加しました。リポジトリ内にGoのサービスがある場合も、Dartのワークフローからフォーマット・静的検査・テストを実行できます。
await ci.go.format(dir: 'apps/genuineci_server');
await ci.go.vet(dir: 'apps/genuineci_server');
await ci.go.test(dir: 'apps/genuineci_server');この例は、リポジトリルートを作業ディレクトリに設定した ci を使っています。
format() は go fmt ./... を実行し、必要に応じてファイルを書き換えます。Go自体のインストールは行わないため、ビルド環境にあらかじめ用意してください。
GenuineCI自身でも、Cloudの決済と利用時間の管理を担うGoサービスを追加し、そのチェックをCIに組み込みました。
SDKを更新する方へ。
通常のワークフローに使うパッケージは openci_workflow です。現在の公開バージョンは 0.1.4 です。ワークフローのテストで OpenCI.forTesting() を使っていた場合は、commandRunner を渡す公開コンストラクター OpenCI() に置き換えてください。
GenuineCIのAPIやモデルを直接利用する方向けには、openci_shared 2.0.0 も公開しました。GitHub連携、料金状態、ワーカーの実行記録に関するAPIを追加しています。
このバージョンでは、Team と BuildJobPlan から githubBaseUrl を削除しています。コンストラクターへの引数とプロパティの参照を取り除いてください。GitHubのURL設定はサーバー側で管理します。
変更の一覧は GitHub Release v2.3.0、実装の差分は v2.2.0との比較 から確認できます。ワークフローの基本的な書き方は Docs にまとめています。