Xcode和CI中的秘密变量可带来乐趣和收益💌

让我们以一个小小的事实作为本文的开头:

您的代码存储库中永远不应包含任何敏感信息。

没有 例外 。 API密钥,密码,您的电子邮件(包括集成测试之类的内容)。 这确实是不好的做法,但几乎每个人都这样做。 甚至我上班的回购中仍然有电子邮件或其他内容。 这个问题非常普遍,GitHub上有官方指南可以从存储库中删除敏感信息。 GitHub上还有300k +提交仅删除密码(这是无效的,但\\(())_ /¯)。 这个问题如此猖,,有许多著名的开源项目致力于解决这个问题。

既然我们已经概述了问题,那么我们需要设计一个既安全又容易的解决方案。 我认为让“错事难”和“正确事”变得简单同样重要。

这将使开发人员(也就是您和我👋)将秘密密钥用于分析,库,集成测试等。所有这些都不会破坏我们的工作流程(我们仍然希望能够按⌘+ R / B / U,并使用现有的工作流程。)

灵感

事实证明,商业CI提供者已对此问题提供了不错的解决方案(💯为BuddyBuild上令人惊叹的人们提供了思考的💯🙌)

大多数CI提供程序都有一种存储加密变量(buddybuild:和travis)的方法,这些变量是父进程环境变量的一部分。

不过有两个问题:

  • 您如何在本地使用这些🤔?
  • 如何在Xcode中访问环境变量?

为了弄清楚这一点,我查看了我的同事的设置(他们通常使用CLI而不是IDE进行工作)。

他们的本地设置通常涉及一个名为`env-vars.sh`的bash脚本(位于他们的.gitignore中)。 看起来像这样:

太棒了 现在,我们可以在构建阶段添加构建阶段(“运行脚本”)。 注意,您需要在“编译源”步骤之前添加此代码。 这是因为我们需要添加一个新的.swift文件来编译和获取我们的环境脚本(如果存在)并运行Sourcery。

我们需要在项目中添加`.stencil`模板文件,并向Sourcery提供它的父目录,这样它才能发挥作用。

这是脚本(用于⌘+ C’ing):

现在,运行一次⌘+ B,以生成源文件。 (不用担心您的构建是否失败。这是因为我们尚未添加生成的文件)。 它的扩展名为`.genic.swift`。 将其添加到您的项目中,现在您将可以从源代码inside内部访问这些变量。

PS:请注意,您必须在.gitignore中添加`.generation.swift`,以便您的凭据不会意外地出现在您的仓库po中。

现在,您可以无缝地,轻松地使用我们先前声明的`testCreds`结构,而不必担心CI或开发机🎉中的实现细节。 并且您当前的工作流程不受影响(⌘+ R / B / U仍然有效🎊)

感谢您阅读我的文章! 如果您有任何疑问,请随时在Twitter上与我联系(大多数情况下我都是@codeOfRobin)或询问中型评论。

PPS:我将很快与Abheyraj Singh一起研究一些非常酷的东西。 敬请关注!