5

[不是下面解释的类似问题的重复]

从 Jenkins 中运行 XCodeBuild 时出现代码签名错误,但它可以从命令行或 Xcode 中构建。

过去有几个人遇到过这个问题,他们的共同主题是 Jenkins 在启动时作为守护程序用户运行,因此尝试访问系统钥匙串。人们应用的解决方案是将凭据复制到系统钥匙串或运行命令来设置要使用的钥匙串。

但是在我的情况下,如果我在活动管理器中查看launchd,则用户显示为我登录到机器的用户,因此Jenkins应该以该用户而不是守护程序用户身份运行。

我尝试通过在运行 XCodeBuild 之前将此命令添加到 Jenkins 脚本来设置要使用的钥匙串

security list-keychains -s /Users/[user]/Library/Keychains/login.keychain

但这并没有解决问题。

我得到的错误是:

Code Sign error: The identity 'iPhone Developer: NNNNN (9TYX5WAM63)' doesn't match any valid, non-expired certificate/private key pair in your keychains"

因此,我尝试将凭据移至系统钥匙串,但现在在 Jenkins 中出现此错误,但从命令行仍然可以:

Code Sign error: Provisioning profile 'F152C66E-B99A-47F6-B262-376CE4403D71' can't be found

此外,当我将凭据移动到系统钥匙串时,我不再能够从 XCOde 中构建 - 我收到与上面最上面的错误消息相同的错误。

我还尝试编辑 org.jenkins-ci.plist 文件以将用户设置为我登录到机器的用户,按照这个,但这也没有效果。

使用 Jenkins/Hudson 作为 iOS 和 Mac 开发的持续集成时,钥匙串中缺少证书和密钥

有什么想法我可以尝试下一步吗?

4

5 回答 5

6

我觉得你上次我们搞砸了这件事,这是一个很大的挑战。我们在为项目设置 CI 服务器时这样做了。如果我没记错的话(大致),我们遵循了以下步骤:

1) 将 Jenkins 设置为 Apple Dev 帐户的开发人员

2) 专门为 Jenkins 创建了一个证书和开发配置文件

3) 在 CI 服务器上设置一个 Jenkins 用户,并从该用户的 xcode 中删除任何以前的 certs/prov 配置文件

4) 将 Jenkins 证书添加到 AD-Hoc Dist 配置文件(如果您尝试将 .ipa 分发到 HockeyApp,则需要将其用于存档构建。)

5) 进入 xcode 项目文件并删除对 Provisioning Profiles 的任何现有引用

6) 下载并安装此用户的证书和相应的 Prov 配置文件。

7) 在构建之前解锁 Jenkins 用户钥匙串。仅当 Jenkins 用户不是运行 xcode 构建的用户时才执行此操作。

以 Jenkins 用户身份登录时,验证 Xcode 在管理器中显示 Prov Profile 是否有效。

我知道我的回答有些含糊,我的意图是提供帮助。这种类型的错误通常是由三件事之一引起的。Xcode 找不到配置文件,Xcode 找不到证书或 Xcode 找到多个配置文件(应该会产生不同的错误,但并非总是如此)并且存在某种不匹配。通常重做 Prov Profiles 是最不痛苦的解决方案。

祝你好运。你会解决它只是一个巨大的头痛!

于 2012-11-28T21:54:57.033 回答
2

可能不是您正在寻找的答案,但由于多种原因我放弃了 XCodeBuild 插件,并通过“执行 Shell”步骤运行我的构建。

您说您的命令行构建有效,因此您已经知道所需的命令。只需将其放入外壳中即可。

xcodebuild -verbose -alltargets -configuration Debug clean build CODE_SIGN_IDENTITY="${CODE_SIGN_IDENTITY}" PROVISIONING_PROFILE=${PROVISIONING_PROFILE}
&&
/usr/bin/xcrun -sdk iphoneos PackageApplication -v "${WORKSPACE}/client_trunk/build/Debug-iphoneos/${Application}.app" -o "${WORKSPACE}/client_trunk/build/Debug-iphoneos/${Application}-Debug-${shortVer}.${revVer}.ipa" --sign "${CODE_SIGN_IDENTITY}" --embed "/Users/[youruser]/Library/MobileDevice/Provisioning Profiles/${PROVISIONING_PROFILE}.mobileprovision"

上面,${CODE_SIGN_IDENTITY}是一个看起来像iPhone Developer: blah
并且${PROVISIONING_PROFILE}是配置文件的十六进制数,如F152C66E-B99A-47F6-B262-376CE4403D71

于 2012-11-29T15:50:08.123 回答
1

按照Xcode 插件主页上的说明进行操作:

如果构建机器上没有显示此提示,您可以通过从构建机器上的终端运行失败的 codesign 命令来强制它出现:/usr/bin/codesign --force --sign "iPhone Distribution: .. ...

以 Jenkins 用户身份从终端执行失败的签名命令并选择“始终允许”

于 2016-07-21T11:20:42.877 回答
0

使用 Jenkins 我得到了这个错误:

/Users/Shared/Jenkins/Home/jobs/ExampleTabbed-Integration/workspace/build/Debug-iphoneos/ExamplesTabbed.app: User interaction is not allowed.

命令 /usr/bin/codedesign 失败,退出代码为 1

我通过执行以下操作来修复它:

  • 在 XCode(jenkins 插件)步骤之前添加 Build Step
  • 添加以下内容作为执行命令:

    security unlock-keychain -p "passwordhere" ${HOME}/Library/Keychains/login.keychain

  • 在 XCode(通过插件)配置中,我使用以下内容:

    • 解锁钥匙串?(未选中)
    • 钥匙串路径:${HOME}/Library/Keychains/login.keychain
    • 钥匙串密码:(空)

可能可以删除前置步骤并使用实际的 xcode 配置来执行此操作,但它的工作方式与描述的一样,没有问题。

请注意,这还没有考虑使用更安全的解决方案,但这是我对 xcode 签名问题的解决方案。我正在使用 Jenkins 安装程序在 OSX 上运行,并作为默认 Jenkins 安装程序应用程序使用的 launchctl 命令运行。如果这有帮助。

于 2013-04-18T20:19:08.237 回答
0

Java/Jenkins 的子进程需要解锁对钥匙串的访问权限。

假设您的构建/代码签名/发布过程运行良好。唯一的阻碍是当您尝试在 Jenkins 中运行完全相同的进程时。

很可能钥匙串被锁定,不是为了用户,而是为了 Jenkins 子进程。

解锁钥匙串的安全命令需要作为 Jenkins 作业运行一次。即使同一个登录用户已经解锁了终端中的钥匙串。

因此,在 Jenkins 中设置一个简单的自由式作业,并添加以下 shell 命令作为构建阶段。

security unlock-keychain -p $PASSWORD /Users/$MACOS_USER/Library/Keychains/login.keychain-db

$PASSWORD作为 Jenkins 作业的输入参数提供。

$MACOS_USERMac 钥匙串所有者的 macos 用户名。

运行此作业后,从钥匙串提示中选择“始终允许”。现在,尝试您的常规构建/发布工作,它应该可以工作。假设您在登录钥匙串中拥有所有必需的证书。

永远不要将密码硬编码到配置/作业/代码等中。

于 2018-07-10T02:32:34.697 回答