转载

使用 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
复制代码

第三步

绑定完毕后,开始安装以下插件:

  1. 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 脚本,这样就省去了很多插件的配置问题。

原文  https://juejin.im/post/5cc04ff15188250a5b35e29c
正文到此结束
Loading...