主頁 >  其他 > 【游戲開發進階】教你Unity通過Jenkins實作自動化打包,打包這種事情就交給策劃了(保姆級教程 | 命令列打包 | 自動構建)

【游戲開發進階】教你Unity通過Jenkins實作自動化打包,打包這種事情就交給策劃了(保姆級教程 | 命令列打包 | 自動構建)

2021-07-21 15:14:12 其他

文章目錄

      • 一、前言
      • 二、Jenkins簡介
      • 三、Jenkins的下載與安裝
        • 1、JDK下載與安裝
        • 2、Jenkins下載
        • 3、Jenkins安裝
        • 4、Jenkins初始化
      • 四、Jenkins的基本操作
        • 1、關閉Jenkins
          • 1.1、方式一:暴力殺行程(不推薦)
          • 1.2、方式二:以管理員身份執行 net stop jenkins
          • 1.3、方式三:通過jenkins.exe來關閉,jenkins stop
        • 2、啟動Jenkins
          • 2.1、方式一:以管理員身份執行 net start jenkins
          • 2.2、方式二:通過jenkins.exe來啟動,jenkins start
        • 3、修改埠號
        • 4、新建賬號
        • 5、修改密碼
        • 6、安裝插件
          • 6.1、方式一:通過Manage Plugins安裝(需要科學上網)
          • 6.2、方式二:CLI命令列安裝(需要科學上網)
          • 6.3、方式三:離線環境安裝插件
        • 7、創建并執行任務:Hello World
        • 8、執行帶引數的任務
        • 9、執行python任務
        • 10、周期性觸發執行任務
      • 五、實戰:Unity + Jenkins
        • 1、Unity Demo工程
          • 1.1、創建Demo工程
          • 1.2、切換Android平臺
          • 1.3、設定JDK、Android SDK、Gradle
          • 1.4、設定包名
          • 1.5、測驗打包
        • 2、撰寫Editor打包工具
          • 2.1、Editor打包工具代碼
          • 2.2、執行Editor打包工具選單
        • 3、命令列呼叫Unity靜態函式:打包函式
          • 3.1、Unity命令列模式
          • 3.2、命令引數解釋
          • 3.3、批處理腳本
          • 3.4、Unity打包工具接收命令列引數
        • 4、Jenkins呼叫bat腳本
        • 5、拓展:python加強版腳本
      • 六、完畢

一、前言

嗨,大家好,我是新發,
前幾天我寫了一篇文章,【游戲開發進階】教你自制離線Maven倉庫,實作Unity離線環境使用Gradle打包(Unity | Android | 谷歌 | Gradle),里面我提到了Unity使用Jenkins實作自動化打包,
在這里插入圖片描述
不過那篇文章中我只是一筆帶過,沒有細說具體操作流程,今天,我就專門寫一篇關于Unity通過Jenkins實作自動化打包的教程吧~

特別說明:
我的電腦系統環境是Windows 10,所以下面的操作環境都是在Windows 10系統下的,

二、Jenkins簡介

相信很多人都知道Jenkins,不過為了照顧萌新,我這里還是簡單說下Jenkins是什么,

Jenkins官網:https://www.jenkins.io/

Jenkins是一個開源軟體專案,是基于Java開發的一個持續集成工具(CI),具有友好的操作界面,主要用于持續、自動的構建/測驗軟體專案、監控外部任務的運行,它可以在Tomcat等流行的servlet容器中運行,也可獨立運行,通常與版本管理工具(SCM)、構建工具結合使用,常用的版本控制工具有SVNGIT,構建工具有MavenAntGradle

注:
什么是集成?
代碼由編譯、發布和測驗、直到上線的一個程序,
什么是持續集成?
高效的、持續性的不斷迭代代碼的集成作業,

這樣講好像也不是很直觀,沒關系,它就是一個工具,我們學會使用它就好,下面我來一步步教大家如何使用Jenkins

三、Jenkins的下載與安裝

1、JDK下載與安裝

因為Jenkins是基于Java開發的,要運行Jenkins需要Java環境,即JDK,所以我們需要先安裝下JDK
JDK下載:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
根據你的系統環境選擇對應的JDK下載,
在這里插入圖片描述
下載下來后雙擊即可執行安裝,安裝程序沒什么,這里就不啰嗦了,
安裝完畢后,配置一下JDK環境變數
最后在命令列中輸入java -version,如果能正常輸出版本號,則說明JDK環境弄好了,
在這里插入圖片描述

