美文网首页iOS开发技巧
【Jenkins+Xcode+蒲公英】配置Jenkins遇到的坑

【Jenkins+Xcode+蒲公英】配置Jenkins遇到的坑

作者: 酷酷的小虎子 | 来源:发表于2018-07-10 18:12 被阅读378次

    背景

    使用Jenkins是为了持续、自动构建项目,持续集成对整个开发团队的开发带来诸多好处,可以省去频繁的集成工作,整体缩短开发周期,推动整个开发,很大程度提高团队的工作效率。

    上家公司就是用Jenkins工具实现持续集成,但是之前是别的同事配置的,这两天在公司决定自己配置一下,结果遇到了很多坑,在此记录一下。

    ps:其实整个Jenkins配置过程还是很简单的,不是什么技术活,网上详细的教程也有很多,所以不多详细描述整个配置过程,而是针对于我们公司的项目提出几个点,并分享解决过程

    一.安装方式

    首先Jenkins安装方式网上就有很多声音,最开始配置作者是通过安装包(.dmg)的方式安装的,一切都很顺利,http://localhost:8080也直接打开了面板(如果输入地址打不开面板可能就是Java环境出现问题,可以检查一下,升级或者重新安装)。新建项目之后又遇到了一些问题,在下面会逐一提到。在工程都完美配置好的前提下(其实在这之前构建过n次,填了很多网上其他用户遇到的同样的问题,都比较好解决),开始构建,结果刚开始很顺利,进度条走着走着就报红了,打开控制台输出是以下内容:

    === BUILD TARGET *** OF PROJECT **** WITH CONFIGURATION ***** ===
    
    Check dependencies
    Code Signing Error: No profile for team '**********' matching '********' found:  Xcode couldn't find any provisioning profiles matching '**********/********'. Install the profile (by dragging and dropping it onto Xcode's dock item) or select a different one in the General tab of the target editor.
    Code Signing Error: Code signing is required for product type 'Application' in SDK 'iOS 11.1'
    Code Signing Error: Code signing is required for product type 'Application' in SDK 'iOS 11.1'
    Code Signing Error: Code signing is required for product type 'Application' in SDK 'iOS 11.1'
    
    ** ARCHIVE FAILED **
    

    这是作者遇到的第一个大坑,网上同样的问题也很多,很多人提出解决方法就是将/Users/apple/Library/MobileDevice下描述文件的文件夹整体移动到/User/Shared/Jenkins/Library/MobileDevice下,结果作者试了并没有什么用,然后又查了很多资料都没有解决这个问题,直到看到一个博客说通过安装包的方式存在这样的问题(修改Jenkins主目录),作者就推翻了安装包安装的方式,用homebrew进行安装,然后安装完配置Jenkins后,在面板里添加了工程,然后构建,不幸的是同样的问题并没有得到解决。

    其实作者这里出现这个问题的根本原因就是Team ID写错了,这个问题就让人很头大了,我这里一直没有发现我填的是证书后面的那串数字,这个操作就是被无良博主带歪了,Team ID应该登录开发者账号去查看,如图:

    Team ID
    就这样我解决了这个大坑,后来发现拷贝描述文件到Jenkins用户目录是正确的操作。

    那么作者就这两种安装说一下自己比较直观的感受:

    • homebrew安装会比安装包安装效率要高一些,整个安装过程不用怕出现配置问题,包括卸载的时候会更方便。
    • 安装包安装会再系统生成一个Jenkins用户,homebrew安装则不会。
    • 两者主目录路径会不同,
    homebrew安装主路径为:
    /Users/Shared/Jenkins/Home
    
    安装包安装主路径为:
    ~/.jenkins/Home
    
    • homebrew安装开机后手动启动Jenkins服务,安装包安装开机后自动启动服务。当然homebrew也可以通过命令行设置成开机自动启动服务。
    • 其他方面,比如创建任务及整个配置过程两种安装方式安装后都是一样的,出现报错不用质疑安装方式有问题。

    二.其他报错

    当然配置过程还有很多问题,比如:

    1)

    xcodebuild[33781:175258] [MT] IDEDistribution: Step failed: <IDEDistributionSigningAssetsStep: 0x7fd7dafe7ec0>: Error Domain=IDEDistributionSigningAssetStepErrorDomain Code=0 "Locating signing assets failed." UserInfo={NSLocalizedDescription=Locating signing assets failed., IDEDistributionSigningAssetStepUnderlyingErrors=(
        "Error Domain=IDEProvisioningErrorDomain Code=9 \"\"***.app\" requires a provisioning profile with the Push Notifications feature.\" UserInfo={NSLocalizedDescription=\"***.app\" requires a provisioning profile with the Push Notifications feature., NSLocalizedRecoverySuggestion=Add a profile to the \"provisioningProfiles\" dictionary in your Export Options property list.}"
    )}
    error: exportArchive: "***.app" requires a provisioning profile with the Push Notifications feature.
    
    Error Domain=IDEProvisioningErrorDomain Code=9 ""***.app" requires a provisioning profile with the Push Notifications feature." UserInfo={NSLocalizedDescription="***.app" requires a provisioning profile with the Push Notifications feature., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}
    
    ** EXPORT FAILED **
    

    问题定位之后了解到Xcode版本在9以上可能在面板中用Xcode插件构建会导致这样的问题,导致原因可能是没有权限访问钥匙串的内容,提供解决方案是放弃Xcode插件,通过“执行 shell”运行脚本完成项目构建,如下:

    security unlock-keychain -p 开机密码(登录钥匙串密码) /Users/用户名/Library/Keychains/login.keychain
    xcodebuild clean -workspace "/Users/Shared/Jenkins/Home/workspace/项目文件夹/项目/项目.xcworkspace" -scheme "默认scheme" -configuration "默认configuration" -sdk iphoneos11.4
    xcodebuild -archivePath "/Users/Shared/Jenkins/Home/workspace/项目文件夹/output/默认scheme/项目.xcarchive" -workspace "/Users/Shared/Jenkins/Home/workspace/项目文件夹/项目/项目.xcworkspace" -sdk iphoneos11.4 -scheme "默认scheme" -configuration "默认configuration" archive
    xcodebuild -exportArchive -archivePath "/Users/Shared/Jenkins/Home/workspace/项目文件夹/output/默认scheme/项目.xcarchive" -exportPath "/Users/Shared/Jenkins/Home/workspace/项目文件夹/ipa/默认scheme" -exportOptionsPlist '/Users/Shared/Jenkins/Home/workspace/项目文件夹/ipa/默认scheme/ExportOptions.plist' -allowProvisioningUpdates
    

    当然,只是为了实现简单的构建版本需求。

    注意:
    exportOptionsPlist代表包含导出的ipa包的配置信息的文件,我们可以再构建之前先在/Users/Shared/Jenkins/Home/workspace/项目文件夹/ipa/默认scheme生成这个文件,如果不会生成这个文件可以手动打包,打包导出的文件夹会生成这个文件,可以直接拿来使用,同时这个文件里能看到Team ID

    2)

    /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/项目-chghnxmyohlmkqalamhlgjkzcims/Build/Intermediates.noindex/ArchiveIntermediates/项目/InstallationBuildProductsLocation/Applications/项目.app/Frameworks/AliyunVideoSDKPro.framework: errSecInternalComponent
    Command /usr/bin/codesign failed with exit code 1
    
    ** ARCHIVE FAILED **
    The following build commands failed:
        CodeSign /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/项目-chghnxmyohlmkqalamhlgjkzcims/Build/Intermediates.noindex/ArchiveIntermediates/项目/InstallationBuildProductsLocation/Applications/项目.app/Frameworks/AliThirdparty.framework
        CodeSign /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/项目-chghnxmyohlmkqalamhlgjkzcims/Build/Intermediates.noindex/ArchiveIntermediates/项目/InstallationBuildProductsLocation/Applications/项目.app/Frameworks/AliyunPlayerSDK.framework
    (4 failures)
    Build step '执行 shell' marked build as failure
    Finished: FAILURE
    

    一切都进行很顺利,就差最后一点点就Archive完了,到构建一些.framework时又报问题了,这个问题真的是无解,仿佛就作者遇到了这样的问题,也无从查证,实在是搞不明白errSecInternalComponent这是什么问题,又看到了很多博客做了很多飘逸的操作,结果也没有给我解决问题。后来我就回看往期的构建版本发现用脚本构建之前(Xcode插件构建)时到这步操作并没有报这个错而是继续构建,然后报了错误1),然后我就又换回了脚本构建的方式,通过构建版本方式的切换我发现成功导出了ipa文件,就这样作者终于看到了:
    ** ARCHIVE SUCCEEDED ** ** EXPORT SUCCEEDED **
    本以为就这样结束了,作者就针对工程中多个Scheme创建了多个任务,用很诡异的切换构建方式都成功地完成自动化打包,然后关机下班。
    第二天一上班欣喜地点了“立即构建”,结果爆炸了,又报了这个错误,心态爆炸了,原来切换构建方式的方法只是解决了一时的问题。后来静下心来想问题出在哪儿,又上网上翻了翻,看到了
    Xcode Command /usr/bin/codesign failed with exit code 1 : errSecInternalComponent,下面有个回答点醒了我,就是脚本构建需要先执行security unlock-keychain -p 开机密码(登录钥匙串密码) /Users/用户名/Library/Keychains/login.keychain,将登录钥匙串打开,提供访问。之前用Xcode插件构建不会在这里报错是因为Xcode插件有个解锁的选项,如下:

    Unlock Keychain
    所以Xcode插件构建后再用脚本构建不会问题,并且构建成功,而且重启电脑后又会报这个问题。所以脚本构建需要先执行security unlock-keychain -p 开机密码(登录钥匙串密码) /Users/用户名/Library/Keychains/login.keychain

    3)

    前一阵子公司也开发新版本,Jenkins 也被搁置了。结果前两天想打包发现 Jenkins 面板打不开了,定位了半天也没找到问题出在哪里,索性就直接在公司的新电脑上重新部署了一下 Jenkins,最后我把问题归咎于 macOS Mojave,哈哈。
    结果没开心多久,像之前一样配置工程,结果打包失败了,报错信息如下:

    error: exportArchive: The data couldn’t be read because it isn’t in the correct format.
    
    Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/v4/j6xwm71s0nl2hjkfr7kyxd_w0000gn/T/ipatool-json-filepath-CcF4eM}
    
    ** EXPORT FAILED **
    

    这个问题就是导出的ExportOptions.plist配置的值不对,解决这个问题最快的办法就是手动打个包,然后导出包的文件夹里也会有这个文件,拷贝到workspace对应的文件夹中即可,如下图:

    workspace
    • 需要注意的是在选择Development distribution optionsApp Thinning一定要选择None,如下图:
      Development distribution options
      这样打完包之后的ExportOptions.plist内容如下图:
      ExportOptions.plist

    4)

    $ /bin/sh -xe /var/folders/v4/j6xwm71s0nl2hjkfr7kyxd_w0000gn/T/jenkins2815406958203751547.sh
    + xcodebuild clean -workspace $'/Users/apple/.jenkins/workspace/xxx/xxx.xcworkspace' -scheme xxx -configuration xxx -sdk iphoneos11.0
    xcodebuild: error: SDK "iphoneos11.0" cannot be located.
    

    出现这个问题就在终端输入xcodebuild -showsdks查看电脑支持的 iOS SDKs 就好了。

    5)

    愤怒的管家:

    org.apache.commons.jelly.JellyTagException: jar:file:/Users/apple/.jenkins/war/WEB-INF/lib/jenkins-core-2.151.jar!/hudson/model/UpdateCenter/CoreUpdateMonitor/message.jelly:53:20: <j:otherwise> can't parse argument number: changelog.url
    
    愤怒的管家
    安装完Jenkins遇到这个报错久无法继续配置任务了,我是用homebrew安装后遇到这个问题的,在网上查了很多资料,感觉没有实质性的帮助,看官方日志及解决方案也没有解决这个问题,最后我根据路径找到了报错的jar包,然后去官网下载了Generic Java package (.war),用新下的jenkins.war里的jenkins-core-2.138.3替换了报错的jenkins-core-2.151.jar,完美解决了这个问题。

    就这样经历了99+次构建,作者用生命集成好了Jenkins,实现了持续集成,再次声明不是什么技术活。

    成功导出

    相关文章

      网友评论

        本文标题:【Jenkins+Xcode+蒲公英】配置Jenkins遇到的坑

        本文链接:https://www.haomeiwen.com/subject/unpvuftx.html