2021-09-22

Unity2020.3.5 通过Jenkins 自动化打apk

打包的流程分成三步
一、Jenkins一键 打ab包+导出Gradle 工程
二、Jenkins 通过Gradle工程打出apk
三、Jenkins 将apk 复制到共享盘里

以上三步可以合成一个Jenkins 任务一键操作完毕

项目用Svn管理
Windows 系统打包
Assetbundle 是通过Grameframwork 的打包系统进行构建

在用Invoke Unity3d editor 之前需要在jenkins 插件管理的地方下载unity3d 插件。 并重启。然后找到全局工具配置 Global tools Configuration的地方配上jdk 的路径,unity3d 的路径和gradle 路径。jdk用的就是unity 自带的jdk 路径。主要还是jenkins 安装的时候指定的jdk 路径有关。不知道安装时是指向哪里,可以查看jenkins安装目录下的jenkins.xml

在选择Gradle 之前,需要在Jenkins 的全局工具配置里将Gradle 的地址填上,不能直接用Unity 本身下载好的Gradle 。试了没用,没深研究为啥不行。这里的Gradle 是通过AndroidStudio把gradle 工程导入,生成之后的一个gradle 文件夹里拿来的。

具体路径C:\Users\pc.gradle\wrapper\dists\gradle-6.8-bin\1jblhjyydfkclfzx1agp92nyl\gradle-6.8,
C:\Users\pc 是本机用户 1jblhjyydfkclfzx1agp92nyl 也不知道是啥就点进去找,最后找到有bin文件夹的就是我们要拿出去用的gradle-6.8。放在我们指定的文件夹内。

2021-09-22

2021-09-222021-09-22
在Jenkins 的配置处 Configure System
配一下环境变量,也可以试试不配。我当时就一股脑全部配了去。
2021-09-22
以上是Jenkins 的环境配置

以下开始构建
一、一键 打ab包+导出Gradle 工程
2021-09-22
在Jenkins 里新建一个任务,输入名称,点击Freestyle project 点击ok。
2021-09-22
左边的工具栏中,点击配置,进入配置界面
在General 模块中,勾选This project is parameterized ,将需要传进的参数 添加到面板中
2021-09-22
在General 的最下面 有个高级选项,勾选使用自定义的工作空间。这里可以将工作空间特定指向本身的工程。而不需要Jenkins 自己的工作空间。在之前这里我碰到一个坑就是没有指定工作空间,导致一直用不了构建里面的invoke unity3d editor ,当时一直报一个Gradle build failed 。

  • What went wrong:
    Execution failed for task’ :launcher:mergeReleaseResources’.
    不知道是不是跟这个有关系,没有深究。总之后面我加了指定的工作空间就没有这个问题了。
    2021-09-22
    在源码管理这一块中,先要去Jenkins 插件管理中下载subversion 插件。才会显示sub 选项。
    2021-09-22
    这里主要注意的就是Check out strategy 最好是选择 Use ‘svn update’ as much as possible,with ‘svn revert’ before update. 这一点就是可以让版本永远和主干一致,本地改动就会被清理掉。

构建触发器和构建环境 暂时没用上

最后到构建的环节,最最重要的一部分。
2021-09-22
-batchmode -projectPath $Project_Path -logFile $Log_GradleDir$DataTable_Path\buildAB$BundleVersion.log -executeMethod AssetBundleBuilder.Build -buildTarget $BuildTarget -datatable_path $DataTable_Path -quit

2021-09-22
-batchmode -projectPath $Project_Path -logFile $Log_GradleDir$DataTable_Path\build\set_define_symbol.log -executeMethod BuildScripts.SetDefineSymbols -buildTarget $BuildTarget -symbols $Symbols -quit
2021-09-22

最后,导出export
-batchmode -projectPath $Project_Path -logFile $Log_GradleDir$DataTable_Path\build\build_Gradle_$BundleVersion.log -executeMethod AndroidBuilder.BuildGradleProject -exportPath $ExportPath -bundleversion $BundleVersion -destinationPath $Destination_Path -il2cpp $Il2cpp -quit
2021-09-22

 private void BuildGradle()
 {
		PlayerSettings.SetScriptingBackend(BuildTargetGroup.Android, CmdParam.il2cpp);

        if (String.IsNullOrEmpty(CmdParam.exportPath))
        {
            Debug.LogError("输出路径为空");
            return;
        }

        if (Directory.Exists(CmdParam.exportPath))
        {
            Debug.Log("删除");
            Directory.Delete(CmdParam.exportPath, true);//删除原来的文件夹
        }
        Directory.CreateDirectory(CmdParam.exportPath);//重新建一个,因为这里有svn管理,打出后能看出什么地方做了修改

        string[] levelStrings;
        levelStrings = GetBuildScenes();//获取场景

        EditorUserBuildSettings.exportAsGoogleAndroidProject = true;//设置导出
        EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle;
        EditorUserBuildSettings.SetBuildLocation(BuildTarget.Android, CmdParam.exportPath);

        var buildReport = BuildPipeline.BuildPlayer(levelStrings,
            CmdParam.exportPath,
            BuildTarget.Android,
            CmdParam.buildOptions);
        if (buildReport.summary.result != UnityEditor.Build.Reporting.BuildResult.Succeeded)
        {
            int exitCode = 1;
            string msg = "";
            msg += "BuildInternal -------------------\n";
            msg += exitCode + " : totalErrors " + buildReport.summary.totalErrors + "\n";
            msg += buildReport.summary.outputPath + "\n";

            msg += "---------------------------------";
            Debug.Log(msg);

            EditorApplication.Exit(exitCode);
        }
 }

最后打包完成后,需要将当前导出的gradle 目录里的assets 文件夹和 jnilibs 文件夹复制到第二步里面打apk的母包demo工程里。你没看错,我们导出的gradle 工程并不是要打apk的工程,它是一个临时的工程,只是用来更新我们的资源和代码,而我们会有一个母包demo 里面是更新sdk 的相关内容。这样可以让项目模块化,查错的时候更加清晰。

回到任务工具栏,选择Build now/Build with Parameters 就开始构建任务了。
可以在build history 里查看日志和进度。

二、Jenkins 通过Gradle工程打出apk

通过上面的描述,打Android包需要拷贝的文件夹就两个,ios 的可能会不一样,但大致不会变太多,这里没有做测试。

回归正题,我们同样再在Jenkins 里新建一个任务。配上Svn地址和工作空间地址。忘了说,这里是保证Jenkins 和工程是在一个服务器里。

这里的配置就很简单,连参数都不需要传递

2021-09-22
直接到构建模块,这里选择Invoke Gradle。保存之后点击build now

三、Jenkins 将apk 复制到共享盘里
最后一步 是用.bat 处理的复制粘贴。后面会优化,目前用的是window 所以没关系。
2021-09-22

set “dateStr=%date:0,4%%date:5,2%%date:~8,2%”
set “timeStr=%time:0,2%%time:3,2%%time:~6,2%”
set "Path= E:\share\rx-builds\APK\android\Rx_dev_%dateStr%_%timeStr%
IF NOT EXIST %Path% MD %Path%
copy D:\works\android\RX_GradleDemo\launcher\build\outputs\apk\debug*debug*.apk %Path%
copy D:\works\android\RX_GradleDemo\launcher\build\outputs\apk\release*release*.apk %Path%

上一篇:Unity基于Android Studio调用Android方法


下一篇:Vue 简单的全局指令