CI/CDビルドで一部シェルコマンドが使えなかったので代わりにSwiftのCLIを使ってみた

こんにちは。開発部第1グループの涌井です。
今回は「CI/CDビルドで一部シェルコマンドが使えなかったので代わりにSwiftのCLIを使ってみた」と題しまして、その時の所感などを紹介します。
CLIのビルドなどの方法はこの記事では詳細に取り上げません。記載のリンク(補足 : CLIについて)をご参照ください。
環境
- macOS : Sequoia 15.7.2
- Xcode : 26.2
- Command Line Tools : Xcode 26.2(17C52)
要件
まず要件として、下記のオーダーがありました。
- アプリのリポジトリには、本体のアプリ用のプロジェクトがあり、そちらに設定ファイルの内容を反映させて、各アプリを作成する。(アプリの機能は同じで、各アプリでアプリ表示名やWebページの表示先が異なるイメージ)
- 設定ファイルはjsonファイルで、各アプリのバンドルID、アプリ名、WebページのURLなどが記載されている
- CI/CDビルドで設定ファイルを反映させた各アプリをビルドする
ビルド手順概要
上記の要件をビルド手順にざっくり落とし込むと、下記のようにすれば良さそうです。
- jsonの設定ファイルを読み込む
- 本体アプリ用のプロジェクト配下のファイルにて、設定値を定数化などしておき、上記の読み込んだ内容で置き換える
- CI/CDビルド時に上記の置き換え後、本体のアプリをビルドする
となると次は実装手法の精査となるわけですが。。。
実装案その1
-
シェルファイル+jq
jq(JSONデータをコマンドライン上で扱えるCLIツール) : https://jqlang.org/
jqのインストールが社内のCI/CDビルドの下記ルールに抵触することから、この案を断念しました。。。
絶対遵守ルール
CI/CDビルドで使用している共有マシン内のアプリケーション階層などに対する、各案件でのライブラリやツール類のインストール禁止
早速、詰みました。お疲れ様でした。
と、それで許されるわけもなく。。。
そこでCLIです!
実装案その2
-
SwiftによるCLI
そもそもSwiftなら、jsonファイルの読み込みやパースなどの機能があるので、わざわざjqを使わなくてOKです。
加えて、設定ファイルの反映先もXcodeのプロジェクト配下にあり、反映先のファイルの読み込みや書き換えなども、Swiftで書けば良さそうです。 つまり、処理をSwiftで統一できる。素晴らしい。採用。
補足 : CLIについて
-
CLIの作成や管理方法は下記リンクをご参照ください。コマンドで簡単に作成でき、SPMで管理できて非常に便利です。
設定 json ファイルとCLI実行後のイメージ
CLIのインプットである設定jsonファイルと、CLI実行後のイメージは下記のようになります。
- 設定jsonファイル : WebページのURLなどが設定
{ "first_web_url": "https://xxxx.test.first", "second_web_url": "https://xxxx.test.second", ... }
- CLIで置き換えられるswiftファイル : 各プロパティにて定数定義(CLI実行前)
public enum UrlInfo { static let firstWebUrl = "_first_web_url_" static let secondWebUrl = "_second_web_url_" ... }
- CLI実行後、上記のswiftファイル中の各プロパティが、jsonファイルの内容で置き換えられる
public enum UrlInfo { static let firstWebUrl = "https://xxxx.test.first" static let secondWebUrl = "https://xxxx.test.second" ... }
ビルド実行時コマンド例
- CLIを作成し、設定ファイルの読み込みと反映を実装したうえで、.gitlab-ci.yml にCLIの実行コマンドを記載します。(実際にはディレクトリの移動なども必要になるはずなので、あくまで例です)
# Xcodeの設定やリポジトリのpullなどの前処理など実行 (省略) # CLIの実行 # INPUT_SETTING_DIRはCLIに渡す設定ファイルのディレクトリパス # DEST_ROOT_DIRはCLIに渡す反映先ののルートディレクトリパス # replacerはCLIの名前 - swift run replacer ${INPUT_SETTING_DIR} ${DEST_ROOT_DIR} # catでCLI実行により設定が反映されていることを確認 - cat ${CONST_SWIFT_FILE_PATH} # CLI実行後にアプリのビルドとipaのエクスポートを実行 - xcodebuild -workspace (省略) - xcodebuild -exportArchive (省略) # 他の処理も省略
まとめ
CI/CDビルドにおいて、設定ファイルの反映機能を事情によりシェルで実装できなかったので、SwiftのCLIで実装しました。下記のようなメリットとデメリットを踏まえたうえで、選択肢の1つとするのはアリかなと感じました。
-
- メリット
- 実装がSwiftで統一できる(ただし、実装の内容次第)
- シェルの実装経験や知識が乏しくても、Swiftで実装できるため、実装方法の調査などの時間が短縮できるかも(ただし、実装の内容次第)
- Xcodeでデバッグできるので、デバッグ作業が容易
- メリット
- デメリット
- Swiftはスクリプト言語ではなく、コンパイルが必要なので手間を感じる
- CLI自体のビルドが走るので、アプリ全体のビルド時間は恐らくシェルよりかかってしまう
- シェルの勉強機会損失(CLIとの比較などのために若干の調査は必要なので、全くゼロではないですが)