2、Jenkins下載

進入Jenkins官網:https://www.jenkins.io/
點擊Download
在這里插入圖片描述
根據你的系統和環境選擇對應的安裝包,因為我是Windows系統,所以我下載Windows版的安裝包,
在這里插入圖片描述
下載下來是一個msi檔案,
在這里插入圖片描述

3、Jenkins安裝

雙擊jenkins.msi,執行安裝,設定一下安裝路徑,
在這里插入圖片描述
選擇Run service as LocalSystem(即使用本地系統賬號)
在這里插入圖片描述
設定埠號,比如我設定為8075,然后點擊Test Port按鈕測驗一下埠有沒有被占用,
在這里插入圖片描述
確認埠沒被占用后,點擊Next
在這里插入圖片描述
設定JDK所在的路徑,
在這里插入圖片描述
繼續Next
在這里插入圖片描述
點擊Install開始安裝,
在這里插入圖片描述
注意,安裝程序中可能會彈出360提醒,選擇允許即可,
完整完畢,
在這里插入圖片描述

4、Jenkins初始化

上面安裝完畢后會自動啟動Jenkins服務,我們可以在任務管理器中看到一個Java的行程,它就是Jenkins的服務行程,
在這里插入圖片描述
我們在瀏覽器中訪問 http://localhost:8075,此時會顯示需要解鎖Jenkins,如下
在這里插入圖片描述
我們找到這個initialAdminPassword檔案,使用文本編輯器打開它,
在這里插入圖片描述
可以看到里面是一串密碼,我們復制它,
在這里插入圖片描述
回到瀏覽器頁面中,在管理員密碼欄中粘貼剛剛的密碼,然后點擊繼續,
在這里插入圖片描述
接下來是插件安裝界面,因為Jenkins插件的下載需要翻墻,所以如果你可以科學上網,則點擊安裝推薦的插件,當然也可以先不安裝插件,后續有需要再安裝對應的插件即可,
在這里插入圖片描述
如果是離線環境(比如內網環境),則點擊跳過插件安裝(下文我會教如何在離線環境下安裝插件),
在這里插入圖片描述
接著創建管理員賬號,
在這里插入圖片描述
完成,進入Jenkins主頁,
在這里插入圖片描述

四、Jenkins的基本操作

1、關閉Jenkins

1.1、方式一:暴力殺行程(不推薦)

上面我們說到,在任務管理器中可以看到一個Java行程,它就是Jenkins的服務行程,
在這里插入圖片描述
如果你直接暴力殺掉這個Java行程,那么Jenkins也就關閉了,不過不建議這么做,

1.2、方式二:以管理員身份執行 net stop jenkins

以管理員身份運行命令net stop jenkins,如下(我是使用管理員身份運行PowerShell來執行命令的)
在這里插入圖片描述

注意,如果你不是以管理員身份執行上面的命令,則會提示發生系統錯誤 5
如下(普通賬號權限下通過cmd執行命令)
在這里插入圖片描述
如何以管理員身份運行cmd?
進入cmd所在目錄:
C:\Users\linxinfa\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\System Tools
在這里插入圖片描述
右鍵命令提示符,點擊以管理員身份運行即可,
在這里插入圖片描述
如果覺得麻煩的話,也可以直接在系統的開始選單那里直接以管理員身份運行PowerShell
在這里插入圖片描述

1.3、方式三:通過jenkins.exe來關閉,jenkins stop

進入Jenkins的安裝目錄,如下,
在這里插入圖片描述
在地址欄輸入cmd,然后執行jenkins stop,如下,與上面的效果是一樣的,
在這里插入圖片描述

2、啟動Jenkins

2.1、方式一:以管理員身份執行 net start jenkins

以管理員身份執行命令net start jenkins,如下
在這里插入圖片描述

2.2、方式二:通過jenkins.exe來啟動,jenkins start

進入Jenkins的安裝目錄,
在這里插入圖片描述
執行命令jenkins start,如下
在這里插入圖片描述
如果想重啟Jenkins,則執行jenkins restart,如下
在這里插入圖片描述

3、修改埠號

