使用无人值守的 xcodebuild 管理钥匙串以协同设计 macOS / iOS 应用程序

Posted

技术标签:

【中文标题】使用无人值守的 xcodebuild 管理钥匙串以协同设计 macOS / iOS 应用程序【英文标题】:Manage keychain to codesign macOS / iOS app with xcodebuild unattended 【发布时间】:2019-09-08 03:01:59 【问题描述】:

我需要在每天午夜创建我的 macOS 应用程序的构建版本。我希望它是代码签名的,这样人们就可以使用它而无需费劲。我在午夜睡着了,我太忙了,无法手动执行此操作。我想通过启动代理运行 xcodebuild 并在远离键盘的情况下获得签名的应用程序。但是代码签名总是失败。

失败并出现以下错误:

No signing certificate "Mac Development" found:  No "Mac Development" signing certificate matching team ID "H7V7XYVQ7D" with a private key was found.

在我看的时候它不会失败,这意味着它必须与钥匙串锁定本身有关。不久前我四处尝试解决这个问题,但没有运气:

https://github.com/gnachman/iTerm2/commit/f4082825f3dfa52db08d660ec4821ab6c5bca3f * c https://github.com/gnachman/iTerm2/commit/4cc902449549995d90da1856068e0f56640d55d1 https://github.com/gnachman/iTerm2/commit/b84b5739fb2e0d3f89bade68467831891d31f79f https://github.com/gnachman/iTerm2/commit/29817cbb00d755c247c7071cfac7a6580f7b13b1 https://github.com/gnachman/iTerm2/commit/3f33828b5740a764740c98801ff2d12b21d72e7b https://github.com/gnachman/iTerm2/commit/f4082825f3dfa52db08d660ec4821ab6c5bca3fc

但是没有任何效果。这甚至可能吗?

【问题讨论】:

【参考方案1】:
export tempKeychain=tempKeychain
export identity="iPhone Whatever: Bob Developer(132455334)"

# create new empty keychain
security create-keychain -p "$ADMIN_PASSWORD" "$tempKeychain"

# add keychain to user's keychain search list so they can access it
security list-keychains -d user -s "$tempKeychain" $(security list-keychains -d user | tr -d '"')

# removing relock timeout on keychain
security set-keychain-settings "$tempKeychain"

# import the certs
security import foo.p12 -k "$tempKeychain" -P "$CERT_PASSWORD" -T "/usr/bin/codesign"

# tell os it's ok to access this identity from command line with tools shipped by apple (suppress codesign modal UI)            
security set-key-partition-list -S apple-tool:,apple: -s -k "$ADMIN_PASSWORD" -D "$identity" -t private $tempKeychain

# set default keychain to temp keychain
security default-keychain -d user -s $tempKeychain

# unlock keychain
security unlock-keychain -p $ADMIN_PASSWORD $tempKeychain

# prove we added the code signing identity to the temp keychain
security find-identity -v -p codesigning

# do some codesign stuff

# clean up temp keychain we created
security delete-keychain $tempKeychain

您是否考虑过让 launchd 脚本使用 ssh -o to localhost 来像 CI 服务器(例如 Jenkins)那样运行命令?

【讨论】:

今晚我会试试这个。通过 ssh 这样做有什么好处? 我认为您可能会遇到这样一个事实,即您的 launchctl 会话不是正确的登录会话,因此可能没有使用您认为的钥匙串(因此我打印出可用的钥匙串)当我们通过 Jenkins CI 运行它,我们使用 ssh 连接,我们没有这个问题。 ssh -o 操作有望为您提供具有正确用户上下文的 shell(launchd 没有)。 有效!唯一的问题是我醒来时收到一条警报,说我的钥匙串不存在。我认为这是因为我在完成后使用 rm 删除了 tempKeychain。 你可能应该使用安全删除钥匙串而不是 rm 这样你就不会用空的钥匙串引用污染钥匙串应用程序。 我会试试看的。谢谢你的帮助。我不认为每个人都可以自己解决这个问题。

以上是关于使用无人值守的 xcodebuild 管理钥匙串以协同设计 macOS / iOS 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

COBBLER无人值守安装

Cobbler无人值守安装系统安装与使用

COBBLER无人值守安装

Cobbler无人值守安装

COBBLER无人值守安装

Cobbler无人值守安装