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上找到我。