先關閉Jenkins,進入Jenkins的安裝目錄,可以看到里面有一個jenkins.xml,使用文本編輯器打開它,
在這里插入圖片描述
--httpPort的埠改為別的,比如我改成8076
在這里插入圖片描述
重新啟動Jenkins服務,在瀏覽器中使用新的埠進行測驗,能夠正常訪問則說明埠修改成功了,
在這里插入圖片描述

4、新建賬號

Jenkins可能需要多人登錄,我們可以新建一些賬號供其他人登錄,
Jenkins主頁的左側欄中點擊Manage Jenkins
在這里插入圖片描述
接著點擊Manager Users
在這里插入圖片描述
然后點擊Create User
在這里插入圖片描述
輸入要創建的新賬號的賬號密碼,點擊創建即可,
在這里插入圖片描述
創建成功,可以看到多了一個賬號了,
在這里插入圖片描述
我們可以退出當前賬號,使用這個新賬號登錄,
在這里插入圖片描述
登錄成功,
在這里插入圖片描述

5、修改密碼

點擊賬號的齒輪按鈕,
在這里插入圖片描述
修改Password,點擊Save即可,
在這里插入圖片描述

6、安裝插件

6.1、方式一:通過Manage Plugins安裝(需要科學上網)

Manage Jenkins頁面中,點擊Manage Plugins
在這里插入圖片描述
搜索需要的插件名稱進行安裝即可(需要能科學上網才行)
在這里插入圖片描述

6.2、方式二:CLI命令列安裝(需要科學上網)

Jenkins CLI就是Jenkins的命令列工具,類似于MacOS的終端,
我們可以在JenkinsManage Jenkins頁面中看到Jenkins CLI,點擊進入,
在這里插入圖片描述
點擊jenkins-cli.jar
在這里插入圖片描述
把下載下來的jenkins-cli.jar放到Jenkins安裝目錄中,
在這里插入圖片描述
接著我們就可以通過命令來操作Jenkins了,具體命令引數可以看Jenkins CLI頁面,
在這里插入圖片描述
我們可以看到安裝插件的引數是install-plugin
在這里插入圖片描述
點擊去可以看到具體的使用方法,
在這里插入圖片描述
我們進入jenkins-cli.jar所在的目錄,通過下面的命令即可安裝插件,(注意埠根據你的Jenkins的實際埠號而定)

java -jar jenkins-cli.jar -s http://localhost:8075/ 插件名

如果不清楚插件名可以上Jenkins的插件官網查看:https://plugins.jenkins.io/
在這里插入圖片描述
Maven Integration插件為例,搜索Maven Integration,點擊搜索到的插件,
在這里插入圖片描述
點擊Releases頁面,即可看到,插件名就是maven-plugin:3.12
在這里插入圖片描述
對應的插件安裝命令就是:

java -jar jenkins-cli.jar -s http://localhost:8075/ maven-plugin:3.12

注意,你可能會提示

ERROR: anonymous is missing the Overall/Read permission

我們需要在Configure Global Security中勾選專案矩陣授權策略,給Anonymous添加Administer權限即可,
在這里插入圖片描述

6.3、方式三:離線環境安裝插件

上面兩種方式都需要聯網,而我們有可能需要把Jenkins部署在離線環境的電腦上(比如內網),這個時候就只能通過離線安裝的方式了,
這個時候,我們需要先在有網路(能科學上網)的電腦上下載安裝插件,
安裝好的插件可以在這個目錄中找到:
C:\Windows\System32\config\systemprofile\AppData\Local\Jenkins\.jenkins\plugins
在這里插入圖片描述
將其拷貝到內網機的相同路徑中,然后重啟Jenkins即可,

7、創建并執行任務:Hello World

