从分叉terminal运行xcodebuild

我正在尝试为iPhone应用程序设置一个自动构build服务器。 我希望能够每晚进行adhoctesting版本的构build,以便testing人员能够跟踪开发情况。

我已经成功地将xcode设置为xcode来执行adhoc构build,我也可以从命令行启动构build:

xcodebuild -configuration AdHoc -sdk iphone2.4 clean build

我遇到的问题是,下面的行不能从分叉terminal(使用nohup或屏幕)和失败,以下

CodeSign错误:代码签名身份的“iPhone分发:XXXXX”与您的钥匙串中的任何代码签名证书不匹配。 一旦添加到钥匙串,触摸文件或清理项目继续。

我已经检查我的环境variables在我的shell和nohup或屏幕,并没有发现一个线索。 我想我的问题是分叉的terminal不能访问钥匙串,但我不知道如何允许它。

谢谢你的帮助

我有错误用户交互是不允许的 ,解决它首先解锁钥匙串

security unlock-keychain /Users/yannooo/Library/Keychains/login.keychain 

我也试图把我的证书在系统的钥匙链,它正在工作。 我最终的解决scheme是使用Keychain Access应用程序将所有iPhone相关的证书放在名为iPhone.keychain的专用钥匙串中

 security list-keychains -s /Users/yannooo/Library/Keychains/iPhone.keychain security unlock-keychain -p keychainpassword /Users/yannooo/Library/Keychains/iPhone.keychain 

有两个(可能是三个!)组件。 一个是钥匙扣必须解锁。 其次,钥匙串内部有一个访问控制列表,告诉哪些权限被授予处于解锁状态的应用程序。 所以,即使您已经成功解锁了钥匙串,如果访问私钥并签名的能力没有被赋予/usr/bin/codesign那么您仍然会收到此消息。 最后,如果您使用的是Mac OS Sierra,则为了与代码化二进制文件兼容,分配给密钥的默认分区ID不正确。

解决scheme如下:

1)如果您有权访问Keychain Access GUI,则可以通过右键单击您的私钥手动授予每个程序或/ usr / bin / codesign访问权限,select“访问控制”选项卡,然后select“允许所有应用程序访问这个项目“收音机或”总是允许访问这些应用程序“列表。

2)如果遇到这个错误,你可能试图为非login用户运行密码。 在这种情况下,您显然无法访问“钥匙串访问”GUI。 对于这些情况,您可以通过使用以下命令来validation应用程序<null>缺less的sign授权,这显然意味着所有应用程序或特定的/usr/bin/codesign

 security dump-keychain -i login.keychain 

但是,由于某种原因,您不能在交互模式下添加或修改访问控制属性 – 只能删除! 您实际上必须手动删除密钥并将其重新添加到指定-T标志的密钥链中。

 security import login.keychain -P "<password>" -T /usr/bin/codesign 

其中-T指定

 -T Specify an application which may access the imported key (multiple -T options are allowed) 

3)如果您在Mac OS Sierra上,请修改分区ID以包含apple分区。 据推测,这是分配给codesign的命名空间,因为它是由苹果发布的。

security set-key-partition-list -S apple-tool:,apple: -k "<password>" login.keychain

:由security工具插入的apple-tool分区,所以上面的命令保留该分区。 有关这方面的更多信息,请参阅: http : //www.openradar.me/28524119

另一个scheme

  • 打开钥匙串访问
  • 右键点击私钥
  • select“获取信息”
  • select“访问控制”选项卡
  • 点击“允许所有应用程序访问此项目”
  • 点击“保存更改”
  • input您的密码
  • 请享用

你可以在构build过程中使用security list-keychains -s ${HOME}/Library/Keychains/login.keychain明确地将您的login钥匙串添加到search列表中吗? 这似乎是从分叉terminal,构build过程不会看到您的用户钥匙串。 如果钥匙串search列表是基于您当前的安全会话,这可能是有道理的 – 分叉的terminal会话将离开login会话,就像您通过环回连接ssh

