Jenkins接入Unity实现自动化打包

一.搭建Jeknins环境

1.进入官网下载Jekkins

2.按照步骤安装Jenkins(这个不去赘述这些步骤,本文着重描写Unity打包相关)

3.输入地址查看是否可以打开网页(我这里改过了,默认是8080)

4.可以的话,就说明Jenkins安装成功!那么根据页面的指导,开始配置Jenkins(这里不去赘述怎么配置)

二.Unity相关

1.打开Unity,在Unity创建脚本APKBulid,准备编写Unity打包脚本

2.编写打包脚本

//设置打出包的路径 
private static BuildOptions s_BuildOptions = BuildOptions.CompressWithLz4HC;    
private static void ManualExportEnvironment()
{
  string rootPath = Application.dataPath;
  rootPath = Path.GetDirectoryName(rootPath);
  rootPath = Path.GetDirectoryName(rootPath);

  string exportPath = Path.Combine(rootPath, "Export/Android");
  string exportApkPath = Path.Combine(exportPath, "test.apk");

  Environment.SetEnvironmentVariable("EXPORT_PATH", exportPath);
  Environment.SetEnvironmentVariable("EXPORT_APK_PATH", exportApkPath);
}
//封装的获取导出路径的方法
public static string WorkExportPath()
{
    string exportPath = Environment.GetEnvironmentVariable("EXPORT_PATH");
    if(string.IsNullOrEmpty(exportPath))
    {
        exportPath = Application.dataPath;
    }
    return exportPath;
}

//导出APk具体实现
public static void ExportApk()
{
    Debug.Log("ExportAPK start");
    //设置打包平台
    bool switchAndroid = EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Android, BuildTarget.Android);
    if (!switchAndroid)
    {
        Debug.LogError("ExportApk Switch Android Error");
        return;
    }
    Debug.Log("ExportApk Switch Android success");
    string export = WorkExportPath();
    if(Directory.Exists(export))
    {
        Directory.Delete(export, true );
    }
    Directory.CreateDirectory(export);

    //设置打包具体参数
    PlayerSettings.applicationIdentifier = "com.DeCompany.Project";

    PlayerSettings.Android.bundleVersionCode = 2;
    PlayerSettings.Android.useAPKExpansionFiles = false;
    
    EditorUserBuildSettings.buildAppBundle = false;
    // 生成符号文件
    EditorUserBuildSettings.androidCreateSymbols = AndroidCreateSymbols.Public;
    EditorUserBuildSettings.exportAsGoogleAndroidProject = false;

    var options = s_BuildOptions;

    EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle;
    PlayerSettings.bundleVersion = "1.1.1";
    PlayerSettings.productName = "TestProduct";
    var targetArchitectures = AndroidArchitecture.ARM64 | AndroidArchitecture.ARMv7;
    PlayerSettings.Android.targetArchitectures = (AndroidArchitecture)targetArchitectures;


    List<string> levels = new List<string>();
    foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes)
    {
        if (!scene.enabled) continue;
        // 获取有效的 Scene
        levels.Add(scene.path);
    }

    string apkPath = GetApkPath();
    Debug.Log("apkPath:" + apkPath);
    BuildPipeline.BuildPlayer(levels.ToArray(), apkPath, BuildTarget.Android, options);
}

##导出APK的方法
[MenuItem("Tools/Export/ExportAPK")]
public static void ExportAPKManual()
{
    ManualExportEnvironment();
    ExportApk();
}

3.在Unity中运行,查看时候是否可以打出包,如果可以的话,就说明脚本正常,准备在Jenkins中配置。(注意修改自己出包的位置,我自己的设置在Unity项目平级的Export文件夹中)

三.Jenkins的创建

1.创建Item

我这里选择了Freestyle风格,你可以根据自己需求来选择

选择Git,输入你的URL,之后添加你的凭证(有权限修改添加项目的账户),之后选择这个凭证

在构建步骤的地方添加Bat构建步骤即可(如果可以的话,最好使用.sh)

这个代码的意思就是启动位于D:\JenkinsProject\jenkins_scripts\android_distribute.bat这个位置的bat文件

echo "Starting Android APK Distribution"
set ANDROID_DISTRIBUTE_BAT_PATH=D:\JenkinsProject\jenkins_scripts\android_distribute.bat
echo "Running the batch script..."
call "%ANDROID_DISTRIBUTE_BAT_PATH%"

到这里配置完成,点击保存即可

2.Bat文件编写

set语句就是设置了变量的路径值。真正执行构建语句的只有

%UNITY_PATH% -projectPath %PROJECT_PATH% -buildTarget android -executeMethod GameEditor.APKBuild.ExportAPKManual -logfile - -batchMode -quit -GMMode

这一句调用了刚才我们编写的APKBuild.ExportAPKManual(因为我这个脚本在GameEditor命名空间,所以调用的时候前面要有GameEditor.,你不在这个命名空间可以去掉)

set UNITY_PATH="C:\Program Files\Unity\Hub\Editor\2022.3.26f1\Editor\Unity.exe"
set PROJECT_PATH="%WORKSPACE%\Test_Game"
set BUNDLE_TOOL_PATH="%WORKSPACE%\jenkins_scripts\Tools\bundletool-all-1.18.0.jar"
set APK_NAME=TestFreeStyle_29_.apk
set EXPORT_APK_PATH="%WORKSPACE%\Export\TestFreeStyle_29_.apk"
set BUILD_AAB=true
set GOOGLE_PLAY_AAB_PATH="%WORKSPACE%\Export\googlePlay.aab"
set OUT_PUT_APKS_PATH_1="%WORKSPACE%\Export\output_1.apks"
set OUT_PUT_APKS_PATH_2="%WORKSPACE%\Export\output_2.apks"
set SAMSUNG_S9_PATH="%WORKSPACE%\jenkins_scripts\Tools\Samsung_S9.json"


%UNITY_PATH% -projectPath %PROJECT_PATH% -buildTarget android -executeMethod GameEditor.APKBuild.ExportAPKManual -logfile - -batchMode -quit -GMMode
echo "Export apk and aab success"

echo "this is android_distribute.bat end"

3.在Jenkins执行构建

四.总结

        这个基本没啥坑可以踩,基本不会出啥问题,大体思路就是,通过Jenkins来调用一些Shall或者Bat命令,这些命令再去调用之前在Unity中写的一些打包脚本就可以了。