我以創建一個HelloWorld任務為例來演示一下,
點擊New Item
在這里插入圖片描述
輸入任務名,比如HelloWorld,點擊Freesytyle project,點擊OK
在這里插入圖片描述
輸入任務描述,
在這里插入圖片描述
Build選項選擇Execute Windows batch command(即批處理,也就是我們說的bat
在這里插入圖片描述
然后在Command中撰寫我們要執行的bat命令,比如

echo "Hello World"

如下
在這里插入圖片描述
最后點擊保存,
在這里插入圖片描述
這樣我們的任務就創建成功了,我們可以點擊Build Now來執行這個任務,
在這里插入圖片描述
F5重繪一下瀏覽器,可以看到任務執行的進度,
在這里插入圖片描述
執行完后我們可以查看對應的日志,
在這里插入圖片描述
從日志中我們可以看到我們輸出的Hello World
在這里插入圖片描述

8、執行帶引數的任務

有時候我們需要創建帶引數的任務,
我們勾選This project is parameterized,然后點擊Add Parameter,可以看到它提供了多種型別的引數,
在這里插入圖片描述
我以選擇項引數為例,
在這里插入圖片描述
分別填寫引數名、選項(每個選項一行)、描述,
在這里插入圖片描述
撰寫bat命令,
在這里插入圖片描述
點擊Build with Parameters,然后設定好引數,
在這里插入圖片描述
最后點擊Build
在這里插入圖片描述
執行完畢可以看到輸出日志,結果正確,
在這里插入圖片描述

9、執行python任務

我們看到任務Build中并沒有Phython的選項,
在這里插入圖片描述
但我們又想要讓Jenkins可以執行Python,怎么辦呢?很簡單,在batcall python就好啦,
在這里插入圖片描述
其中python代碼如下:

print("Hello, I am python")

最后執行任務,輸出日志如下,結果正確,
在這里插入圖片描述

10、周期性觸發執行任務

有時候我們需要周期性地執行任務,比如每天8點觸發一次執行任務,或者每隔30分鐘觸發一次執行任務,
Build Triggers(觸發器)中勾選Build periodically
在這里插入圖片描述
然后在Schedule中撰寫規則,
格式:
MINUTE HOUR DOM MONTH DOW

欄位說明取值范圍
MINUTE分鐘0~59
HOUR小時0~23
DOM一個月中的第幾天1~31
MONTH1~12
DOW星期0~7(0和7代表的都是周日)

語法:
*:匹配范圍內所有值,例:* * * * *
M-N:匹配M~N范圍內所有值,例:10-30 * * * *
M-N/X:在指定M~N范圍內每隔X構建一次,例:10-30/5 * * * *
*/X:整個有效區間內每隔X構建一次,例:*/30 * * * *
A,B,...,Z:匹配多個值,例:10,20,30 * * * *

關于符號H:
為了在系統中生成定時任務,符號H(代表Hash,后面用散列代替)應該用在可能用到的地方,例如:為十幾個日常任務配置0 0 * * *將會在午夜產生較大峰值,相比之下,配置H H * * *仍將每天一次執行每個任務,不是都在同一時刻,可以更好的使用有限資源,

符號H可用于范圍,例如,H H(0-7) * * *代表凌晨0:00到 上午7:59一段時間,

符號H在一定范圍內可被認為是一個隨機值,但實際上它是任務名稱的一個散列而不是隨機函式,

案例:
30分鐘構建一次

H/30 * * * *

2小時構建一次

H H/2 * * *

每天早上8點構建一次

0 8 * * *

每天的8點12點22點,一天構建3

0 8,12,22 * * *

每前半小時中每隔10分鐘構建一次

H(0-29)/10 * * * *

每個作業日從早上9點45分開始到下午4點45分結束這段時間內每間隔2小時45分鐘那一刻構建一次

45 9-16/2 * * 1-5

每月(除了12月)從1號15號這段時間內某刻構建一次

H H 1,15 1-11 *

好了,案例就列舉這么多了,

現在,為了演示,我設定為每隔1分鐘執行一次,
在這里插入圖片描述
命令如下,
在這里插入圖片描述
可以看到它每分鐘就觸發執行一次任務,
在這里插入圖片描述

在這里插入圖片描述

五、實戰:Unity + Jenkins

下面我演示一下通過Jenkins來呼叫Unity打包AndroidAPK
我先畫個流程圖,方便大家理解:
在這里插入圖片描述

現在,我們開始吧,

1、Unity Demo工程

1.1、創建Demo工程

創建一個Unity工程,
在這里插入圖片描述
簡單弄點東西,
在這里插入圖片描述

1.2、切換Android平臺

點擊 File / Build Settings選單,切換成Android平臺,
在這里插入圖片描述

1.3、設定JDK、Android SDK、Gradle

點擊Edit / Preferences,在External Tools中設定好JDKAndroid SDKGradle
在這里插入圖片描述

1.4、設定包名

Player Settings中設定一下包名,比如com.linxinfa.test
在這里插入圖片描述

1.5、測驗打包

添加要打包的場景,手動點擊Build,測驗一下是否能正常打出APK
在這里插入圖片描述
可以正常打出APK,說明打包環境設定都正確,
在這里插入圖片描述

2、撰寫Editor打包工具

2.1、Editor打包工具代碼

新建一個Editor檔案夾,
在這里插入圖片描述
Editor檔案夾中新建一個BuildTools腳本,
在這里插入圖片描述
BuildTools.cs腳本代碼如下:

using UnityEngine;
using UnityEditor;

public class BuildTools 
{
    [MenuItem("Build/Build APK")]
    public static void BuildApk()
    {
        BuildPlayerOptions opt = new BuildPlayerOptions();
        opt.scenes = new string[] { "Assets/Scenes/SampleScene.unity" };
        opt.locationPathName = Application.dataPath + "/../Bin/test.apk";
        opt.target = BuildTarget.Android;
        opt.options = BuildOptions.None;

        BuildPipeline.BuildPlayer(opt);

        Debug.Log("Build App Done!");
    }
}
2.2、執行Editor打包工具選單

點擊選單Build / Build Apk
在這里插入圖片描述
可以正常打出APK
在這里插入圖片描述

3、命令列呼叫Unity靜態函式:打包函式

3.1、Unity命令列模式

Unity提供了命令列模式給開發者,我們可以寫bat腳本來呼叫Unity中的靜態函式,比如我們的打包函式,
格式:
Unity程式 -引數 -projectPath 工程地址 -executeMethod 靜態函式
例:

"D:\software\Unity\2021.1.7f1c1\Editor\Unity.exe" ^
-quit ^
-batchmode ^
-projectPath "E:\UnityProject\UnityDemo" ^
-executeMethod BuildTools.BuildApk  ^
-logFile "E:\UnityProject\UnityDemo\output.log"

注:為了閱讀方便,命令我寫成多行,在bat中連接多行的符號是^

我們可以在Unity官方手冊看到具體的命令引數說明:https://docs.unity3d.com/Manual/CommandLineArguments.html
在這里插入圖片描述

3.2、命令引數解釋

-batchmode
在 批處理模式下運行Unity,它不會彈出視窗,當腳本代碼在執行程序中發生例外或其他操作失敗時Unity將立即退出,并回傳代碼為1

-quit
命令執行完畢后將退出Unity編輯器,請注意,這可能會導致錯誤訊息被隱藏(但他們將顯示在Editor.log檔案)

-buildWindowsPlayer <pathname>
構建一個32位Windows平臺的exe(例如:-buildWindowsPlayer path/to/your/build.exe

-buildWindows64Player <pathname>
構建一個64位Windows平臺的exe(例如:-buildWindows64Player path/to/your/build.exe

-importPackage <pathname>
匯入一個的package,不會顯示匯入對話框

-createProject <pathname>
根據提供的路徑建立一個空專案

-projectPath <pathname>
打開指定路徑的專案

-logFile <pathname>
指定輸出的日志檔案

-nographics
當運行在批處理模式,不會初始化顯卡設備,不需要GPU參與;但如果你需要執行光照烘焙等操作,則不能使用這個引數,因為它需要GPU運算,

-executeMethod <ClassName.MethodName>
Unity啟動的同時會執行靜態方法,也就是說,使用executeMethod我們需要在編輯檔案夾有一個腳本并且類里有一個靜態函式,

-single-instance
在同一時間只允許一個游戲實體運行,如果另一個實體已在運行,然后再次通過-single-instance啟動它的話會調節到現有的這個實體,

-nolog
不產生輸出日志, 通常output_log.txt被寫在游戲輸出目錄下的*_Data檔案夾中,

3.3、批處理腳本

我們知道,一個Unity工程只能打開一個實體,所以如果我們已經手動用Unity打開了工程,此時執行下面這個命令是會報錯的,

"D:\software\Unity\2021.1.7f1c1\Editor\Unity.exe" ^
-quit ^
-batchmode ^
-projectPath "E:\UnityProject\UnityDemo" ^
-executeMethod BuildTools.BuildApk ^

報錯如下:

Aborting batchmode due to fatal error:
It looks like another Unity instance is running with this project open.
Multiple Unity instances cannot open the same project.

我們需要先判斷Unity是否在運行中,如果是,則先將舊的Unity實體行程殺掉,對應的bat代碼如下:

::判斷Unity是否運行中
TASKLIST /V /S localhost /U %username%>tmp_process_list.txt
TYPE tmp_process_list.txt |FIND "Unity.exe"
 
IF ERRORLEVEL 0 (GOTO UNITY_IS_RUNNING)
ELSE (GOTO START_UNITY)
 
:UNITY_IS_RUNNING
::殺掉Unity
TASKKILL /F /IM Unity.exe
::停1秒
PING 127.0.0.1 -n 1 >NUL
GOTO START_UNITY

:START_UNITY
:: 此處執行Unity打包

另外,我們想要在執行打包時傳入一些引數,比如APP名字版本號等,可以在命令中加上,格式可以自定義,我們只需在后面的C#代碼中進行相應的決議即可,例:

--productName:%1 --version:%2

其中%1表示引數1%2表示引數2
完整命令如下:

"D:\software\Unity\2021.1.7f1c1\Editor\Unity.exe" ^
-quit ^
-batchmode ^
-projectPath "E:\UnityProject\UnityDemo" ^
-executeMethod BuildTools.BuildApk ^
--productName:%1 ^
--version:%2

整合上面的Unity行程判斷,最終完整的bat代碼如下:

::判斷Unity是否運行中
TASKLIST /V /S localhost /U %username%>tmp_process_list.txt
TYPE tmp_process_list.txt |FIND "Unity.exe"
 
IF ERRORLEVEL 0 (GOTO UNITY_IS_RUNNING)
ELSE (GOTO START_UNITY)
 
:UNITY_IS_RUNNING
::殺掉Unity
TASKKILL /F /IM Unity.exe
::停1秒
PING 127.0.0.1 -n 1 >NUL
GOTO START_UNITY

:START_UNITY
:: 此處執行Unity打包
"D:\software\Unity\2021.1.7f1c1\Editor\Unity.exe" ^
-quit ^
-batchmode ^
-projectPath "E:\UnityProject\UnityDemo" ^
-executeMethod BuildTools.BuildApk ^
-logFile "E:\UnityProject\UnityDemo\output.log" ^
--productName:%1 ^
--version:%2

將上面的bat代碼保存為build_app.bat,我們通過命令列去執行這個build_app.bat,如下:
在這里插入圖片描述
可以看到此時能打出APK
在這里插入圖片描述
在輸出的日志檔案中我們也可以看到我們Debug.Log輸出的日志,
在這里插入圖片描述

3.4、Unity打包工具接收命令列引數

雖然我們上面的bat腳本傳遞了包名和版本號兩個引數,但是我們在Unity的打包工具中并沒有對這兩個引數進行決議,現在,我們補上決議引數的邏輯吧,

// 決議命令列引數
string[] args = System.Environment.GetCommandLineArgs();
foreach (var s in args)
{
    if (s.Contains("--productName:"))
    {
        string productName= s.Split(':')[1];
        // 設定app名字
        PlayerSettings.productName = productName;
    }

    if (s.Contains("--version:"))
    {
        string version = s.Split(':')[1];
        // 設定版本號
        PlayerSettings.bundleVersion = version;
    }
}

打包工具完整代碼如下:

// BuildTools.cs
using UnityEngine;
using UnityEditor;

public class BuildTools
{
    [MenuItem("Build/Build APK")]
    public static void BuildApk()
    {
        // 決議命令列引數
        string[] args = System.Environment.GetCommandLineArgs();
        foreach (var s in args)
        {
            if (s.Contains("--productName:"))
            {
                string productName= s.Split(':')[1];
                // 設定app名字
                PlayerSettings.productName = productName;
            }

            if (s.Contains("--version:"))
            {
                string version = s.Split(':')[1];
                // 設定版本號
                PlayerSettings.bundleVersion = version;
            }
        }
       
        // 執行打包
        BuildPlayerOptions opt = new BuildPlayerOptions();
        opt.scenes = new string[] { "Assets/Scenes/SampleScene.unity" };
        opt.locationPathName = Application.dataPath + "/../Bin/test.apk";
        opt.target = BuildTarget.Android;
        opt.options = BuildOptions.None;

        BuildPipeline.BuildPlayer(opt);

        Debug.Log("Build App Done!");
    }
}

重新執行命令:
在這里插入圖片描述
然后我們安裝一下APK,看看APP名字是不是哈哈哈
在這里插入圖片描述
在應用資訊里可以看到版本號也是我們命令列中設定的1.2.0.0
在這里插入圖片描述

4、Jenkins呼叫bat腳本

我們回到Jenkins頁面中,創建一個帶引數的任務,
appName引數:
在這里插入圖片描述

version引數:
在這里插入圖片描述
命令列:
E:\UnityProject\UnityDemo\bat\build_app.bat %appName% %version%,如下:
在這里插入圖片描述
執行Jenkins任務,如下:
在這里插入圖片描述
等等運行結果:
在這里插入圖片描述
執行完畢,我們看下輸出的日志,
在這里插入圖片描述
可以看到我們的bat腳本被正確執行了,引數也傳遞正確,
在這里插入圖片描述
APK也可以正常生成,
在這里插入圖片描述
安裝到模擬器上,可以看到名字正確,
在這里插入圖片描述
版本號也正確,
在這里插入圖片描述
流程走通了,剩下的就是根據自己的需求進行擴展啦,比如打包前先執行一下svn更新之類的,需要額外引數,就在Jenkins中添加,傳遞到bat腳本中,再傳遞到Unity中,最后根據引數進行打包,

5、拓展:python加強版腳本

我個人其實不是特別喜歡寫bat腳本,我更喜歡寫pytho,于是,我就寫了個python版的腳本,腳本中我加了監控Unity日志輸出的邏輯,方便進行一些判斷,畫個圖:
在這里插入圖片描述
python完整代碼如下:

import os
import sys
import time
 
# 設定你本地的Unity安裝目錄
unity_exe = 'D:/software/Unity/2021.1.7f1c1/Editor/Unity.exe'
# unity工程目錄,當前腳本放在unity工程根目錄中
project_path = 'E:/UnityProject/UnityDemo'
# 日志
log_file = os.getcwd() + '/unity_log.log'
 
static_func = 'BuildTools.BuildApk'
 
# 殺掉unity行程
def kill_unity():
    os.system('taskkill /IM Unity.exe /F')
 
def clear_log():
    if os.path.exists(log_file):
        os.remove(log_file)
 
# 呼叫unity中我們封裝的靜態函式
def call_unity_static_func(func):
    kill_unity()
    time.sleep(1)
    clear_log()
    time.sleep(1)
    cmd = 'start %s -quit -batchmode -projectPath %s -logFile %s -executeMethod %s --productName:%s --version:%s'%(unity_exe,project_path,log_file,func, sys.argv[1], sys.argv[2])
    print('run cmd:  ' + cmd)
    os.system(cmd)
 
    
 
# 實時監測unity的log, 引數target_log是我們要監測的目標log, 如果檢測到了, 則跳出while回圈    
def monitor_unity_log(target_log):
    pos = 0
    while True:
        if os.path.exists(log_file):
            break
        else:
            time.sleep(0.1) 
    while True:
        fd = open(log_file, 'r', encoding='utf-8')
        if 0 != pos:
            fd.seek(pos, 0)
        while True:
            line = fd.readline()
            pos = pos + len(line)
            if target_log in line:
                print(u'監測到unity輸出了目標log: ' + target_log)
                fd.close()
                return
            if line.strip():
                print(line)
            else:
                break
        fd.close()
 
if __name__ == '__main__':
    call_unity_static_func(static_func)
    monitor_unity_log('Build App Done!')
    print('done')

我們把腳本保存為build_app.py
在這里插入圖片描述
Jenkins中的命令改為執行python腳本:
call python E:\UnityProject\UnityDemo\bat\build_app.py %appName% %version%
如下:
在這里插入圖片描述
執行一下任務,
在這里插入圖片描述
耐心等待執行結果,
在這里插入圖片描述
執行完畢可以看到監控到的日志,
在這里插入圖片描述
我們在python中輸出的日志都可以在JenkinsConsole Output中看到,
在這里插入圖片描述
APK順利生成,Very Good,完美~
在這里插入圖片描述

六、完畢

好了,就寫這么多吧,我是新發,喜歡我的可以點贊、關注,有任何技術上的疑問歡迎評論或留言~

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289405.html

標籤:其他

上一篇:猜數字小游戲(C語言版)

下一篇:Python計算機視覺——影像內容分類

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more