在我们公司,日常测试使用的是企业包,只有再测试一些特定业务时才会使用个人开发者证书构建出来的版本。那么,今天就跟大家来简单聊一聊使用 xcodebuild 构建企业包 IPA 并上传,然后发送包含二维码图片的邮件通知,并支持在线安装。
今天介绍关于 Jenkins 本身的知识,有相关问题大家可以自行 Google。
➜ ios_main git:(develop) xcodebuild -help
Usage: xcodebuild [-project <projectname>] [[-target <targetname>]...|-alltargets] [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [<buildsetting>=<value>]... [<buildaction>]...
xcodebuild [-project <projectname>] -scheme <schemeName> [-destination <destinationspecifier>]... [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [<buildsetting>=<value>]... [<buildaction>]...
xcodebuild -workspace <workspacename> -scheme <schemeName> [-destination <destinationspecifier>]... [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [<buildsetting>=<value>]... [<buildaction>]...
xcodebuild -version [-sdk [<sdkfullpath>|<sdkname>] [<infoitem>] ]
xcodebuild -list [[-project <projectname>]|[-workspace <workspacename>]] [-json]
xcodebuild -showsdks
xcodebuild -exportArchive -archivePath <xcarchivepath> -exportPath <destinationpath> -exportOptionsPlist <plistpath>
xcodebuild -exportLocalizations -localizationPath <path> -project <projectname> [-exportLanguage <targetlanguage>...]
xcodebuild -importLocalizations -localizationPath <path> -project <projectname>
Options:
-usage print brief usage
-help print complete usage
-verbose provide additional status output
-license show the Xcode and SDK license agreements
-checkFirstLaunchStatus Check if any First Launch tasks need to be performed
-project NAME build the project NAME
-target NAME build the target NAME
-alltargets build all targets
-workspace NAME build the workspace NAME
-scheme NAME build the scheme NAME
-configuration NAME use the build configuration NAME for building each target
-xcconfig PATH apply the build settings defined in the file at PATH as overrides
-arch ARCH build each target for the architecture ARCH; this will override architectures defined in the project
-sdk SDK use SDK as the name or path of the base SDK when building the project
-toolchain NAME use the toolchain with identifier or name NAME
-destination DESTINATIONSPECIFIER use the destination described by DESTINATIONSPECIFIER (a comma-separated set of key=value pairs describing the destination to use)
-destination-timeout TIMEOUT wait for TIMEOUT seconds while searching for the destination device
-parallelizeTargets build independent targets in parallel
-jobs NUMBER specify the maximum number of concurrent build operations
-dry-run do everything except actually running the commands
-quiet do not print any output except for warnings and errors
-hideShellScriptEnvironment don't show shell script environment variables in build log
-showsdks display a compact list of the installed SDKs
-showBuildSettings display a list of build settings and values
-list lists the targets and configurations in a project, or the schemes in a workspace
-find-executable NAME display the full path to executable NAME in the provided SDK and toolchain
-find-library NAME display the full path to library NAME in the provided SDK and toolchain
-version display the version of Xcode; with -sdk will display info about one or all installed SDKs
-enableAddressSanitizer YES|NO turn the address sanitizer on or off
-enableThreadSanitizer YES|NO turn the thread sanitizer on or off
-resultBundlePath PATH specifies the directory where a result bundle describing what occurred will be placed
-derivedDataPath PATH specifies the directory where build products and other derived data will go
-archivePath PATH specifies the directory where any created archives will be placed, or the archive that should be exported
-exportArchive specifies that an archive should be exported
-exportOptionsPlist PATH specifies a path to a plist file that configures archive exporting
-enableCodeCoverage YES|NO turn code coverage on or off when testing
-exportPath PATH specifies the destination for the product exported from an archive
-skipUnavailableActions specifies that scheme actions that cannot be performed should be skipped instead of causing a failure
-exportLocalizations exports completed and outstanding project localizations
-importLocalizations imports localizations for a project, assuming any necessary localized resources have been created in Xcode
-localizationPath specifies a path to XLIFF localization files
-exportLanguage specifies multiple optional ISO 639-1 languages included in a localization export
-xctestrun specifies a path to a test run specification
-only-testing:TEST-IDENTIFIER constrains testing by specifying tests to include, and excluding other tests
-skip-testing:TEST-IDENTIFIER constrains testing by specifying tests to exclude, but including other tests
-json output as JSON (note: -json implies -quiet)
Available keys for -exportOptionsPlist:
compileBitcode : Bool
For non-App Store exports, should Xcode re-compile the app from bitcode? Defaults to YES.
embedOnDemandResourcesAssetPacksInBundle : Bool
For non-App Store exports, if the app uses On Demand Resources and this is YES, asset packs are embedded in the app bundle so that the app can be tested without a server to host asset packs. Defaults to YES unless onDemandResourcesAssetPacksBaseURL is specified.
iCloudContainerEnvironment
For non-App Store exports, if the app is using CloudKit, this configures the "com.apple.developer.icloud-container-environment" entitlement. Available options: Development and Production. Defaults to Development.
manifest : Dictionary
For non-App Store exports, users can download your app over the web by opening your distribution manifest file in a web browser. To generate a distribution manifest, the value of this key should be a dictionary with three sub-keys: appURL, displayImageURL, fullSizeImageURL. The additional sub-key assetPackManifestURL is required when using on demand resources.
method : String
Describes how Xcode should export the archive. Available options: app-store, ad-hoc, package, enterprise, development, and developer-id. The list of options varies based on the type of archive. Defaults to development.
onDemandResourcesAssetPacksBaseURL : String
For non-App Store exports, if the app uses On Demand Resources and embedOnDemandResourcesAssetPacksInBundle isn't YES, this should be a base URL specifying where asset packs are going to be hosted. This configures the app to download asset packs from the specified URL.
teamID : String
The Developer Portal team to use for this export. Defaults to the team used to build the archive.
thinning : String
For non-App Store exports, should Xcode thin the package for one or more device variants? Available options: <none> (Xcode produces a non-thinned universal app), <thin-for-all-variants> (Xcode produces a universal app and all available thinned variants), or a model identifier for a specific device (e.g. "iPhone7,1"). Defaults to <none>.
uploadBitcode : Bool
For App Store exports, should the package include bitcode? Defaults to YES.
uploadSymbols : Bool
For App Store exports, should the package include symbols? Defaults to YES.
参数 | 说明 |
---|---|
-showsdks | display a compact list of the installed SDKs |
-list | lists the targets and configurations in a project, or the schemes in a workspace |
-workspace NAME | build the workspace NAME |
-scheme NAME | build the scheme NAME |
-configuration NAME | use the build configuration NAME for building each target |
-archivePath PATH | specifies the directory where any created archives will be placed, or the archive that should be exported |
-exportArchive | specifies that an archive should be exported |
-exportOptionsPlist PATH | specifies a path to a plist file that configures archive exporting |
-exportPath PATH | specifies the destination for the product exported from an archive |
前文已经说过,构建需要产生 IPA,然后上传到服务器 (并没有使用蒲公英/fir 等分发平台)。所以我们使用这样一条命令来导出 IPA:
xcodebuild -exportArchive -archivePath <xcarchivepath> -exportPath <destinationpath> -exportOptionsPlist <plistpath>
在导出 IPA 之前,我们需要先构建出 archive 文件,使用如下命令:
xcodebuild -workspace <workspacename> -scheme <schemeName> [-configuration <configurationname>] [-sdk [<sdkname>|<sdkpath>]] [<buildsetting>=<value>] [<buildaction>]
在构建之前建议进行 clean 操作,同样使用上一条命令,区别在于 buildaction:
xcodebuild -workspace <workspacename> -scheme <schemeName> [-configuration <configurationname>] [-sdk [<sdkname>|<sdkpath>]] [<buildsetting>=<value>] [<buildaction>]
buildaction 即 clean、build、archive 等
由于我们的项目是使用 workspace 和 scheme 控制的多 target 项目,同时内部还有多个 widget,所以我使用了mod-pbxproj来进行项目编译前的配置。
请大家注意,以上 3 条命令都在上面的 xcodebuild -help 里可以找到,所以大家一定要仔细阅读帮助文档。
clean workspace:
xcodebuild -workspace yourworkspacename.xcworkspace -scheme EnterpriseRelease -configuration Release clean
生成 archive 文件:
xcodebuild -workspace yourworkspacename.xcworkspace -scheme EnterpriseRelease -configuration Release -sdk iphoneos -archivePath ./build/EnterpriseRelease.xcarchive CODE_SIGN_IDENTITY="iPhone Distribution: xxxxxxxxxx." archive
生成 IPA:
xcodebuild -exportArchive -archivePath ./build/EnterpriseRelease.xcarchive -exportPath ./build -exportOptionsPlist ~/enterprise.plist
到这里,就完成了企业证书签名的 release 构建,之后可以通过 scp 命令拷贝到服务器制定目录,并实现在线安装了。
<?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>teamID</key> <string>yourteamID</string> <key>method</key> <string>enterprise</string> <key>uploadSymbols</key> <false/> <key>compileBitcode</key> <false/> </dict> </plist>
附上一张邮件通知的截图: