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

栏目: Java · 发布时间: 5年前

内容简介:我将之前写的文章逐步迁移到掘金上,也是希望更多人能看到我写的文章,共同学习。Jenkins 是一款使用 Java 开发的持续集成工具,下面将介绍如何使用 Jenkins 来进行iOS的持续集成。在安装 Jenkins 之前,首先要安装 JDK,这里需要注意 JDK 的版本,必须为

我将之前写的文章逐步迁移到掘金上,也是希望更多人能看到我写的文章,共同学习。

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法心得:高效算法的奥秘(原书第2版)

算法心得:高效算法的奥秘(原书第2版)

(美)Henry S. Warren, Jr. / 爱飞翔 / 机械工业出版社 / 2014-3 / 89.00

【编辑推荐】 由在IBM工作50余年的资深计算机专家撰写,Amazon全五星评价,算法领域最有影响力的著作之一 Google公司首席架构师、Jolt大奖得主Hoshua Bloch和Emacs合作创始人、C语言畅销书作者Guy Steele倾情推荐 算法的艺术和数学的智慧在本书中得到了完美体现,书中总结了大量高效、优雅和奇妙的算法,并从数学角度剖析了其背后的原理 【读者评价......一起来看看 《算法心得:高效算法的奥秘(原书第2版)》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具