【问题标题】:Codesign issue when Jenkins is used使用 Jenkins 时的代码设计问题
【发布时间】:2017-11-20 13:31:48
【问题描述】:

如果我使用 Jenkins Web GUI(直接在 Mac 上运行)构建 iOS(Xamarin.Forms 项目的一部分),我会从控制台输出中得到以下有意义的错误:

未知错误-1=ffffffffffffffff

更详细的日志

[exec] _CodesignNativeLibraries:
[exec]   CodesignNativeLibraries Task
[exec]     AppBundleDir: bin/iPhone/Release/AppiOS.app
[exec]     CodesignAllocate: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate
[exec]     DisableTimestamp: False
[exec]     IntermediateOutputPath: obj/iPhone/Release/codesign
[exec]     Keychain: <null>
[exec]     SigningKey: XXX
[exec]     ExtraArgs: <null>
[exec] _CodesignAppBundle:
[exec]   Codesign Task
[exec]     CodesignAllocate: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate
[exec]     DisableTimestamp: False
[exec]     Entitlements: obj/iPhone/Release/Entitlements.xcent
[exec]     Keychain: <null>
[exec]     Resources:
[exec]       bin/iPhone/Release/AppiOS.app
[exec]     ResourceRules: <null>
[exec]     SigningKey: XXX
[exec]     ExtraArgs: <null>
[exec]     IsAppExtension: False
[exec]   Tool /usr/bin/codesign execution started with arguments: -v --force --sign XXX --entitlements /Users/someuser/.jenkins/workspace/Project/ProjectName/ProjectName.iOS/obj/iPhone/Release/Entitlements.xcent /Users/someuser/.jenkins/workspace/Project/ProjectName/ProjectName.iOS/bin/iPhone/Release/AppiOS.app
[exec] bin/iPhone/Release/AppiOS.app : error : /Users/someuser/.jenkins/workspace/Project/ProjectName/ProjectName.iOS/bin/iPhone/Release/AppiOS.app: unknown error -1=ffffffffffffffff [/Users/someuser/.jenkins/workspace/Project/ProjectName/ProjectName.iOS/ProjectName.iOS.csproj]

另一方面,如果我构建它,它可以正常工作

  • 在 Xamarin Studio 中
  • 在 Visual Studio for Mac 中
  • 通过 Mac 构建主机连接时
  • 在终端上

经过一些研究,提到了following solutions

  • 允许访问钥匙串
  • 撤销并创建新的证书/配置文件

我都尝试了,但我仍然收到错误消息。我的问题是,为什么 Jenkins 会与

launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist

无法访问证书/配置文件。这是配置中Ant的调用

<target name="buildIpa" depends="init" if="isMac">
    <exec dir="${basedir}" executable="${msibuild}" failonerror="true">
        <arg line="&quot;/p:Configuration=Release&quot; /p:Platform=&quot;iPhone&quot; /p:IpaPackageDir=&quot;./bin&quot; /t:Build ${TopLevelProject}.sln "/>
    </exec>
</target>

,其中msibuild/Libary/Frameworks/Mono.framework/Versions/Current/Commands/msbuild

其他项目(Droid、UWP)也在构建中,我不知道如何只为 iOS 构建......

如何查看是否存在签名错误、Jenkins 安装错误或其他错误?

我目前的设置:

Mac OS X:10.12.6
Xcode:9.1
适用于 Mac 的 Visual Studio 社区 2017:7.2.2
单声道:5.4.1.6
Xamarin.iOS:11.3.0.47
Xamarin.Forms:2.3.4.267
Mac 上的 Xamarin Studio:6.3
詹金斯:2.73.3

