CircleCI 2.0和iOS代码签名
没有Fastlane比赛
在TechOps中,我们使用CircleCI来测试和部署iOS应用。 最初的CircleCI 1.0很好,但是他们推出了2.0版,并停止了对1.0版以后的Xcode版本的支持。
当我开始迁移到2.0时,我遇到了以下注意事项:
在CircleCI 2.0上,唯一支持代码签名的方法是使用上述文档中所述的Fastlane Match。
我很惊讶。 你惊喜吗?
我喜欢Fastlane。 这是iOS开发工具发生的一件好事。 但是我不想在CI上使用Match,因为:
- 它需要带有加密证书的单独回购。 好。 但是密码仍然应该存储在CI环境变量设置中。 那么为什么身份不应该呢?
- 依靠互联网连接的不必要步骤
- 这是对Google产品的不可预测的依赖; 我们不知道它将活多久
可以说,如果我们转向Match,那么我们将不再依赖CI提供者。 但是事实并非如此,迁移文档建议使用特殊操作:
尽管其他快速通道操作可以轻松地与一组xcodebuild
命令互换,但“匹配”步骤提供了一种处理签名身份和配置文件的概念,这些概念有时可能会过时。
无论如何,我已经弄清楚了如何在不使用Match的情况下使用代码签名。
解
TL; DR:很难说,但是您必须将证书和配置文件编码为base64表示形式,将其设置为env,然后将其解码回文件。
macOS钥匙串
将证书和私钥导出为p12
文件,设置证书密码。
从Apple Dev Center获取配置文件(使用该身份签名)。
编码文件
在macOS Terminal中,将Certificates.p12编码为base64,然后将结果复制到剪贴板:
$ base64 -i Certificates.p12 | pbcopy
并使用相同的命令来解码.mobileprovision文件。
CircleCI上下文
要在2.0中存储环境值,我们必须使用上下文。 转到组织设置→上下文→资源→添加资源。
添加具有某些名称的变量(例如Certificates
),然后将先前复制的值粘贴到Value字段中。
CircleCI配置YAML
现在,我们需要取回这些文件。
在.circleci/config.yml
使用以下步骤:
现在,我们将证书和个人资料放在正确的位置。
进口证明书
现在,我们需要将签名身份添加到CI钥匙串中,CircleCI上不再存在。
我提到了setup_circle_ci
特殊操作,我们将使用它来创建钥匙串,正如我们从其源代码中知道的那样。 我们必须添加以下before_all
通道:
第4行建立了本地钥匙串。 第5行将证书导入到钥匙串中。 确保设置CERTIFICATE_PASSWORD
CircleCI项目设置中的环境变量。 在第4行之后已经设置了其他变量(第6行和第7行)。
结论
ew。 终于,我们摆脱了下一个错误:
代码签名错误:找不到与“ App Store”匹配的团队“ ABC”的配置文件:Xcode找不到与“ ABC / App Store”匹配的任何配置文件
代码签名错误:SDK'iOS 11.2'中的产品类型'Application'需要代码签名
很难意识到1.0以来的最后一种方法不再起作用,并弥补了所有这些变通办法。 我希望CircleCI团队会尽快推出更好的解决方案。
附注:如果您有任何疑问,请在twitter.com/m4rr上找到我。