自动化发布iOS包

2016-04-29 更新:加入 unlock-keychain

我们的 Android 包一直是使用 Jenkins 发布的。这样,不必依赖开发就能得到 APK 包,打包的工作从开发交给测试,运营同学直接从内网取包上渠道。整个发布过程,开发可以不必参与,非开发可以不接触源码。

现在 iOS 版本也需要加入到这个流程中,这就需要扩展以前的脚本工具使其可以支持 iOS 自动化打包。然后才能将其集成进入 Jenkins 中。

iOS自动打包并发布脚本 这篇文章详细介绍了使用 XCode Command Line Tools 中的 xcodebuild 和 xcrun 来进行 iOS 自动化打包的方法。按这篇教程操作很容易打包成功。我将该文中提到的一些重点记录下来便于记忆。

1. 指定要编译的项目

使用 -project 参数指定项目名称,支持绝对路径和相对路径。

2. 获取可用的参数值

想知道 -target-configuration-scheme 参数的可用值可以通过调用 xcodebuild -list 获得。

想知道 -sdk 参数的可用值可以使用 xcodebuild -showsdks 获得。

要使用不同的签名,可以在命令行中重新设定 CODE_SIGN_IDENTITYPROVISIONING_PROFILE 的值。

若是要知道还有哪些值可以设置,使用 xcodebuild -showBuildSettings 来获得。

3. 签名和 mobileprovision UUID

上面提到,若要使用不同证书进行签名,需要设置两个参数。

CODE_SIGN_IDENTITY 为开发者证书标识,可以在 Keychain Access -> Certificates -> 选中证书右键弹出菜单 -> Get Info -> Common Name 获取。获得的值类似于:

iPhone Distribution: Company name Co. Ltd (xxxxxxxx9A)

PROVISIONING_PROFILE 参数就是 mobileprovision 文件的 UUID,类似于这样的字符串:

xxxxx-xxxx-xxx-xxxx-xxxxxxxxx

有好几种方法可以得到这个 UUID。

第一种方法,如果已经在 XCode 中自动下载了这个 mobileprovision ,该文件位于 ~/Library/MobileDevice/Provisioning Profiles 下,文件名就是 UDID 的值。

第二种方法,如果已经在 XCode 中自动下载了这个 mobileprovision ,进入 Xcode -> Preferences -> 选中申请开发者证书的 Apple ID -> 选中开发者证书 -> View Details… -> 根据 Provisioning Profiles 的名字选中打包所需的 mobileprovision 文件 -> 右键菜单 -> Show in Finder ,这样就能直接打开第一种方法中的文件夹,并定位到该文件。

第三种方法,当已经有了一个 mobileprovision 文件(假设文件名为 adhoc.mobileprovision)但不知道 UUID 的时候,可以使用这个脚本来实现:

/usr/libexec/PlistBuddy -c "Print UUID" /dev/stdin <<< $(/usr/bin/security cms -D -i ./adhoc.mobileprovision)

上面脚本的原理是,先使用 security 解密 mobileprovision 成文本(结果为一个plist格式的文本),然后使用 PlistBuddy 计算其 UUID 。

4. unlock-keychain

本段落为jxyi 提供。

接入Jenkiin之后,打包时提示信息如下:

1Signing Identity:     "iPhone Developer: jiaxing yi (XXXXXXXXX)"
2Provisioning Profile: "ad-hoc for dz"
3                      (xxxxxxxx-15ea-xxxx-aee9-xxxxxxxxxxxx)
4 
5    /usr/bin/codesign --force --sign XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --entitlements /Users/baina/jenkins/workspace/game-dz-iOS-release-build/game-lerna-texas/lerna_player/runtime/proj.mac_ios/build/lernaplayer.build/Debug-iphoneos/lernaproduct.build/lernaproduct.app.xcent --timestamp=none /Users/baina/jenkins/workspace/game-dz-iOS-release-build/game-lerna-texas/lerna_player/runtime/proj.mac_ios/build/Debug-iphoneos/lernaproduct.app
6/Users/baina/jenkins/workspace/game-dz-iOS-release-build/game-lerna-texas/lerna_player/runtime/proj.mac_ios/build/Debug-iphoneos/lernaproduct.app: User interaction is not allowed.
7Command /usr/bin/codesign failed with exit code 1
8 
9** BUILD FAILED **

出现该问题是由于需要输入登录密码,而脚本编译时无法人工输入登录密码导致。因此需要在打包之前先解锁账号。

要解决上面的问题,需要在调用打包脚本之前,先调用如下命令:

1security unlock-keychain  -p "your password" ~/Library/Keychains/login.keychain

(全文完)