返回博客主页
← 所有文章

将 NativeScript 云构建迁移到 Circle CI

2020 年 5 月 12 日 — 作者:Rosen Vladimirov

近几个月来,我们重新评估了我们的云构建产品和用户对其的需求。结果表明,有很多功能缺失,人们经常在需要控制环境或云操作出现问题的情况下遇到困难。每种情况都是独特的,但由于 NativeScript 云构建的架构,我们无法提供客户应得的体验。

我们研究了各种填补客户需求与我们当前架构之间差距的方案。我们得出的结论是,我们需要一个全新的解决方案。我们一直在努力提供它,并且已经推出了它 - 使用 Circle CI 的云构建。您可以在 Dimitar Tachev 的这篇精彩博客文章 中了解更多有关该解决方案的信息。

新解决方案在以下方面提供了更好的体验

  • 环境控制
  • CI 集成(新解决方案允许为每个 PR 轻松设置 CI,这在现有云构建中几乎是不可能的)
  • 在云中解决问题和调试问题
  • 云提供商的可扩展性 - 插件可以调整为使用不同的云提供商,甚至可以使用本地机器

重要提示:由于我们在拥有更好的解决方案的情况下,没有看到保留现有云构建解决方案的任何好处,因此我们决定停止使用现有的 NativeScript 云构建。停止将从 2020 年 5 月 31 日起对所有云构建生效。

这对您和您的应用程序意味着什么

现有的 NativeScript 云构建将在 2020 年 5 月 31 日起停止使用。

我们鼓励大家在截止日期之前迁移到新解决方案!

如何迁移

下面我们将尝试详细说明如何将现有应用程序迁移到使用 nativescript-remote-builds 插件而不是 NativeScript 云构建进行构建。

系统要求

在开始之前,请确保您已安装下面列出的所有组件,并且它们可以在您的命令行中访问

  • OpenSSL - 在命令行中尝试 openssl
  • Ruby - 在命令行中执行 ruby -v 以确保它可以访问
  • Git - 在命令行中执行 git --version 以确保它可以访问
  • Fastlane - 安装 Ruby 后,只需执行 gem install fastlane(您需要 2.144 或更高版本)

准备 iOS 代码签名

如果您要为 Android 构建,只需转到 迁移应用程序

当前 NativeScript 云构建的设置要求您拥有有效的付费 Apple 开发者帐户和已生成的证书和配置文件对。

nativescript-remote-builds 插件在幕后与 fastlane 协同工作,并依赖于 fastlane match 方法进行 iOS 代码签名。在这种方法中,fastlane 管理您的证书和配置文件,并将它们存储在您为此操作提供的私有 GitHub 存储库中。

生成 fastlane match 存储库

  1. 首先,您需要在机器上安装 Ruby。您可以从 这里 获取它。
  2. 之后,您需要 fastlane,只需执行 gem install fastlane
  3. 此时您有两种选择:3.1 如果您有 macOS,我们强烈建议使用命令 fastlane match - 该命令将提示您输入私有存储库以存储自动生成的证书和配置文件、您的 Apple 标识符和密码。3.2 如果您没有 macOS,则必须手动导入构建应用程序所需的证书和配置文件。在这种情况下,使用 fastlane match import 命令。

两种方法将在下面介绍

注意:当 fastlane 询问您私有 match 存储库时,请确保使用 ssh 而不是 https

使用自动代码签名的迁移(推荐方法)

在这种情况下,您不必考虑当前的证书和配置文件。只需在 macOS 上执行此操作

fastlane match

该命令将提示您输入您的 Apple 凭据、用于存储证书的私有存储库和用于保护文件的密码。输入所有信息后,fastlane 将根据您的 Apple 帐户自动导入所有必需的证书,并在构建过程中使用它们。

注意:您只需要在第一次执行 fastlane match 时使用 macOS。之后,您就可以从 Windows、Linux 和 macOS 为 iOS 构建。

使用手动代码签名的迁移(不推荐的方法)

如果您不想使用自动管理配置文件和证书,您可以手动将证书和配置文件导入 match 存储库。为此,您需要 .mobileprovision.p12.cer 文件,这些文件用于构建您的应用程序。

 

详细的分步指南

 

如果您没有有效的 .p12.mobileprovision,您可以使用 NativeScript Sidekick 和 Apple Developer Portal 生成一个。1) 首先您需要生成证书,请按照 本文档 中的步骤操作。2) 之后您需要生成一个移动配置文件 - 只需按照 Apple 指南 操作。

1) 获取与您的 .p12 文件匹配的 .cer 文件

为了使用与现有 NativeScript Cloud 构建相同的证书和配置文件对进行 CircleCI 构建,您还需要 .cer 文件。您可以按照以下步骤获取它

  • 打开 Apple 开发者门户
  • 点击右上角的帐户菜单,使用您的帐户登录
    • (可选)如果您是多个 Apple 开发团队的成员,请确保您已选择要导出证书的团队,该团队位于页面右上角。
    • 在新打开的窗口中,点击 证书、标识符和配置文件 菜单
    • 在新窗口中,确保 证书 在右侧被选中。在左侧,您会找到包含所有证书的列表。找到您要导出的证书,并点击它。
    • 在新窗口的右侧,您会找到下载按钮。点击它,您将获得 .cer 文件。

如果您不确定 Apple Developer Portal 中哪个证书与您的本地 .p12 文件匹配,您可以使用以下命令获取友好名称

