【问题标题】:Difference between Xcode and git for resolving swift packagesXcode 和 git 用于解析 swift 包的区别
【发布时间】:2020-03-20 23:06:46
【问题描述】:

所以背景是这样的:我有一个 Xcode 项目,它依赖于一个 swift 包,该包位于 github 上的私有存储库中。当然,这需要密钥才能访问。到目前为止,我已经设法配置 CI,以便我可以通过 ssh 进入实例并git clone swift 包所需的存储库。不幸的是,当 CI 使用 xcbuild 运行它时,它不起作用,我收到以下消息:

static:ios distiller$ xcodebuild -showBuildSettings -workspace ./Project.xcworkspace \
    -scheme App\ Prod
Resolve Package Graph
Fetching git@github.com:company-uk/ProjectDependency.git
xcodebuild: error: Could not resolve package dependencies:
  Authentication failed because the credentials were rejected

相比之下,git clone 会很高兴地获取这个 repo,如下所示:

static:ios distiller$ git clone git@github.com:company-uk/ProjectDependency.git
Cloning into 'ProjectDependency'...
Warning: Permanently added the RSA host key for IP address '11.22.33.44' to the list of known hosts.
remote: Enumerating objects: 263, done.
remote: Counting objects: 100% (263/263), done.
remote: Compressing objects: 100% (171/171), done.
remote: Total 1335 (delta 165), reused 174 (delta 86), pack-reused 1072
Receiving objects: 100% (1335/1335), 1.11 MiB | 5.67 MiB/s, done.
Resolving deltas: 100% (681/681), done.

关于更多上下文,这是在 CircleCI 上运行的,在 GitHub 上使用 Deploy 密钥设置,该密钥已添加到 CI 上的 Job。

任何关于 Xcode 尝试获取依赖项的方式和 vanilla git 的方式之间可能有什么不同的建议都会很棒。谢谢。

【问题讨论】:

  • 我目前在 GitHub Actions 上遇到与我的 CI 相同的问题
  • 不是一个答案,但有时在过去(尤其是 Xcode 10),git 身份验证详细信息有无缘无故消失的趋势(在启动时正常,然后噗)。 Xcode 11 解决了这个问题。

标签: swift xcode git circleci swift-package-manager


【解决方案1】:

对于无法登录 GitHub 或其他存储库主机的 CI 管道,这是我发现的解决方案,它绕过了 Xcode 对私有 Swift 包的限制/错误。

对私有依赖项使用 https url,因为 ssh 配置当前被 xcodebuild 忽略,即使文档另有说明。

一旦您可以使用 https 在本地构建,请转到您的存储库主机并创建个人访问令牌 (PAT)。有关 GitHub 的说明,请参见 here

使用您的 CI 系统将此 PAT 添加为秘密环境变量。在下面的脚本中,它被称为GITHUB_PAT

然后在您的 CI 管道中运行 xcodebuild 之前确保您运行此 bash 脚本的适当修改版本:

for FILE in $(grep -Ril "https://github.com/[org_name]" .); do
    sed -i '' "s/https:\/\/github.com\/[org_name]/https:\/\/${GITHUB_PAT}@github.com\/[org_name]/g" ${FILE}
done

此脚本将查找所有 https 引用并将 PAT 注入其中,以便无需密码即可使用。

别忘了:

  • [org_name] 替换为您的组织名称。
  • 如果命名不同,请将 ${GITHUB_PAT} 替换为 CI 机密的名称。
  • 配置grep 命令以忽略您不想被脚本修改的任何路径。

【讨论】:

  • 是的是的!当什么都没做时,这对我有用! 2天解决这个问题!也许 Xcode 与 SSH 一起工作只是时间问题,但现在必须完成这个解决方法。
  • 先生,我感激不尽。这真是太棒了!
  • 我的 bash 脚本有问题,sed 会报告错误“没有这样的文件或目录”,并且我的 CI 工具 (VS AppCenter) 将无法构建。所以我添加了对FILE 的检查,如果不存在就不要执行sed 命令。
【解决方案2】:

这似乎是带有 SSH 的 Xcode 11 中的一个错误。切换到 HTTPS 来解决 Swift 包解决了这个问题:

所以从这里:

E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = "git@github.com:company-uk/ProjectDependency.git";
        requirement = {
                branch = "debug";
                kind = branch;
        };
};

到:

E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = "https://github.com/company-uk/ProjectDependency.git";
        requirement = {
                branch = "debug";
                kind = branch;
        };
};

此外,现在 Xcode 12 已经发布,您可以在已修复的地方使用它。

【讨论】:

  • 这适用于本地构建,但不适用于无法将 Xcode 登录到任何东西的 CI 机器。这总是会导致 Xcode 出现以下错误:xcodebuild:错误:无法解析包依赖项:身份验证失败,因为没有提供凭据。我的经验是,如果您的 ssh 密钥在 ~/.ssh 和 GitHub 中正确配置,则 SSH 版本可以工作。只要你也在 Xcode 中登录了 GitHub。
  • 这在 CI 上对我有用;我直到星期一才在办公室,所以无法调查如何,但它肯定在做这项工作。
  • @ratbum 你是如何配置你的 CI 以便 xcodebuild 可以检查这个依赖关系的?您必须以某种方式告诉 xcodebuild 使用哪些凭据
【解决方案3】:

为了获得与 GitHub 操作一起使用的私有 swift 包,我必须添加以下内容:

  1. 我必须将 SSH 密钥添加到我的秘密中
  2. 在 xcodebuild 步骤中,我必须添加标志:-usePackageSupportBuiltinSCM
  3. 在执行 xcodebuild 步骤之前,我必须添加以下运行脚本:
 - name: Add CI SSH Key
   run: ssh-add - <<< "${{ secrets.YOUR_SECRET_SSH_KEY }}"

【讨论】:

  • 您好!您是否知道如何在 fastlane 中使用 -usePackageSupportBuiltinSCM?似乎在触发时,有一个使用xcodebuild 的SPM 依赖关系解析阶段,但它忽略了Fastfile 中设置的任何xcargsxcodebuild -resolvePackageDependencies -workspace ./App.xcworkspace -scheme App
  • @D6mi 与 fastlane 和 usePackageSupportBuiltinSCM 相同点,你解决了吗?
  • @kikeenrique,我确实解决了这个问题,但我真的不记得如何了。我检查了我的 fastlane 配置文件,这是一个简单的 build_app 调用:/
  • @D6mi 谢谢!我在文档“use_system_scm”中看到,名称不同,但看起来很像。
【解决方案4】:

您可以在 Xcode 12 的 CI 环境中通过将您的 GitHub 帐户添加到 Xcode 中的帐户来解决此问题。

使用您的 GitHub 帐户名和您在 Github 上创建的个人访问令牌登录。

我们将 Jenkins 与 Fastlane 工具一起使用,当调用 xcodebuild 时,它将使用访问令牌通过 HTTPS 对存储库进行身份验证。

【讨论】:

    【解决方案5】:

    我遇到了同样的问题,根本原因是:默认的 github ssh 密钥类型是 ed25519 ssh-keygen -t ed25519 -C "your_email@example.com"

    但是 XCode 不支持 ed25519。更改为 RSA 密钥工作:ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

    https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

    XCode下可以看到错误Preference &gt; Accounts &gt; Github

    【讨论】:

      猜你喜欢
      • 2017-07-17
      • 1970-01-01
      • 2018-08-01
      • 2020-04-04
      • 2021-02-05
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      相关资源
      最近更新 更多