【问题讨论】:

  • 您是否已将证书和配置文件导入 Jenkins? Jenkins 是否拥有对签名文件的完全访问权限?
  • 不,我只是直接在 Mac 上导入/创建了文件(位于钥匙串中)。这就是 Jenkins 是否拥有完全访问权限的问题。我确实允许所有应用程序访问证书,但这似乎还不够。
  • 您是否在构建脚本中使用“security unlock-keychain -p keychainPassword pathToKeychain”解锁钥匙串?
  • @ChristopherStephan:不,目前没有。每次都要解锁吗? pathToKeychain 是什么? /Users/someUser/Library/Keychains/?还有其他选项不需要提供密码吗?通常,它应该问我是否允许,然后我点击始终允许,但 Jenkins 从来没有问过这个问题。
  • 例如,如果配置文件存储在登录钥匙串中,pathToKeychain 可能是 /Users/someUser/Library/Keychains/login.keychain-db。目前我不知道隐藏密码的可能性。有一个 Jenkins 插件可以导入钥匙串,但它不再适用于 Mac OS Sierra (github.com/SICSoftwareGmbH/kpp-management-plugin/issues/5)。在构建 ipa 之前尝试解锁钥匙串。如果它不能解决问题,请在 Xcode 中创建一个演示应用程序,提供您用于该应用程序的包标识符,添加配置文件并查看构建是否成功。

标签: ios xamarin jenkins ant codesign


【解决方案1】:

什么对我有帮助

  1. 钥匙串:将证书从登录移动到系统并在 Xcodebuild 启动之前手动解锁 security unlock-keychain -p "&lt;YOUR PASS HERE&gt;" ~/Library/Keychains/login.keychain
  2. 自定义 xcodebuild 参数:在 Jenkins 中使用 CODE_SIGN_STYLE="Manual" 并使用 Keychains 和 Provisioning Profiles 插件实现手动代码签名样式(使用环境变量易于操作)

    CODE_SIGN_STYLE="手动" PROVISIONING_PROFILE_SPECIFIER=${PROVISIONING_PROFILE} CODE_SIGN_IDENTITY="${CODE_SIGNING_IDENTITY}" -allowProvisioningUpdates

【讨论】:

  • “移动证书”:在钥匙串中拖放? “自定义 xcodebuild 参数”:上面提到了 Christopher,KPP 不再工作了,你也是这样吗?你需要 1 和 2 吗?
  • 移动证书:复制/粘贴到系统并从登录中删除。 自定义 xcodebuild 参数Keychains 和 Provisioning Profiles 它不适用于 MacOSSierra,它是 Jenkins 的插件,只是为了方便使用 keychain 变量。 wiki.jenkins.io/display/JENKINS/…
【解决方案2】:

当 Jenkins 通过 launchd 启动(通过 launchctl 实用程序控制)时,生成的进程减少了访问系统中资源的权限,例如给定用户的钥匙串,因为它缺少为实际登录的用户设置的属性. 您可以通过 JNLP 或 ssh 从站启动 Jenkins 来解决此问题。我建议使用 SSH 从属选项,因为 JNLP 很脆弱。

这是 Jenkins ssh slaves 页面: https://wiki.jenkins.io/display/JENKINS/SSH+Slaves+plugin

这两个堆栈溢出将为您提供有关如何通过命令行完成设置配置文件的更多帮助:

How to install developer certificate/private key and provisioning profile for iOS development via command line?

security / codesign in Sierra: Keychain ignores access control settings and UI-prompts for permission

【讨论】:

  • 使用 ssh 会话不会自动解决问题。我根据@Pokemon 的回答明确调用了安全解锁钥匙串,这为我解决了这个问题。不过,+1 非常明智地解释了为什么通过 Jenkins 运行它会导致问题。
【解决方案3】:

我有一个带有自动预配设置的 Xamarin 项目。我可以在 Jenkins slave 上本地构建,但在从 Jenkins Pipeline 运行相同命令时却不行。

我发现我必须在构建之前运行和 sh 命令 sh 'security unlock-keychain -p "[Users Password]" /Users/[Users Name]/Library/Keychains/login.keychain-db' 能够签署代码。

看起来当从 Jenkins 运行时,shell 环境的钥匙串被锁定了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    相关资源
    最近更新 更多