我将之前写的文章逐步迁移到掘金上,也是希望更多人能看到我写的文章,共同学习。
Jenkins 是一款使用 Java 开发的持续集成工具,下面将介绍如何使用 Jenkins 来进行iOS的持续集成。 坑都用粗体标明了。
在安装 Jenkins 之前,首先要安装 JDK,这里需要注意 JDK 的版本,必须为 1.8 ,过高或者过低均不行。
推荐使用 brew 来安装 Jenkins。
brew install jenkins 复制代码
安装完毕后,直接在命令行中输入以下命令:
jenkins 复制代码
在这里需要注意,Jenkins 默认端口是 8080 ,如果该端口被占用,可以使用以下命令切换端口:
jenkins -httpPort 9090 复制代码
然后,就可以在浏览器中输入 localhost:9090
来进入 Jenkins。在起始页面会使用一个起始口令来让你解锁它,这个口令可以在命令行中,或者在其指定的目录下可以找到该口令。输入完毕后,会让你创建一个账户,按照提示来完成操作就好。
创建完毕后,首先要去绑定你SSH密钥,方法如下:
Jenkins -> Credentials -> global -> add Credentials 复制代码
绑定完毕后,开始安装以下插件:
对的,只有一个, 不要使用 Xcode 插件来进行 iOS 配置,因为 XCode 8 以后,通过 Archive 生成 ipa 需要包括一个 ExportOption.Plist 文件,这个文件在该插件中并不会提供,所以通过脚本来进行配置,而不是通过 XCode 插件来配置。
安装完毕该插件后,直接通过网上各种渠道的信息来对该插件进行配置,配置该插件基本上不会有太大问题,下面给出 keychains 和 provision 在系统中的路径。
keychain: /Users/zcating/Library/Keychains provision: /Users/zcating/Library/MobileDevice/Provisioning Profiles 复制代码
需要注意的是, 上传的时候,login.keychain-db 会被标记为不合法的文件,login.keychain 实际上跟 login.keychain-db 是一样的,只需要复制一份,然后更改 login.keychain-db 为login.keychain,然后就可以上传了。
完成上传后就可以开始构建了,构建步骤如下:
1. 新建项目,选择自由风格。 2. 勾选 keychain 和 provision。 3. 添加 Git 配置。 4. 增加构建步骤,选择 Execute shell。 复制代码
然后添加以下脚本:
#需要自定义参数 xcode_project_path="/path/to/your/xcode/project" export_path="/path/to/your/export/path" ipa_name="ipa-name" provision="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # build method,可以输入以下选项: app-store, ad-hoc, enterprise, development build_method="enterprise" # bundle_id 需要跟项目中的一致 bundle_id="com.yourCompany.yourApp" bundle_name="provision_name" # 签名类型,可以选择以下类型: "iOS Developer", "iOS Distribution" sign_cer="iOS Distribution" # 就是你们团队证书中的用户名 team_id="XXXXXXXXXX" #自定义完毕 export_option_path="$xcode_project_path/ExportOptions.plist" # 写 ExportOption.plist 文件 echo "<?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>compileBitcode</key> <false/> <key>method</key> <string>$build_method</string> <key>provisioningProfiles</key> <dict> <key>$bundle_id</key> <string>$bundle_name</string> </dict> <key>signingCertificate</key> <string>$sign_cer</string> <key>signingStyle</key> <string>manual</string> <key>stripSwiftSymbols</key> <true/> <key>teamID</key> <string>$team_id</string> <key>thinning</key> <string><none></string> </dict> </plist>" > $export_option_path; xcodebuild archive / -archivePath "$xcode_project_path/build/${ipa_name}.xcarchive" / -project $xcode_project / -sdk iphoneos / -scheme $scheme / -configuration $build_configuration / CODE_SIGN_IDENTITY="钥匙串中的签名的名称" / PROVISIONING_PROFILE=$provision xcodebuild -exportArchive / -archivePath "$xcode_project_path/build/${ipa_name}.xcarchive" / -exportPath $export_path / -exportOptionsPlist $export_option_path / -allowProvisioningUpdates / CODE_SIGN_IDENTITY="钥匙串中的签名的名称" / PROVISIONING_PROFILE=$provision mv ${export_path}/*.ipa ${export_path}/ipa_name.ipa 复制代码
需要注意, XCode 项目需要关闭自动签名配置。
到这里,只要在 XCode 打开该项目没有报错,并且可以构建,那么就没有任何问题了。
使用 Jenkins 来构建 Unity,有以下几点需要注意的地方。
在 Assets 目录下新建以下目录和文件 /Assets/editor/ProcessBuild.cs,并且在cs文件中添加以下代码。
using System.Collections; using System.IO; using UnityEditor; using UnityEngine; using System.Collections.Generic; using System; class ProjectBuild : Editor{ //在这里找出当前工程所有的场景文件. static string[] GetBuildScenes() { List<string> names = new List<string>(); foreach(EditorBuildSettingsScene e in EditorBuildSettings.scenes) { if(e==null) continue; if(e.path == "Dont_Add" || e.path == "post") if(e.enabled) names.Add(e.path); } return names.ToArray(); } //得到项目的名称 public static string projectName { get { foreach(string arg in System.Environment.GetCommandLineArgs()) { if(arg.StartsWith("project")) { return arg.Split("-"[0])[1]; } } return "test"; } } //shell脚本直接调用这个静态方法 static void BuildForIPhone() { PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.iOS, "USE_SHARE"); // 构建xcode工程的核心方法了, // 参数1 需要打包的所有场景 // 参数2 需要打包的名字 // 参数3 打包平台 // 参数4 编译选项 BuildPipeline.BuildPlayer(GetBuildScenes(), "ios-build", BuildTarget.iOS, BuildOptions.None); } } 复制代码
project_dir="" /Applications/Unity/Unity.app/Contents/MacOS/Unity / -batchmode / -projectPath $project_dir / -executeMethod ProjectBuild.BuildForIPhone / -ios / -quit / -logFile $project_dir/BuildXCodeProject.log 复制代码
这样就会在你指定的目录下生成 XCode 项目。
我使用了 Jenkins 生成 iOS 最终的 ipa,感受到了如丝般顺滑的构建流程。生成过程只需一键,一键就能上传Testflight,fir.im 或者蒲公英。感觉以后打包真的会方便很多很多倍,省去了各种复杂的步骤。只是在构建 Jenkins 的时候,遇到了很多问题,最终的解决方案还是决定写一个 Shell 脚本,这样就省去了很多插件的配置问题。