22時に寝ようと思って2時に寝る。

備忘録や日記を書いてます。きょうは早く寝よう。

CircleCI - macOS コンテナ上で利用できる iOS Simulator を調べる

はじめに

CircleCI 上で UI Test を実行する際に任意の iOS Simulator を指定することがあると思います。指定するにあたって、macOS のコンテナ上で事前に用意されている iOS Simulator を把握する方法について紹介します。

結論としては、CircleCI のジョブに SSH 接続して、 xcrun simctl list devices コマンドを実行することで利用できる Simulator の一覧を取得できます。

指定するXcode バージョンによって利用できる Simulator のラインナップが違う

ここから各macOSコンテナインストールされているソフトウェアを確認できます。

RuntimesDevices を確認すると、利用できるOS バージョンとデバイスが分かります。ここで注意したいのは、デバイスによっては使えるOSが限定されているので(例えば、iPhone SE と iOS13.3 の組み合わせは存在しない)、それらの組み合わせを具体的に把握したい場合は、xcrun コマンドで調べる必要があります。

xcrun simctl list devices で、利用できる Simulator を一覧する

xcrun simctl は、Xcode に含まれる標準CLIで、主に Simulator をコマンドラインで操作・管理するための機能を備えています。

xcrun simctl list devices を実行してみます。

$ xcrun simctl list devices
== Devices ==
-- iOS 12.2 --
    iPhone 5s (1AF03B24-D667-4FA0-ABAD-6B5D255D7C42) (Shutdown)
    iPhone 6 Plus (31733952-2624-41B9-9CB9-BBF9A6A1BE8B) (Shutdown)
    iPhone 6 (75133BAE-AE13-405F-AB5A-F0BB0A3B1E98) (Shutdown)
    iPhone 6s (2692F9AD-1EBE-4FA0-B4DB-4A3F47ECA097) (Shutdown)
    iPhone 6s Plus (2EDEC588-1BC1-465C-BE77-1D58EE9ECE03) (Shutdown)
    iPhone SE (28CD4003-D4AC-4F97-BFDF-00AFDFE3F08E) (Shutdown)
    iPhone 7 (7339D766-17AB-4A8D-8214-E93657B0200B) (Shutdown)
    iPhone 7 Plus (671C4D3C-AB9E-481C-9D7D-3BCA62CAF5D9) (Shutdown)
    iPhone 8 (C43A0A30-A28D-4647-8B37-CD17B027E119) (Shutdown)
    iPhone 8 Plus (4CE0ADB9-F373-4723-9EAD-235BB7AA7690) (Shutdown)
    iPhone X (302D33E0-44B1-4105-8914-3C3BAF964AC3) (Shutdown)
    iPhone Xs (3200B852-8926-43DA-B4EC-D5A75F9E0FB6) (Shutdown)
    iPhone Xs Max (FCB63BD0-4FAC-4A0C-812E-80BD83CDD8C3) (Shutdown)
    iPhone Xʀ (D2B8D5FB-7100-47A1-BCF5-7017B372FF7A) (Shutdown)
    iPad Air (FFBA7D98-F642-4254-9372-423C3E48E43D) (Shutdown)
    iPad Air 2 (F5D49A9C-C2A9-4124-B988-5139A2401F58) (Shutdown)
    iPad Pro (9.7-inch) (50EABE28-EF6D-4AF3-B9A1-7B93F019112B) (Shutdown)
    iPad Pro (12.9-inch) (7CE07B4D-0A2F-44E2-A7BC-DC55EC35FB72) (Shutdown)
    iPad (5th generation) (48C502FB-7BC7-42C0-A07D-86D965A2914F) (Shutdown)
    iPad Pro (12.9-inch) (2nd generation) (CA495D19-CAEE-4885-9F81-99585E6926CA) (Shutdown)
    iPad Pro (10.5-inch) (86133C43-0127-444B-9EB7-2BD67A938306) (Shutdown)
    iPad (6th generation) (4125706C-FA8C-4720-B6E0-7283F29DE081) (Shutdown)
    iPad Pro (11-inch) (FAAA7E3B-DA38-4999-A89B-FC25D113F8B9) (Shutdown)
    iPad Pro (12.9-inch) (3rd generation) (CFDC9512-38A2-4CA3-AD7D-435456355D8C) (Shutdown)
    iPad Air (3rd generation) (38894DEB-5BCE-42EA-9AF9-D4548EDAC881) (Shutdown)
