Xcode和git之间的区别,用于解决swift软件包


9

所以背景是这样的:我有一个Xcode项目,该项目依赖于github上一个私有存储库中的swift包。当然,这需要访问密钥。到目前为止,我已经成功配置了CI,以便可以ssh进入实例和git cloneswift软件包所需的存储库。不幸的是,当xcbuild像CI一样运行它时,它不起作用,并且我收到以下消息:

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将很高兴地获取此仓库,如下所示:

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尝试获取依赖项的方式与普通git做到这一点之间可能有什么不同的任何建议都很好。谢谢。


我目前在GitHub Actions中遇到与我的CI相同的问题
bscothern

这不是一个答案,但有时在过去(尤其是Xcode 10),git身份验证详细信息会无缘无故地消失(在启动时会出现问题,然后是po声)。Xcode 11解决了这个问题。
亚历克斯

Answers:


5

这似乎是带有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签入任何内容的CI机器。这总是导致Xcode出现此错误:xcodebuild:错误:无法解析程序包依赖项:身份验证失败,因为未提供凭据。我的经验是,如果在〜/ .ssh和GitHub中正确配置了您的ssh密钥,则SSH版本可以工作。只要您还以Xcode登录GitHub。
bscothern

这对我来说是关于CI的工作。我要到周一才去办公室,所以无法调查如何做,但是绝对可以。

3

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

使用https urls作为私有依赖项,因为xcodebuild当前会忽略ssh配置,即使文档中另有说明。

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

在您的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 Secret的名称。
  • 配置grep命令以忽略脚本不想修改的所有路径。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.