openssl pkcs12 -info -in <path to your .p12 certificate>

该命令将提示您输入密码,如果您的证书未受密码保护,您可以直接按 Enter 键。

示例输出为

openssl pkcs12 -info -in ios_development.p12
Enter Import Password:
MAC: sha1, Iteration 1
MAC length: 20, salt length: 8
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
Bag Attributes
    friendlyName: iPhone Developer: John Doe (F34A23801A)
    localKeyID: ...
subject=UID = KHMY4SS8C9, CN = iPhone Developer: John Doe (F34A23801A), OU = A49FBB0MS7, O = Company Name, C = US

issuer=C = US, O = Apple Inc., OU = Apple Worldwide Developer Relations, CN = Apple Worldwide Developer Relations Certification Authority

-----BEGIN CERTIFICATE-----
...

请注意输出中的 friendlyName - 第一个部分 iPhone Developer 显示证书的类型,在本例中为 iOS 开发,第二个部分是证书名称(在本例中为 John Doe)。

在 Apple Developer Portal 中,您可以搜索名为 John Doe、类型为 iOS Development 的证书。如果有多个证书匹配上述条件,您可以尝试通过获取过期日期来确定哪个证书是您的。为此,只需执行以下命令

openssl pkcs12 -in <path to your .p12 certificate> -nodes | openssl x509 -noout -enddate

这将打印您本地证书的过期日期,以便您可以在 Apple Developer Portal 中查看它。

拥有所有 .cer.p12.mobileprovision 文件后,您可以继续执行下一步。

2) 从 .p12 文件中删除密码。

如果您的 .p12 私钥受密码保护,fastlane match 将无法工作,因此您需要删除它。为此,请执行以下操作

  • 这里 下载最新版本的 RemoveP12Password
  • 通过传递您本地 .p12 文件的路径、用于保护它的密码和输出文件(将不含密码)来运行它
RemoveP12Password /Users/vladimirov/my-certificate.p12 123456 /Users/vladimirov/my-certificate-no-pass.p12

3) 将无密码的证书、.cer.mobileprovision 导入您的 match 存储库

fastlane match import

...该命令将询问您 .cer.p12.mobileprovision 文件

请注意:fastlane match import 对移动配置文件中设置的通配符应用程序标识符并不十分有效,因此您必须为导入的每个移动配置文件使用特定的应用程序 ID。fastlane match import 命令在 Windows 上存在一个问题,它要求在安装 fastlane 的驱动器的根目录中有一个 tmp 目录。请创建一个,例如 C:\tmp。在 Windows 上使用 fastlane match import 并且有提示时,请确保将文件拖放到终端中,因为输入可能会被空格或引号符号破坏。

 

 

迁移应用程序

为了迁移应用程序,您必须在应用程序中设置 nativescript-remote-builds 插件。以下是在应用程序中需要执行的基本步骤,更详细的描述和所有支持的方案可以在 插件的 README.md 中找到

1) 在 Circle CI 中创建您的帐户,或使用您的现有帐户登录。

2) 为您的 Circle CI 帐户 生成一个个人访问令牌,并复制其值。

3) 在您的应用程序中安装 nativescript-remote-builds 插件:npm install --save nativescript-remote-builds

4) 在应用程序的根目录中创建 .nsremote.config.json 文件。

5) 在 .nsremote.config.json 中添加 sshRepositoryUrl 属性 - 该存储库与您的应用程序相关联,并且已在 CircleCI 中启用构建

{
    "circleci": {
        "sshRepositoryURL": "{{an SSH GitHub repository url}}"
    }
}

6) 确保您在本地机器上有一个有效的无密码 ssh 密钥,并且与您的 GitHub 帐户相关联。您可以按照 这里的步骤 操作

7) 将您的 ssh 密钥添加到 Circle CI 帐户,如以下图像所示。

注意:在 Circle CI 中设置 ssh 密钥时,您必须填写主机名,确保它为 github.com


8) 在应用程序的根目录中创建 .nsremote.env.json 文件。

9) 在 .nsremote.env.json 配置文件中添加 Circle CI 访问令牌值

{
    "local": {
        "CIRCLE_CI_API_ACCESS_TOKEN": "{{your Circle CI access token generated in step 2}}"
    }
}

10) (iOS 构建需要)将 IOS_SIGNING_REPO_URLIOS_APPLE_IDMATCH_PASSWORD 添加到 .nsremote.env.json 文件中

{
    "local": {
        "CIRCLE_CI_API_ACCESS_TOKEN": "{{your Circle CI access token generated in step 2}}"
    },
    "remote": {
        "IOS_SIGNING_REPO_URL": "{{ssh url to the repository containing your certificates (the fastlane match repository)}}",
        "IOS_APPLE_ID": "{{the email with which you login in the Apple developer portal}}",
        "MATCH_PASSWORD": "{{the password for your fastlane match repository}}"
    }
}

11) 使用以下命令在云中使用 Circle CI 进行构建

tns build ios|android

如果您已连接设备,甚至可以直接运行它

tns run

或者甚至在特定设备/模拟器上调试

tns debug ios|android

每当 NativeScript CLI 需要构建应用程序时,它将在 Circle CI 中进行构建。在构建过程中,您会看到 CLI 的消息

A cloud build has started. Open <url> for more details.

您可以在 Circle CI 中查看 URL,以获取执行的详细信息。

摘要

NativeScript 云构建的新解决方案更加灵活和强大。我们鼓励您尝试它并充分利用它!