使用 Jenkins 配置 iOS 持续集成踩坑实录

使用 Jenkins 配置 iOS 持续集成踩坑实录我将之前写的文章逐步迁移到掘金上,也是希望更多人能看到我写的文章,共同学习。 Jenkins 是一款使用 Java 开发的持续集成工具,下面将介绍如何使用 Jenkins 来进行iOS的持续集成。坑都用粗体标明了。 在安装 Jenkins 之前,首先要安装 JDK,这里需要注意…

使用 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>&lt;none&gt;</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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注