Jenkins调用Unity

进入ResLoadPrgSVN工程,在工程的父目录内,先将之前需要创建的文件夹创建好。

首先是“AssetBundle”文件夹,然后是“BuildTarget”文件夹,在里面新建“Android”、“IOS”和“Windows”文件夹

最后是Data文件夹,在其中新建Excel和Reg文件夹

进入Unity工程,修改BuildApp脚本,在里面添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    #region 打包机调用打包PC版本
public static void BuildPC()
{
//打AB包
BundleEditor.Build();
//生成可执行程序
string abPath = Application.dataPath + "/../AssetBundle/" + EditorUserBuildSettings.activeBuildTarget.ToString() + "/";
DeleteDir(m_WindowsPath);//清空已经Build好的游戏包,生成最新的包,方便后面Jenkins归档
Copy(abPath, Application.streamingAssetsPath);

string dir = PlayerSettings.productName + "_" + EditorUserBuildSettings.activeBuildTarget.ToString() + string.Format("_{0:yyyy_MM_dd_HH_mm}", DateTime.Now);
string name = string.Format("/{0}.exe", PlayerSettings.productName);
//Windows的Build会先创建一个文件夹
string savePath = m_WindowsPath + dir + name;

BuildPipeline.BuildPlayer(FindEnabledEditorScenes(), savePath, EditorUserBuildSettings.activeBuildTarget, BuildOptions.None);

DeleteDir(Application.streamingAssetsPath);
WriteBuildName(dir);
}
#endregion
static void WriteBuildName(string name)//输出Build出来的文件名,方便Jenkins压缩
{
FileInfo file = new FileInfo(Application.dataPath + "/../buildname.txt");
StreamWriter sw = file.CreateText();//CreateText默认此文件每次创建时都是重新写入

sw.WriteLine(name);
sw.Close();
sw.Dispose();
}
}

修改Jenkins调用Unity3D的参数

1
-projectpath %WorkPath% -quit -batchmode -executeMethod BuildApp.BuildPC -logFile "E:\unity3dJenkins.txt"

Jenkins调用360Zip压缩

回到Jenkins,修改构建的配置,在Build Steps里面,添加Execute with Windows batch command

1
2
3
4
5
6
7
@echo off
for /f "delims= " %%i in (%WorkPath%\buildname.txt) do set name=%%i
c:
cd C:\Program Files (x86)\360\360zip
call 360zip.exe -ar "%WorkPath%\BuildTarget\Windows\%name%" "%WorkPath%\BuildTarget\Windows\%name%.zip"
exit 0
pause

这里使用360Zip,Jenkins可能会报错,暂时先作为记录

Jenkins调用WinRAR压缩

如果使用360Zip报错,这里是WinRAR的控制台调用方法

1
2
3
4
5
6
@echo off
for /f "delims= " %%i in (%WorkPath%\buildname.txt) do set name=%%i
c:
cd C:\Program Files\WinRAR
Winrar.exe a -r -ep1 "%WorkPath%\BuildTarget\Windows\%name%.rar" "%WorkPath%\BuildTarget\Windows\%name%"
pause

Jenkins归档

Jenkins压缩游戏包成功后,可以自动把压缩好的包归档,我们继续修改构建的配置

选择“构建后操作”——“Archive the artifacts”

在其中填入

1
BuildTarget\Windows\*.zip

然后点击“高级”,勾选上“只有构建成功时归档”、“使用默认的排除”、“包含和排除模式大小写敏感”

Jenkins归档位置

我们在Jenkins安装时,修改了Jenkins的工作空间,我们进入修改后的工作空间“E:\JenkinsWorkspace”,然后进入“Jobs”文件夹,从里面找到构建的工程,在工程目录内就能找到“builds——从里面能找到构建的编号——编号里面能找到archive文件夹——文件夹内就是归档的压缩包”

Jenkins添加部署参数

Jenkins自动构建时,Unity也可以读取到Jenkins配置的参数,比如说版本号、产品名称等。

我们修改Jenkins构建的配置,在General——This Project is Parameterized里面,添加几个新的参数

String Parameter

Name:Version

Default Value:0.1

Description:版本号

String Parameter

Name:Build

Default Value:0

Description:Build次数

String Parameter

Name:Name

Default Value:ResLoadPrg

Description:产品名称

Boolean Parameter

Name:Debug

Default Value:false

Description:是否是调试版本

接下来,我们在Build Steps——Invoke Unity3D Editor中,将这些参数设置在命令行里即可