-- iOS 12.4 --
    iPhone 5s (046A9C21-AFD5-434D-9B61-EE18A73D674A) (Shutdown)
    iPhone 6 Plus (C9D65D15-39CD-45E3-9964-1C05F5A153AB) (Shutdown)
    iPhone 6 (B21C342B-B25E-4B3F-A836-6C9D514E0903) (Shutdown)
    iPhone 6s (FD0E061D-67E3-489B-9E36-4D41E2795EBD) (Shutdown)
    iPhone 6s Plus (601197A5-AF38-4937-B66C-E7AC63F7A982) (Shutdown)
    iPhone SE (825FCF5E-E65E-4D72-A549-D08BDE6560B6) (Shutdown)
    iPhone 7 (6C11E32B-1DB7-4BEA-BCF7-FD296E0298C9) (Shutdown)
    iPhone 7 Plus (6B704ABA-AF68-48CF-9359-509E1A3D29B3) (Shutdown)
    iPhone 8 (44955F91-CE61-44E8-AF4E-DBD00ECFDB61) (Shutdown)
    iPhone 8 Plus (7C58677A-B157-4D3A-A6A6-05D67C76B856) (Shutdown)
    iPhone X (014774AE-D600-451D-BF0B-300E6A2FF9E1) (Shutdown)
    iPhone Xs (76431C2E-B0E1-434F-AF14-9BA0F9F8EEBA) (Shutdown)
    iPhone Xs Max (A05F76CD-98E8-4847-91E6-4252A039B1B3) (Shutdown)
    iPhone Xʀ (A0C5B344-26B8-493F-BCD2-58DA441EC5A8) (Shutdown)
    iPad Air (8533D0C7-BF40-4F92-808F-8F06E1A698A3) (Shutdown)
    iPad Air 2 (07690BC7-DA6A-46A4-940E-EC057B83B29E) (Shutdown)
    iPad Pro (9.7-inch) (AE20F740-74C5-4DAC-8BAB-8C1332F1F55D) (Shutdown)
    iPad Pro (12.9-inch) (17CA1C31-5A2B-4E2F-B5BC-C9800A8F1678) (Shutdown)
    iPad (5th generation) (DA04D45E-D445-4998-B928-E3AE410AC062) (Shutdown)
    iPad Pro (12.9-inch) (2nd generation) (10C0C185-B40B-416C-A2D7-4A0B72AAB49F) (Shutdown)
    iPad Pro (10.5-inch) (4EB6A598-7D54-49D9-AAC1-B6A093C8A214) (Shutdown)
    iPad (6th generation) (8576A2FC-2A4D-4939-94A8-949E4970EB00) (Shutdown)
    iPad Pro (11-inch) (BCD341B2-F33D-4D98-940E-B423500FA95B) (Shutdown)
    iPad Pro (12.9-inch) (3rd generation) (B6B052AF-65C1-43AB-8D3A-D8EB7A9BFF06) (Shutdown)
    iPad Air (3rd generation) (C7A80B69-5CA9-4A08-A9A8-471DBCABE502) (Shutdown)
