从分叉终端运行xcodebuild

Yan*_*eri 58 iphone xcode xcodebuild

我正在尝试为iPhone应用程序设置自动构建服务器.我希望能够安装夜间adhoc测试版,以便测试人员可以跟踪开发.

我已成功设置xcode xcode来执行adhoc构建,我也可以从命令行启动构建:

xcodebuild -configuration AdHoc -sdk iphoneos2.2干净的构建

我遇到的问题是,以下行无法从分叉终端(使用nohup或屏幕)工作,并且失败并出现以下情况

CodeSign错误:代码签名标识'iPhone Distribution:XXXXX'与您的钥匙串中的任何代码签名证书都不匹配.添加到钥匙串后,触摸文件或清理项目以继续.

我在我的shell和nohup或屏幕中检查了我的环境变量,但没有找到线索.我想我的问题是分叉终端无法访问钥匙串,但我不知道如何允许它.

谢谢你的帮助

Yan*_*eri 91

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

security unlock-keychain /Users/yannooo/Library/Keychains/login.keychain
Run Code Online (Sandbox Code Playgroud)

我也尝试将我的证书放在系统的钥匙串中,它正在运行.我的最终解决方案是使用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 
Run Code Online (Sandbox Code Playgroud)

  • 这是我打算做的,但是它太长了,不适合评论.并且AFAIK评论无法格式化. (3认同)

mar*_*hiz 29

这有两个(可能是三个!)组件.一个是钥匙串必须解锁.其次,在钥匙串内部有一个访问控制列表,用于告知处于解锁状态的应用程序的权限.因此,即使您已成功解锁了钥匙串,如果未获得访问私钥并与其签名的能力,/usr/bin/codesign您仍会收到此消息.最后,如果您使用的是Mac OS Sierra,则分配给密钥的默认分区ID不正确,以便与codesign二进制文件兼容.

解决方案如下:

1)如果您可以访问Keychain Access GUI,则可以通过右键单击私钥,选择"访问控制"选项卡,然后选择"允许所有应用程序",手动授予每个程序或/ usr/bin/codesign访问权限.访问此项"广播或"始终允许这些应用程序访问"列表.

2)如果您遇到此错误,则可能是您尝试codesign为非登录用户运行.在这种情况下,您显然无法访问"Keychain Access"GUI.对于这些情况,您验证sign应用程序缺少授权<null>,这显然意味着所有应用程序,或者特别是/usr/bin/codesign通过使用:

security dump-keychain -i login.keychain
Run Code Online (Sandbox Code Playgroud)

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

security import login.keychain -P "<password>" -T /usr/bin/codesign
Run Code Online (Sandbox Code Playgroud)

在哪里-T指定

-T  Specify an application which may access the imported key (multiple -T options are allowed)
Run Code Online (Sandbox Code Playgroud)

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

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

注意:该工具apple-tool会插入分区security,因此上面的命令会保留该分区.有关此方面的更多信息,请参阅:http://www.openradar.me/28524119


Mic*_*ant 11

另一种方案:

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


小智 9

您是否可以security list-keychains -s ${HOME}/Library/Keychains/login.keychain在构建过程中使用将登录密钥链显式添加到搜索列表中?从分叉终端看来,构建过程看不到您的用户密钥链.如果钥匙串搜索列表基于您当前的安全会话,这可能是有意义的 - 分叉的终端会话将使登录会话就像您ssh通过环回连接一样.


Fur*_*afa 6

好吧,问题对我来说是两件事,第一件事就是打开钥匙扣;

security unlock-keychain login.keychain
Run Code Online (Sandbox Code Playgroud)

第二个是(空)密码,

security import blahblahbackup.p12 -k login.keychain -T /usr/bin/codesign -P ""
Run Code Online (Sandbox Code Playgroud)

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

  • 设置pubkey ssh登录(从想要调用构建脚本的用户,到具有证书并将运行xcodebuild的实际用户)在我的情况下,它是同一个用户.Apache正在工作,someuser并且建立了构建的所有内容someuser.
  • 我的php脚本(用于触发构建)正在调用〜/ build-script.我改变了这样:

    ssh someuser @ localhost~/build-script

所以它在一个真正的tty工作,所有的钥匙串都可以访问,一切正常.


Ber*_*ier 6

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

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

<key>SessionCreate</key>
<true />
Run Code Online (Sandbox Code Playgroud)

所以整个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>
Run Code Online (Sandbox Code Playgroud)

我和上面的很多人都有同样的问题.特别是我从Jenkins shell脚本运行时遇到的问题我得到了相同的****不允许用户交互**错误.从ssh shell运行时,我的脚本运行正常.

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

$ security list-keychain
  "/Library/Keychains/System.keychain"
  "/Library/Keychains/System.keychain"
Run Code Online (Sandbox Code Playgroud)

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

$ security list-keychain
    "/Users/<i>user_account_name</i>/Library/Keychains/login.keychain"
    "/Library/Keychains/System.keychain"
Run Code Online (Sandbox Code Playgroud)

并且大多数人将在用户帐户钥匙串中拥有所有密钥/证书等.像一些人建议的那样,很容易建立一个与用户密钥链不同的新密钥链,并为你的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"
Run Code Online (Sandbox Code Playgroud)

......神奇的事情开始在詹金斯建造.哇...这对我来说大约需要4个小时.叹.


Yan*_*eri 2

我查看了安全命令,看来分配给我的终端的钥匙串在分叉时并不相同。如果我在终端中启动安全命令,我有:

$ security list-keychains
  "/Users/yannooo/Library/Keychains/login.keychain"
  "/Library/Keychains/System.keychain"
Run Code Online (Sandbox Code Playgroud)

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

$ security list-keychains
    "/Library/Keychains/System.keychain"
    "/Library/Keychains/System.keychain"
Run Code Online (Sandbox Code Playgroud)

由于我的构建证书存储在登录钥匙串中,因此我的代码签名错误看起来很正常。

有谁知道如何将钥匙串分配给终端?我试过这个但没有成功

security login-keychain -s /Users/yannooo/Library/Keychains/login.keychain
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?


归档时间:

查看次数:

47589 次

最近记录:

8 年,7 月 前