1
-projectpath %WorkPath% -quit -batchmode -executeMethod BuildApp.BuildPC Version=$Version Name=$Name Build=$Build Debug=$Debug -logFile "E:\unity3dJenkins.txt"

这里的Version=$Version里面的美元符号也是取值的意思

Unity读取Jenkins

Unity设置Jenkins参数中间类

我们在Unity的BuildApp脚本中添加中间类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class BuildSetting
{
/// <summary>
/// 版本号
/// </summary>
public string Version = "";
/// <summary>
/// Build次数
/// </summary>
public string Build = "";
/// <summary>
/// 程序名称
/// </summary>
public string Name = "";
/// <summary>
/// 是否Debug
/// </summary>
public bool Debug = false;
}

BuildApp中添加解析BuildSetting和设置工程的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/// <summary>
/// 根据Jenkins的参数生成BuildSetting中间类
/// </summary>
static BuildSetting GetJenkinsPCBuildSetting()
{
string[] cmdArgs = Environment.GetCommandLineArgs();//使用此方法读取命令行
BuildSetting buildSetting = new BuildSetting();
foreach (string arg in cmdArgs)
{
if (arg.StartsWith("Version"))
{
var tempParam = arg.Split(new string[] {"="}, StringSplitOptions.RemoveEmptyEntries);
if (tempParam.Length == 2)
{
buildSetting.Version = tempParam[1].Trim();
}
}
else if (arg.StartsWith("Build"))
{
var tempParam = arg.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
if (tempParam.Length == 2)
{
buildSetting.Build = tempParam[1].Trim();
}
}
else if (arg.StartsWith("Name"))
{
var tempParam = arg.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
if (tempParam.Length == 2)
{
buildSetting.Name = tempParam[1].Trim();
}
}
else if (arg.StartsWith("Debug"))
{
var tempParam = arg.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
if (tempParam.Length == 2)
{
bool.TryParse(tempParam[1], out buildSetting.Debug);
}
}
}
return buildSetting;
}
/// <summary>
/// 根据Buildsetting设置工程
/// </summary>
/// <returns>设置参数后缀</returns>
static string SetPCSetting(BuildSetting buildSetting)
{
string suffix = "_";
if (!string.IsNullOrEmpty(buildSetting.Version))
{
PlayerSettings.bundleVersion = buildSetting.Version;
suffix += buildSetting.Version;
}
if (!string.IsNullOrEmpty(buildSetting.Build))
{
PlayerSettings.macOS.buildNumber = buildSetting.Build;
suffix += "_" + buildSetting.Build;
}
if (!string.IsNullOrEmpty(buildSetting.Name))
{
PlayerSettings.productName = buildSetting.Name;
}
if (buildSetting.Debug)
{
EditorUserBuildSettings.development = true;
EditorUserBuildSettings.connectProfiler = true;
suffix += "_Debug";
}
else
{
EditorUserBuildSettings.development = false;
}
return suffix;
}

最后,在BuildApp中再次修改BuildPC方法,调用上面的方法并缩减生成的包的后缀

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    #region 打包机调用打包PC版本
public static void BuildPC()
{
//打AB包
BundleEditor.Build();
BuildSetting buildSetting = GetJenkinsPCBuildSetting();
string suffix = SetPCSetting(buildSetting);
//生成可执行程序
string abPath = Application.dataPath + "/../AssetBundle/" + EditorUserBuildSettings.activeBuildTarget.ToString() + "/";
DeleteDir(m_WindowsPath);
Copy(abPath, Application.streamingAssetsPath);

string dir = PlayerSettings.productName + "_PC" + suffix + string.Format("_{0:yyyy_MM_dd_HH_mm}", DateTime.Now);
string name = string.Format("/{0}.exe", PlayerSettings.productName);
//Windows的Build会先创建一个文件夹
string savePath = m_WindowsPath + dir + name;

BuildPipeline.BuildPlayer(FindEnabledEditorScenes(), savePath, EditorUserBuildSettings.activeBuildTarget, BuildOptions.None);

DeleteDir(Application.streamingAssetsPath);
WriteBuildName(dir);
}
static BuildSetting GetJenkinsPCBuildSetting()
{
//...
}
static string SetPCSetting(BuildSetting buildSetting)
{
//...
}
#endregion

Jenkins Debug

打包失败后,仔细阅读控制台的输出内容。

如果是执行的bat出错,可以自行制作一个bat双击运行试试。

如果是Unity方法出错,那就 进入Unity环境来自行运行方法。