今週は、iOSビルドの準備を進めました。

v2.1.0では、DartのワークフローからAndroidのAPK・AABをビルドできるようにしました。今週はその先のiOSに向けて、署名に必要なキーをCLIで準備する流れを整えています。

あわせて、CLIの導入・更新、コマンド補完、生成ファイルの整理、Flutterテストの実行オプションを改善しました。この記事では、v2.1.0以降、10月9日までの主な変更を紹介します。

Appleのキーを発行して、チームに保存するまで。

genuineci setup asc-keys を追加しました。Apple IDでのログインと二要素認証、対象組織の確認、App Store Connect APIキーの発行、GenuineCIへの保存を、ターミナルから進められます。

まずGenuineCIにログインし、キーを保存するチームを選んでから実行します。ASCキーの新規発行は、現在Apple Silicon Macに対応しています。

genuineci login
genuineci switch team
genuineci setup asc-keys
genuineci sync --secrets

セットアップでは、次の4つのシークレットを準備します。

  • OPENCI_GENERATED_ASC_KEY_ID
  • OPENCI_GENERATED_ASC_ISSUER_ID
  • OPENCI_GENERATED_P8_BASE64
  • OPENCI_GENERATED_IOS_CERTIFICATE_PRIVATE_KEY

ASCキーに加えて、署名証明書に使う秘密鍵もまとめて準備するようにしました。証明書用秘密鍵は、チームにまだ存在しなければサーバーで生成し、すでにある場合は再利用します。

ASCキーを登録済みで、証明書用秘密鍵だけを追加したい場合には、専用コマンドも使えます。この操作にAppleへのログインは必要ありません。

genuineci setup ios-certificate-key
genuineci sync --secrets

ここで準備するのはキーです。署名証明書とプロビジョニングプロファイルは、ビルド時に取得・作成する構成にしています。

署名付きIPAビルドも、実装を進めています。

ワークフローSDKには、buildIpa() のAPIと署名準備の処理を追加しました。ASCの認証情報と証明書用秘密鍵を受け取り、ビルド用Keychainの作成・アンロック、署名ファイルの取得へつなげています。

現在は、Codemagic CLIを使った証明書のインポート、プロビジョニングプロファイルの適用、ExportOptions.plistの生成から、flutter build ipa までを接続する変更をレビュー中です。最初の対象はAd Hoc配布です。

統合部分はまだ未マージで、実VMでの署名ビルド検証もこれからです。生成されたIPAの確認と、Firebase App Distributionへの配布は、次の段階で進めます。

CLIの導入と、毎日の操作を簡単に。

CLIを genuineci_cli としてpub.devに公開し、genuineci コマンドで使えるようにしました。

dart install genuineci_cli

更新には genuineci update を使えます。通常の対話操作でも新しいバージョンを確認し、更新するかを尋ねるようになりました。CIや出力をリダイレクトした実行では、自動更新の確認は表示しません。

現在の接続先とチームを確認する genuineci status、所属チームを一覧表示する genuineci list teams も追加しています。チームを切り替える前後に、ターミナル上で状態を確認できます。

さらにBash・ZshのTab補完に対応しました。コマンド名、オプション、言語名や保存済みの接続先などを補完できます。

シークレット管理には genuineci delete secret SECRET_NAME を追加しました。使わなくなった値を、選択中のチームから削除できます。確認プロンプトなしで削除するため、実行前にチームと名前を確認してください。

生成ファイルを、ひとつのディレクトリに。

genuineci sync だけで、シークレットとパスの定義をまとめて生成できるようにしました。必要な方だけを更新する場合は、フラグで指定できます。

genuineci sync
genuineci sync --secrets
genuineci sync --paths

生成先は openci/generated/ に統一しました。

openci/
  generated/
    paths.g.dart
    secrets.g.dart

既存のワークフローでは変更が必要です。 以前の genuineci sync secrets / genuineci sync paths は、それぞれ genuineci sync --secrets / genuineci sync --paths に置き換えてください。openci/ 直下のワークフローファイルでは、import先も generated/secrets.g.dart と generated/paths.g.dart に変更します。

パス生成は、Pub workspaceを定義していない単一パッケージにも対応しました。switch などDartの予約語と重なるディレクトリ名も、switch_ のようなgetterとして扱えるようにしています。

Flutterテストに、タイムゾーンとタグ指定を。

openci_workflow 0.1.2では、unitTests() に tz と excludeTags を追加しました。

await ci.flutter.unitTests(
  tz: TimeZone.asiaTokyo,
  excludeTags: 'golden',
);

日付や時刻を扱うテストでは、実行時のタイムゾーンを指定できます。TimeZone.asiaTokyo と TimeZone.utc を用意しています。excludeTags はFlutterのタグ除外に渡されるため、'golden || slow' のような式も指定できます。

OpenCI.init() で作成した ci を使う処理部分の抜粋です。importと初期化は省略しています。

使い方を調べる場所も整えました。

GenuineCIのサイトに Docs を追加しました。クイックスタート、ワークフロー、Flutter、シークレット、CLI、セルフホストのガイドをまとめています。

ページを横断する検索、見出しから作る目次、コードのコピーとLight / Dark切り替えにも対応しました。ワークフローを書きながら、必要な設定やコマンドを探せます。

GenuineCI を詳しく見る