好的,这个问题对我来说是两件事情,一是解锁钥匙扣;

 security unlock-keychain login.keychain 

其次是(空)密码,

 security import blahblahbackup.p12 -k login.keychain -T /usr/bin/codesign -P "" 

更新:稍后有一个小问题,当脚本从Web脚本或某事触发。 像那样。 它只是看到/Library/Keychains/System.chain。 所以我发现一个肮脏的解决方法(这可能会导致安全问题,但对我来说);

  • 设置pubkey sshlogin(从想要调用构build脚本的用户,到具有证书的实际用户并将运行xcodebuild)在我的情况下,它是相同的用户。 Apache正在以someuser身份工作,而构build的所有东西都是在someuser设置的
  • 和我的PHP脚本(用于触发构build)正在调用〜/ build-script。 我改变了这样的:

    ssh someuser @ localhost〜/ build-script

所以它在一个真正的tty中工作,并且所有钥匙串都是可访问的,一切工作正常。

更新了与​​Jenkins遇到类似问题的人:

如果您将Mac设置为通过LaunchDaemons启动jenkins,则需要确保添加

 <key>SessionCreate</key> <true /> 

所以整个ci.plist将如下所示:

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>Jenkins</string> <key>UserName</key> <string>user</string> <key>GroupName</key> <string>staff</string> <key>ProgramArguments</key> <array> <string>/usr/bin/java</string> <string>-Xmx512m</string> <string>-jar</string> <string>/path/to/jenkins/jenkins.war</string> </array> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> <key>EnvironmentVariables</key> <dict> <key>JENKINS_HOME</key> <string>/path/to/jenkins/home</string> </dict> <key>SessionCreate</key> <true /> </dict> </plist> 

我一直被困在同样的问题上面有很多人。 具体来说,我遇到了从Jenkins shell脚本运行时遇到的问题我得到了相同的**用户交互不允许**错误。 从ssh shell运行时,我的脚本工作正常。

大多数人也看到的区别是,如果你运行安全列表 – 钥匙串,你会得到:

 $ security list-keychain "/Library/Keychains/System.keychain" "/Library/Keychains/System.keychain" 

但是当在ssh shell中运行时,我会得到:

 $ security list-keychain "/Users/<i>user_account_name</i>/Library/Keychains/login.keychain" "/Library/Keychains/System.keychain" 

而且大多数人会在用户账户钥匙串中拥有所有的钥匙/证书等。 就像有些人认为,制作一个与用户密钥链截然不同的新的密钥链很容易,然后把它放在你的XCode签名的东西上。 我最终把我的这里:/Library/Keychains/sysiphone.keychain

我认为问题是我的设置(也可能是你的设置),你运行在不同的安全性偏好域(系统或用户)。 最后 – 这是我如何让我的sysiphone.keychain出现:

 $ sudo security list-keychains -d system -s "/Library/Keychains/sysiphone.keychain" Password: ***** $ security list-keychains -d system "/Library/Keychains/sysiphone.keychain" 

…神奇的事情开始build立在jenkins。 哇…这是大约4个小时对我来说。 叹。

另一张海报说,

 security list-keychains -s "~/Library/Keychains/login.keychain" 

但是我认为你只有在login后才能访问login.keychain,在GUI环境下(我刚刚通过SSH和屏幕在系统上testing过,但是我也碰巧通过VNClogin)。

显然可以使用launchctl来selectGUI上下文并运行程序,但是我怀疑它也只适用于“login用户”。

如果你尝试' security show-keychain-info keychain-file ',那么你会得到以下错误:

用户交互是不允许的

这是一个短语来search一些更多的信息。 另一种解决scheme是将证书放入您的系统钥匙串中!

我看过安全命令,看起来分配给我的terminal的钥匙链在分叉时是不一样的。 如果我在terminal上启动安全命令,我有:

 $ security list-keychains "/Users/yannooo/Library/Keychains/login.keychain" "/Library/Keychains/System.keychain" 

