使用Jenkins时的协同问题

时间:2017-11-20 13:31:49

标签: ios xamarin jenkins ant codesign

如果我使用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 build host连接时
  • 终端

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

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

我试过了两次,但我仍然得到错误。对我来说,问题是詹金斯为什么推出

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 Community 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

3 个答案:

答案 0 :(得分:4)

是什么帮助我

  1. Keychain :将证书从登录系统移动到系统并在Xcodebuild启动之前手动解锁 security unlock-keychain -p "<YOUR PASS HERE>" ~/Library/Keychains/login.keychain
  2. 自定义xcodebuild参数:使用CODE_SIGN_STYLE =&#34;手册&#34;在Jenkins中实现手动代码签名样式并使用Keychains和Provisioning Profiles Plugin(只需使用env变量轻松操作)

    CODE_SIGN_STYLE =&#34;手动&#34; PROVISIONING_PROFILE_SPECIFIER = $ {} PROVISIONING_PROFILE CODE_SIGN_IDENTITY =&#34; $ {CODE_SIGNING_IDENTITY}&#34; -allowProvisioningUpdates

答案 1 :(得分:1)

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

这是Jenkins ssh奴隶页面: 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

答案 2 :(得分:1)

我有一个带有自动配置设置的Xamarin项目。我可以在Jenkins从属服务器上本地构建,但不能从Jenkins Pipeline运行相同的命令。

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

从Jenkins运行时,外壳环境似乎已锁定了其钥匙串!