Fastlane setup_ci配置问题:GitHub Actions构建iOS项目卡壳求助
解决GitHub Actions中Fastlane构建iOS项目的Keychain锁定问题
一、先搞懂setup_ci到底是干啥的
Fastlane的setup_ci是专门给CI环境准备的初始化命令,主要做这几件事:
- 自动解锁CI环境里的系统Keychain(默认是login Keychain)
- 调整Xcode的构建设置,关掉那些需要本地交互的选项
- 适配CI环境的日志输出,让日志更规范
- 自动处理CI环境下的文件权限问题
但它不是万能的,尤其是用Match管理私有证书仓库时,得配合额外配置才能生效。
二、搭配Match私有GitHub仓库的正确姿势
如果你的证书和Provisioning Profile存在私有GitHub仓库里,按下面的步骤配置:
1. 准备GitHub Personal Access Token (PAT)
在你项目的GitHub仓库里,进「Settings -> Secrets and variables -> Actions」,新增一个名为MATCH_GITHUB_TOKEN的密钥,这个Token必须有私有仓库的读取权限(开repo权限就行)。
2. 配置Fastfile里的setup_ci和Match
before_all do # 显式指定解锁login Keychain,避免CI环境的锁定问题 setup_ci( keychain_name: "login.keychain-db", keychain_password: "" # GitHub Actions的login Keychain默认密码是空的 ) # 配置Match连接私有仓库 match( type: "appstore", # 按需选:appstore/ad-hoc/development git_url: "https://github.com/你的组织/私有证书仓库.git", # 用HTTPS避免SSH密钥问题 git_basic_authorization: Base64.strict_encode64("#{ENV['MATCH_GITHUB_TOKEN']}:"), readonly: true, # 生产构建建议开只读,防止误改证书仓库 force_for_new_devices: false ) end lane :build_appstore do increment_build_number gym( scheme: "你的工程Scheme", export_method: "app-store", output_directory: "./build", output_name: "你的App.ipa" ) upload_to_app_store end
3. 在GitHub Actions workflow里加Keychain处理步骤
运行Fastlane之前,先手动处理Keychain,避免构建中途锁定:
jobs: build-ios: runs-on: macos-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 配置Ruby和Fastlane uses: ruby/setup-ruby@v1 with: ruby-version: '3.2' # 选和你本地兼容的Ruby版本 bundler-cache: true # 缓存Gem依赖,加快构建速度 - name: 安装CocoaPods run: pod install --repo-update - name: 解锁并配置Keychain run: | security unlock-keychain -p "" login.keychain-db security set-keychain-settings -t 3600 -l ~/Library/Keychains/login.keychain-db # 设置1小时超时,防止构建中锁定 - name: 运行Fastlane env: MATCH_GITHUB_TOKEN: ${{ secrets.MATCH_GITHUB_TOKEN }} APP_STORE_CONNECT_API_KEY: ${{ secrets.APP_STORE_CONNECT_API_KEY }} # 上传用API密钥的话需要这个 run: bundle exec fastlane build_appstore
三、解决[CP] Embed Pods Frameworks卡顿的核心办法
卡顿的根本原因是Pod嵌入Framework时需要访问Keychain里的证书,但CI的Keychain被锁了,进程一直在等解锁密码。除了上面的配置,还可以:
1. 统一Pod的签名配置
在Podfile里加这段代码,让Pods不用单独签名,直接用主工程的配置:
post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' config.build_settings['CODE_SIGNING_REQUIRED'] = 'NO' config.build_settings['CODE_SIGNING_IDENTITY'] = '' end end end
2. 禁用Xcode自动签名,用Match的配置
在主工程的Build Settings里,把CODE_SIGN_STYLE设为Manual,PROVISIONING_PROFILE_SPECIFIER设为Match下载的Provisioning Profile名称(Match会自动帮你配置,但要确保setup_ci和Match的顺序是对的)。
3. 验证Keychain状态
在GitHub Actions里加个步骤,确认Keychain已经解锁:
- name: 检查Keychain状态 run: security list-keychains -d user && security show-keychain-info login.keychain-db
如果输出里有locked: no,说明已经解锁;要是显示locked: yes,就得调整解锁命令了。
四、常见坑点排查
- 如果
setup_ci没用,先查CI环境的Keychain名称是不是默认的login.keychain-db,用security list-keychains -d user就能看到当前的Keychain列表。 - Match私有仓库的访问权限:确保
MATCH_GITHUB_TOKEN有仓库的读取权限,用HTTPS URL比SSH更省心,不用处理SSH密钥的问题。 - 全程别搞交互:所有Fastlane命令都用非交互模式,比如Match开
readonly: true,Gym加silent: true之类的,避免CI环境卡住等输入。
内容的提问来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

