我们不使用 Jenkins,但我之前在构建自动化中见过这种情况。我们是这样解决的:
1) 创建您的构建钥匙串。这将包含用于联合签名的私钥/证书:
security create-keychain -p [keychain_password] MyKeychain.keychain
keychain_password 由您决定。稍后您将在构建过程中使用它来解锁钥匙串。
2) 导入您的 CodeSign 身份的私钥 (*.p12):
security import MyPrivateKey.p12 -t agg -k MyKeychain.keychain -P [p12_Password] -A
这里的关键是“-A”标志。这将允许在没有警告的情况下访问钥匙串。这就是您看到“不允许用户交互”错误的原因。如果您尝试通过 Xcode UI 进行此构建,此时它会提示您“允许访问”您的钥匙串。
3)无论您如何保存钥匙串(例如:将其签入源代码管理),请确保您的构建用户可以写入和执行它。
当您准备好构建时,请在运行 xcodebuild 之前添加以下内容:
# Switch keychain
security list-keychains -s "/path/to/MyKeyhain.keychain"
security default-keychain -s "/path/to/MyKeychain.keychain"
security unlock-keychain -p "[keychain_password]" "/path/to/MyKeychain.keychain"
如果您在本地运行,您可能需要在构建脚本末尾添加一些内容以切换回登录钥匙串(~/Library/Keychains/login.keychain),例如:
# Switch back to login keychain
security list-keychains -s "~/Library/Keychains/login.keychain"
security default-keychain -s "~/Library/Keychains/login.keychain"
尝试一下。我们为我们使用的每个身份创建一个单独的钥匙串(我们自己的+代表客户构建)。就我们公司而言,我们同时拥有 AppStore 和 Enterprise 帐户。这可能会导致协同设计时出现命名冲突(例如:两个帐户都解析为“iPhone Distribution:ACME Corporation”)。通过将这些身份保存在单独的钥匙串中,我们可以避免这种冲突。