-- iOS 13.3 --
    iPhone 8 (24B098E9-40FA-4FAE-A84B-CAB08F19FEDE) (Shutdown)
    iPhone 8 Plus (06AD8C58-1FE4-4696-BA9A-B4E44D36FAC7) (Shutdown)
    iPhone 11 (B755A75C-FF5D-4392-A97D-7C8C6A272579) (Shutdown)
    iPhone 11 Pro (651EA440-C365-4043-BE5F-AAEA79A32469) (Shutdown)
    iPhone 11 Pro Max (43308B24-0726-46A7-B8F5-584682FBC83D) (Shutdown)
    iPad Pro (9.7-inch) (49AA7AB9-4BD2-441B-9BE9-9A1BF2002CA3) (Shutdown)
    iPad (7th generation) (97E6DA3C-984B-4720-8AAF-BE17A427085C) (Shutdown)
    iPad Pro (11-inch) (2AD0CF74-FD8D-4A23-BD3B-22A4C0FEAB44) (Shutdown)
    iPad Pro (12.9-inch) (3rd generation) (5CC57CFA-AE46-4FB7-B656-E7FD1E9994EC) (Shutdown)
    iPad Air (3rd generation) (9F710327-DAFB-4D6B-8197-445DCCAAFFB7) (Shutdown)
-- tvOS 12.4 --
    Apple TV (F0706864-3933-4D65-87F5-93E4EB602074) (Shutdown)
    Apple TV 4K (0403E229-3B97-4F69-96B1-5CD5077A4A50) (Shutdown)
    Apple TV 4K (at 1080p) (CFA38739-EB05-4972-8991-A1E42219704A) (Shutdown)
-- tvOS 13.3 --
    Apple TV (6A22CD8B-CD2F-48A8-974F-2ADB31C3F9D9) (Shutdown)
    Apple TV 4K (47432A98-CAA1-425B-A7FD-2D9D07E5C2A2) (Shutdown)
    Apple TV 4K (at 1080p) (EAF9A428-4A71-4062-8963-20E5465A540C) (Shutdown)
-- watchOS 5.3 --
    Apple Watch Series 2 - 38mm (665441D3-061D-4F3E-8D18-EC544060D43D) (Shutdown)
    Apple Watch Series 2 - 42mm (1D9027F4-73CA-4559-B247-19FC32BE3D5B) (Shutdown)
    Apple Watch Series 3 - 38mm (99C85FB8-5E99-4664-B1A6-D96BFD67888F) (Shutdown)
    Apple Watch Series 3 - 42mm (12A4DE0A-ABCF-40BF-B79E-9EBB33E06B21) (Shutdown)
    Apple Watch Series 4 - 40mm (63AB7682-E481-4A3C-84A9-3732EB4355B3) (Shutdown)
    Apple Watch Series 4 - 44mm (6AF06CD2-F876-484A-BCB6-92891A186AC0) (Shutdown)
-- watchOS 6.1 --
    Apple Watch Series 4 - 40mm (5DC1AF52-C03B-4D58-BA4E-21E3DB926BAF) (Shutdown)
    Apple Watch Series 4 - 44mm (7C1CB39D-A7D4-4A1A-BE58-A021A4DEFDB5) (Shutdown)
    Apple Watch Series 5 - 40mm (93698ADC-D708-4BDB-958B-2CD8FBFC14C2) (Shutdown)
    Apple Watch Series 5 - 44mm (6D4B4A49-2C32-4FB0-88E1-90DD5DF829F9) (Shutdown)

各 OS バージョンで利用可能なデバイスが一覧されました。端末名の後ろに続く文字列は、Simulator を一意に特定するための UDID と現在の状態です。

fastlane の scan 機能の run_tests に端末を指定する devices パラメーターがありますが、ここでは iPhone 11 Pro Max (13.2) のように #{device} (#{version}) という規則で端末を指定して、配列で渡してあげると良いと思います。

さいごに

当初、 UI Test を実行する際に「この端末のこのバージョンの組み合わせはあるだろ〜」と雰囲気で Simulator を指定して、'iPhone 11 Pro Max (12.4)', couldn’t find matching simulator と怒られたという経緯があり、ちゃんと調べることに至りました。何事も、雰囲気でやってはいけないですね。。

参考