fastlane matchで既存の証明書を(失効させずに)取り込む
iOS の証明書管理を fastlane match に移行するとき、既存の証明書を失効させずにそのまま match の管理下に取り込みたい場面があります。やってみたらエラーで詰まったので、原因と対処を残します。
症状: NameError: uninitialized constant Match::GitHelper
参考記事のとおりに進めたところ、次のエラーが出ました。
NameError: uninitialized constant Match::GitHelper
調べると fastlane の issue #13521 に行き着き、fastlane(Ruby)のバージョンによって Match::GitHelper の有無やAPIが違うことが原因と分かりました。つまり、参考にしたコードが自分の fastlane バージョンと噛み合っていなかった、というわけです。
対処: バージョン別に irb で取り込む
暗号化済みの証明書リポジトリを clone し、match の保存形式へ取り込みます。バージョンで書き方が変わります(git_url とパスワードはご自身の値に置き換えてください)。
fastlane 2.105.2 以下
irb(main):001:0> require 'match'
irb(main):002:0> git_url = 'git@github.com:path-to/the-encrypted-certs-repo.git'
irb(main):003:0> shallow_clone = false
irb(main):004:0> manual_password = 'password-to-decrypt-the-repo'
irb(main):005:0> workspace = Match::GitHelper.clone(git_url, shallow_clone, manual_password: manual_password)
それより新しいバージョン
manual_password 引数ではなく、環境変数 MATCH_PASSWORD を使います。
irb(main):001:0> require 'match'
irb(main):002:0> git_url = 'git@github.com:path-to/the-encrypted-certs-repo.git'
irb(main):003:0> shallow_clone = false
irb(main):004:0> ENV["MATCH_PASSWORD"] = 'password-to-decrypt-the-repo'
irb(main):005:0> branch = 'master'
clone できたら、ファイルを暗号化して match のリポジトリへコミットします。
irb(main):010:0> encryption.encrypt_files
irb(main):011:0> files_to_commit = Dir[File.join(storage.working_directory, "**", "*.{cer,p12,mobileprovision}")]
irb(main):012:0> storage.save_changes!(files_to_commit: files_to_commit)
これで既存証明書を失効させずに match 管理下へ取り込めました。
注: 上記の
git_urlは例示のプレースホルダーで、password-to-decrypt-the-repoもダミーです。実際のリポジトリURLやパスフレーズは絶対にコード・記事に直書きせず、環境変数やシークレット管理で扱ってください。
まとめ
Match::GitHelper まわりのエラーは、多くが fastlane / Ruby のバージョン差が原因です。エラーに当たったら、まず自分の fastlane バージョンを確認し、そのバージョンに合った API で取り込むのが近道でした。