使用 Jenkins 配置 iOS 持续集成踩坑实录
我将之前写的文章逐步迁移到掘金上,也是希望更多人能看到我写的文章,共同学习。
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
第三步
绑定完毕后,开始安装以下插件:
- Keychains and Provisioning Profiles Management
对的,只有一个,不要使用 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 打开该项目没有报错,并且可以构建,那么就没有任何问题了。
Unity 特别篇
使用 Jenkins 来构建 Unity,有以下几点需要注意的地方。
关闭自动签名,设定provision。
在 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 脚本,这样就省去了很多插件的配置问题。
今天的文章使用 Jenkins 配置 iOS 持续集成踩坑实录分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/21498.html