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


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

查看所有标签

猜你喜欢:

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

财富博客

财富博客

Robert Scoble、Shel Israel / 李宛蓉 / 重庆出版社 / 2008 / 38.00元

《财富博客》作者斯考伯(美国最多人阅读的企业博客作者)和谢尔•以色列(资深技术顾问)相信,博客已经开始改变企业的面貌。他们阐释说明了员工博客如何改变外界对微软的观感,敢说敢做的NBA球队老板如何运用博客和球迷连接,小企业和大公司又如何能从博客获益……另外,还有万一使用不当,博客又会招致怎样的灾难。斯考伯和以色列直言不讳,这是卓越博客的基本要件,因此他们在说完博客的好处之后,也以同样诚实的心态讨论博......一起来看看 《财富博客》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具