使用Swift的iOS项目中的持续集成环境变量

在今天的文章中,我们将讨论一个非常常见的问题,我们iOS开发人员有时必须在我们的开发工作流程中处理这个问题。 问题是如何存储应用程序生产API密钥,以存储我们使用的服务,开发,测试或生产服务器URL以及其他可能过于敏感而无法通过代码添加到我们的存储库中的数据。

以及如何分隔持续集成管道以使用不同的API密钥,访问密钥,服务API地址或任何敏感数据进行生产,测试或开发构建。

有任何方法可以解决该问题。 包括在这篇名为Xcode中的Secret变量和CI的惊人文章中描述的内容,以获取乐趣和收益 由出色的Flawless App团队所带来的灵感之一,实际上是这个项目的灵感之一。这个小项目叫做Swift Variable Injector

另外,当我进行研究时,有人问我相同的问题的另一个思路是这样做的。

我们将在下面显示的示例方法与[1]中描述的方法非常相似,该方法使用Sourcery和代码生成基于环境变量值创建快速文件,并将其插入到Continuous Integration流水线中的项目中。

现在,我们将演示一个示例,说明如何使用Swift变量注入器执行文字值替换,将环境变量值注入到Continuous Integration Pipeline中的Swift代码中。

所以…… 开始吧

首先,创建我们的项目,让我们定义用于处理环境变量和Continuous Integrations值的类。

注意 :这些Xcode环境变量参数在启动时而不是在编译时传递给Process(App)。 这意味着您将使用这些参数启动该过程,仅当使用Xcode运行该项目时,您才具有这些值。 通常仅对开发有用。 如果您希望能够在不使用Xcode的情况下启动已部署的版本,则可以将CI类从var模式替换为键值。 但是重要的是,在提交和推送它时,不要让它静态定义。 :))

CI.swift类声明在连续积分的变量注入器步骤中要替换的变量。

注意:重要的是文字值与格式$(ENV_VAR_NAME)匹配。

在持续集成方面,我们必须定义一个环境变量,并在每个工作流程(生产,测试等)中为其指定值。

我将使用Bitrise服务在此处演示步骤。 但是,大多数CI服务都提供了所需的所有功能。

在这里,我们基本上为每个工作流程定义环境变量。 因此,例如,如果我们有一个生产工作流程和一个Beta测试工作流程,则可以在两者上定义键,但要使用不同的值。

在为每个工作流程定义变量或秘密之后。 现在,我们可以在构建步骤之前添加变量注入步骤。

您可以通过两种方式执行此操作:

使用shell脚本

您可以在构建之前定义一个步骤,以运行以下脚本来安装和运行变量注入器:

  #安装 
  CURRENT_DIR =“ $ PWD” 
cd / tmp
  curl -OL https://github.com/LucianoPAlmeida/variable-injector/releases/download/0.2.1/x86_64-apple-macosx.zip 
 解压缩x86_64-apple-macosx.zip 
cp -f ./x86_64-apple-macosx/release/variable-injector / usr / local / bin / variable-injector
rm ./x86_64-apple-macosx.zip
rm -rf ./x86_64-apple-macosx
rm -rf ./__MACOSX/
cd“ $ CURRENT_DIR”
  #跑步 
 变量注入器--file $ {SRCROOT} /Folder/CI.swift --verbose 

或者,您可以在项目存储库上下载并运行install-binary.sh文件。

您也可以使用cmake安装它 fd。 只需安装cmake ,克隆仓库并运行`make install`。

  #安装cmake 
酿造安装cmake
  #克隆仓库 
git clone https://github.com/LucianoPAlmeida/variable-injector.git
  #安装 
cd可变喷射器
进行安装
  #跑步 
 变量注入器--file $ {SRCROOT} /Folder/CI.swift --verbose 

您只需要传递一个或多个您要替换变量的文件,本例中为CI.swift。 以及可选的详细模式标志。

注意:详细模式将在日志上打印环境变量的值。 因此,您可能要小心并仅将其用于调试porpuses。

因此,在运行该步骤之后,现在文件如下所示

您可以找到Swift变量注入器步骤 在您的工作流程中添加步骤时,可以使用bitrise。

将注入添加为运行脚本构建阶段

我们注入变量的另一种方法是只安装Swift变量注入器,并在构建阶段添加用于替换变量的脚本调用。

重要:在“编译源”阶段之前添加此“运行脚本”阶段非常重要。 因此变量将被替换,然后进行编译:))

这样,我们可以在本地计算机上将开发密钥设置为环境变量,并使用它们代替之前解释的Xcode环境变量。 您的CI步骤唯一要做的就是设置变量并在构建之前安装Swift Variable Injector。 这似乎是一种更简单的方法,让替换成为项目的一部分,而不是CI步骤。 我相信这是一个好方法,因为我们不依赖于使用Xcode启动时才起作用的启动参数。

您可以找到此脚本,以复制到项目仓库的自述文件部分中,在构建阶段中使用运行脚本。

注意:请记住,可变注入器进程是由Xcode在构建阶段而不是在终端上启动的,因此〜/ .bash_profile上的变量对GUI或CLI进程不可见。 因此,请确保在lauchctl上设置这些变量,然后重新启动Xcode进程。

有关此线程上macOS上的进程正在加载环境变量的更多信息。

因此,这些值已注入到我们的快速文件中……

之后,由变量注入器使用环境变量值编辑源,然后我们就可以继续进行正常的持续集成和持续交付过程。

结论

这只是解决我们iOS开发人员所遇到的常见问题的另一种方法。 它就像我们之前提到的其他方法一样简单,并且使Android人员拥有Gradle在构建时获取系统环境变量的功能变得如此简单。
那是一个实验项目,也许在处理过程中可能会遇到一些极端情况。 但是,我相信主要的问题可以通过这些步骤解决。

这就是本文的全部,希望您喜欢🙂

如果我有问题或您有任何意见或疑问,请告诉我。 我很高兴收到您的反馈feedback

您可以在Twitter上@ LucianoPassos11找到我。

感谢您阅读🙂

参考文献

  1. Xcode和CI中的秘密变量可为您带来乐趣和收益。 https://medium.com/flawless-app-stories/secret-variables-in-xcode-and-your-ci-for-fun-and-profit-d387a50475d7
  2. 苹果开源项目SwiftSyntax。 https://github.com/apple/swift-syntax
  3. Bitrise.io文档。 https://github.com/bitrise-io