而当使用屏幕我有以下输出:

 $ security list-keychains "/Library/Keychains/System.keychain" "/Library/Keychains/System.keychain" 

由于我的构build证书存储在login钥匙串中,所以代码符号错误我看起来很正常。

有谁知道我可以如何将钥匙串分配给terminal? 我试过这个没有成功

 security login-keychain -s /Users/yannooo/Library/Keychains/login.keychain 

有任何想法吗?

我正在使用Atlassian Bamboo 2.7和OS X 10.7.3 Lion,我已经尝试了在线程中find的每种方法,但是我仍然遇到“用户交互不允许”错误。

问题是,在一个远程terminal会话(如“超级用户”,如Bamboo或另一个自动生成系统的情况下),需要解锁的包含签名证书的钥匙串与正常情况下看到的不同正如Yann在这里所表明的那样)当你不是超级用户的时候。

最终为我工作的是做以下事情:

  1. 请按照此处所述以系统pipe理员身份login
  2. 创build仅签名钥匙串(例如, ios.keychain
  3. 添加签名证书(连同WWDRCA证书)

通过在terminal上运行security list-keychains来validation它。 您应该在列表中看到ios.keychain。 ( sudo security list-keychains不会显示相同的东西):

 sh-3.2# security list-keychains "/private/var/root/Library/Keychains/login.keychain" "/Library/Keychains/ios.keychain" "/Library/Keychains/System.keychain" 

我发现在执行unlock-keychain命令之前,您仍然必须将ios.keychain添加到您的search范围中。 在您的构build脚本中,运行以下行:

 KEYCHAIN=/Library/Keychains/ios.keychain # the -s option adds $KEYCHAIN to the search scope, while the -d option adds $KEYCHAIN to the system domain; both are needed security -v list-keychains -d system -s $KEYCHAIN security -v unlock-keychain -p bambooiphone $KEYCHAIN 

解锁login钥匙串不适用于我。 使用Keychain Access创build一个独立的钥匙串(称为iOS),然后将这些命令添加到构build中(当以自己的用户身份运行Jenkins时)确实有效:

security -v list-keychains -d system -s〜/ Library / Keychains / iOS.keychain; security -v unlock-keychain -p password〜/ Library / Keychains / iOS.keychain;

这看起来更有希望,但: https : //wiki.jenkins-ci.org/display/JENKINS/Xcode+Plugin#XcodePlugin-Userinteractionisnotallowed

如果您正在运行security list-keychains并且看到您的自定义钥匙串出现在列表中,但仍然不起作用,那么您可能会遇到我遇到的问题,即钥匙串从search中按顺序检查列表,因为我没有在我的SSH会话中解锁login.keychain ,所以它会在那里失败,而不是移动到列表中的下一个钥匙串,这是我想解锁的自定义钥匙串。

将search列表设置为您使用security unlock-keychain解锁的自定义钥匙security unlock-keychain 。 从Yann的回答中使用这种方法也将从search列表中删除您的login.keychain。

要保存login.keychain:

 security list-keychains -s ~/Library/Keychains/custom.keychain ~/Library/Keychains/login.keychain 

这样,当在机器上使用GUI会话时,您仍然可以访问login.keychain项目,但是代码签名将首先检查自定义钥匙串,如果您已解锁,则会成功。

如果您以root身份执行xcodebuild(您是sudo时),则需要以root用户身份login,并将签名证书放在root的钥匙串中。 然后用上面的安全解锁钥匙链。

我做了:

  • 从列表中删除login.keychain

  • $HOME/Library/Keychains/

  • 将其添加到钥匙串列表(我没有指定任何特定的域)

  • 将其设置为默认值

  • 调用它的security unlock-keychain

  • 添加全局签名证书(WWDRCA)

  • 导入私钥以及开发和分发证书

如果有login.keychain ,我仍然得到“用户交互不允许”的错误。 因此删除login.keychain使用security delete-keychain终于帮助!