2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

mac なしで iOS アプリの CI を動かしたい!

Posted at

はじめに

この記事では、mac なしで iOS アプリの CI 構築を目指しましたが、現時点では実現できていません。可能性について言及するだけになっているため、ソリューションの期待に添えないことを予めご了承ください。

Xcode Cloud

まず iOS アプリの CI 構築であれば、Xcode Cloud が有力な選択肢になります。

しかし、KMP を採用している場合、Xcode Cloud 上に毎回 JVM セットアップが必要になり1、決して相性が良いとは言えないのが現状あります。framework を別リポジトリとして別途ビルド済みのものを直接取り込めたらその限りではないです。

GitHub Actions

ソースコードを GitHub にホストしているなら GitHub Actions が選択肢として有力です。macOS のインスタンスを利用したら特に問題なく構築できます。Xcode Cloud と異なり、JVM 環境の構築に課題はない認識です。注意したいのは、Linux ランナーに比べて macOS ランナーは高コストで、ジョブ使用量の差は、繰り返し実行する CI で選択するには費用面の負担増はプロジェクトによっては無視できない差異になります。正確な費用は以下のドキュメントを参照して算出できます。

ホステッドランナー

GitHub では、費用面を考慮してホステッドランナーの選択肢も用意されています。iOS 向けにホステッドランナーを利用するには次の記事に詳しく書いているので参照ください。

ホステッドランナーは実行時に GitHub に対する費用は発生しませんが、ホストするマシンの運用コストは発生します。こちらも運用環境・条件によっては決して無視できないコストになります。

費用と運用コストの両方を抑えたい

xtool

そこで登場するのが xtool です :rocket:

Linux 環境でも iOS アプリをビルドできるツールになります。

これを利用すれば、GitHub Actions において iOS アプリ向けの CI を ubuntu 上でも構築できると意気込んで今回の Advent Calendar にテーマとして登録しました。

しかし、繰り返しになりますが、実際にワークフローを構築すると実現が難しいとわかりました。そのため、ここから先には、もしこういう方向性で xtool が拡張されれば、CI でも利用ができそうであるという可能性を示すだけになっています。

xtool setup

現時点では xtool setup コマンドの実行は対話型のみを採用しているため、GitHub Actions には利用できません。自動生成された設定例を参考にして、次のようなファイルを試しに実行してみました。APP_STORE_CONNECT_API_* から始まる環境変数は Apple Developer Program の Apple Store Connect API として作成し、secrets として追加済みです。

      - name: Setup xtool  
        run: |  
          xtool setup
        env:  
          APP_STORE_CONNECT_API_KEY_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }}  
          APP_STORE_CONNECT_API_KEY_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_API_ISSUER_ID }}  
          APP_STORE_CONNECT_API_KEY_KEY: ${{ secrets.APP_STORE_CONNECT_API_PRIVATE_KEY }}  

エラー内容は以下の通りで、対話型としてログインモードの選択が求められます。この環境変数の仕様は fastlane で採用されているもので xtool でこの入力方式は採用していません。CI では対話入力ができないため、この部分が進行できず I/O エラーになります。

Run xtool setup
  xtool setup
  shell: /usr/bin/bash -e {0}
  env:
    APP_STORE_CONNECT_API_KEY_KEY_ID: ***
    APP_STORE_CONNECT_API_KEY_ISSUER_ID: ***
    APP_STORE_CONNECT_API_KEY_KEY: ***
Error: I/O on closed channel
Select login mode
0: API Key (requires paid Apple Developer Program membership)
1: Password (works with any Apple ID but uses private APIs)
Error: Process completed with exit code 1.

xtool setupxtool auth && xtool sdk のエイリアスであり、以下の二つのコマンドを同時に実行するものです。

  • xtool auth
  • xtool sdk

xtool auth

前述の認証を要求するのは xtool auth の方で、xtool setup と異なり、次のオプションが用意されています。

  -m, --mode <mode>       (values: key, password)

password はさらに次のオプションで ID とパスワードを指定し、2FA 認証を実行するものになります。そのため CI での実行は困難です。

  -u, --username <username>
                          Apple ID
  -p, --password <password>

次に key の方ですが、実行すると、対話型で前述の API Key 情報の入力を求められます。以下は、xxx と適当な値を入力してフォークスルーした結果になります。当然ながらエラーになります。

% xtool auth -m key
Key ID: xxx
Issuer ID: xxx
Key path: xxx
Error: The file “xxx” couldn’t be opened because there is no such file.

このプロンプトを構成するコードが以下にあり、ここでユーザ入力を待たずに環境変数から値を受け取るように補完できたら、認証を非対話に進めることができそうです。

記事の執筆には間に合いませんでしたが、この方針で PR を作成しようと思います。

Issues

関連 Issue としては以下になりそうです。他に良いアイデアがありましたら、是非こちらの Issue にコメントを寄せてもらえたらと思います。

  1. Xcode Cloud では JVM のキャッシュができないためです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?