Unity Jenkins 自动化打包

这里默认大家jenkins和unity打包环境都是搭建好的

如果没有的话自行搜一下 把环境搭建一下

接下来就是配置Jenkins  windows+Android打包

 

到插件列表里把Unity3D插件下载一下

然后去配置一下环境

这里我配置Gradle 因为的项目是先打出android工程 然后gradle打包的

回到这里 把Unity安装路径配置一下

配置好这些就可以创建Jenkins项目了

填写个名字 点击确定

 

这里是构建参数 在这里填写 然后到Unity里接收进行打包

这里是配置好工程地址 我这里使用的是SVN 使用git自行改一下就好

这里强调一下 %WORKSPACE% 是你远程目录的地址 我是把这个python放在了 SVN目录\BuildTools\BuildScript 里

BuildAndroid.py 是我的脚本 

C:\Users\yuzixiao\AppData\Local\Programs\Python\Python35\python.exe 是我的python路径

import sys
import os
import fileinput
import subprocess
 

if __name__ == '__main__':
    
    #Jenkins传递 无需手动修改
    jenkinsParams = {
        'WorkSpace':os.environ['WorkSpace'].strip().replace('\\', '/'),
        'ProductName':os.environ['ProductName'].strip()
    } 
 
    #本地参数 需手动修改
    localParams = {
        'UnityPath':'F:\Unity\u2018420f1\Unity\Editor\Unity.exe',
        'ProjectPath':jenkinsParams['WorkSpace'] + '/unity-east',
        'LogPath':jenkinsParams['WorkSpace'] + '/OutPut/apk_log.txt',
    }
    
    print('Jenkins参数')
    print(jenkinsParams)
    print('本地参数')
    print(localParams)
    
    print('开始构建');
    
    #调用BuildEditor.BuildAPK方法 编译APK    
    cmd = '"' + localParams['UnityPath'] + '" -batchmode -projectPath "' + localParams['ProjectPath'] + '" -nographics -executeMethod CMDBuild.CMDBuildAndroid -logFile "' + localParams['LogPath'] + '" -quit '+ jenkinsParams['ProductName'];
    print(cmd);    
    subprocess.call(cmd);
        
    #在Jenkins中打印Log
    fileHandler = open(localParams['LogPath'], mode='r', encoding='UTF-8')
    report_lines = fileHandler.readlines()
    for line in report_lines:
        print(line.rstrip())
        
    print('结束构建')

unity-east 是我SVN路径下的 unity工程目录 这里是调用了 我工程里

CMDBuild.CMDBuildAndroid   CMDBuild脚本的 CMDBuildAndroid方法

using System;
using System.Collections.Generic;

using UnityEditor;
using UnityEditor.Build.Reporting;

using Debug = UnityEngine.Debug;

public class CMDBuild : Editor
{
    const string LOCATION_PATH_ANDROID = "./android.apk";
    public static void CMDBuildAndroid(){

       
        string ProductName = "";
        


        Debug.Log("------------- 接收命令行参数 -------------");
        List<string> commondList = new List<string>();
        foreach (string arg in System.Environment.GetCommandLineArgs()) {
            Debug.Log("命令行传递过来参数:" + arg);
            commondList.Add(arg);
        }

        try {
            Debug.Log("命令行传递过来参数数量:" + commondList.Count);
            ProductName = commondList[commondList.Count - 1];
           
        }
        catch (Exception e) {
            Debug.Log("接收命令行参数出错: "+e.Message);
        }

        //ProductName Jenkins穿來的參數 自行時使用
        ProjectBuildExecute(BuildTarget.Android);
       
    }


    public static void ProjectBuildExecute(BuildTarget target)
    {
 
        //Switch Platform
        SwitchPlatform(target);
 
 
   
        List<string> scenes = new List<string>();
        foreach (UnityEditor.EditorBuildSettingsScene scene in EditorBuildSettings.scenes)
        {
            if (scene.enabled)
            {
                if (System.IO.File.Exists(scene.path))
                {
                    Debug.Log("Add Scene (" + scene.path + ")");
                    scenes.Add(scene.path);
                }
            }
        }
 
       
        BuildReport report = BuildPipeline.BuildPlayer(scenes.ToArray(), LOCATION_PATH_ANDROID, target, BuildOptions.None);
        if (report.summary.result != BuildResult.Succeeded)
        {
            Debug.LogError("打包失败。(" + report.summary.ToString() + ")");
        }
        
    }
    
    private static void SwitchPlatform(BuildTarget target)
    {
 
        if (EditorUserBuildSettings.activeBuildTarget != target)
        {
            if (target == BuildTarget.iOS)
            {
                EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.iOS, BuildTarget.iOS);
            }
            if (target == BuildTarget.Android)
            {
                EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Android, BuildTarget.Android);
            }
        }
 
    }



}

整体思路就是 Jenkins传递参数给python 然后python调用Unity打包

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值