簡(jiǎn)介
????????通過(guò)本文可以了解到如何在windows和mac上部署Jenkins。并且通過(guò)Jenkins實(shí)現(xiàn)Unity在IOS,安卓和PC等多平臺(tái)自動(dòng)打包的功能,并且可以將打包結(jié)果通過(guò)飛書機(jī)器人同步到飛書群內(nèi)。優(yōu)化工作流,提高團(tuán)隊(duì)的開(kāi)發(fā)效率。文末記錄了實(shí)際使用Jenkins時(shí)遇到的各種問(wèn)題,以及對(duì)應(yīng)的解決方法。
????????我們團(tuán)隊(duì)工作中配置了專門的mac設(shè)備,用于處理打包任務(wù),各個(gè)職能的人可以根據(jù)自己的需要登錄到Jenkins后臺(tái)執(zhí)行對(duì)應(yīng)的打包指令。并且工作日會(huì)根據(jù)git提交情況定時(shí)自動(dòng)構(gòu)建,每天將各個(gè)平臺(tái)的構(gòu)建包,通過(guò)Testflight等方式同步給組內(nèi)的成員。
Windows平臺(tái)Jenkins安裝
Jenkins下載地址和官網(wǎng)
官網(wǎng):Jenkins
官方文檔說(shuō)明:Jenkins User Documentation
安裝步驟
選擇指定目錄
選擇域訪問(wèn)
填寫賬號(hào)和開(kāi)機(jī)密碼(如果不知道自己的賬號(hào),可以查看下方win10無(wú)法安裝的問(wèn)題處理,查看自己的賬號(hào)),點(diǎn)擊Test credentials確保賬號(hào)正確
選擇端口號(hào)
選擇jdk目錄
安裝相關(guān)問(wèn)題
報(bào)錯(cuò) service jenkins failed to start
進(jìn)入服務(wù)選擇jenkins
雙擊Jenkins,啟動(dòng)類型設(shè)置為自動(dòng)。
登錄頁(yè)簽,輸入當(dāng)前的開(kāi)機(jī)密碼。回到上個(gè)頁(yè)面點(diǎn)擊啟動(dòng)
啟動(dòng)成功后,點(diǎn)擊之前報(bào)錯(cuò)界面的retry
Windows10無(wú)法安裝問(wèn)題處理
1.搜索欄搜索管理工具
2.本地安全策略
3本地策略->用戶權(quán)限分配->右鍵作為服務(wù)登錄->屬性
添加用戶組->高級(jí)->輸入名字->立即查找->選中賬戶點(diǎn)確定
安裝界面account為下圖的用戶名,必須包含域。密碼為開(kāi)機(jī)密碼
Mac安裝Jenkins
命令行執(zhí)行 brew install jenkins
修改Jenkins工作目錄
啟動(dòng)Jenkins
輸入一開(kāi)始設(shè)置的端口號(hào)
http://127.0.0.1:8080/
初次需要輸入密碼
創(chuàng)建Unity工程
Git配置
選擇源碼管理
填入對(duì)應(yīng)git地址,選擇配置好的ssh key
如果未創(chuàng)建ssh key,按照下面的步驟創(chuàng)建ssh key
添加SSH key
選擇Ssh username with private key,
把private key 填入就可以了 (注意這里填的是私鑰-----BEGIN RSA PRIVATE KEY-----? xxx -----END RSA PRIVATE KEY----- )
構(gòu)建工程
嘗試build,成功說(shuō)明git配置正確
Windows Jenkins常用命令
啟動(dòng)
net start jenkins
關(guān)閉?
net stop jenkins
Mac Jenkins常用命令
啟動(dòng)
brew services start jenkins
停止
brew services stop jenkins
重啟
brew services restart jenkins
Jenkins配置
設(shè)置默認(rèn)工作目錄
Windows
1.修改環(huán)境變量JENKINS_HOME E:\JenkinsHome
2.修改jenkins.xml
在jenkins的安裝目錄下修改JENKINS_HOME
? <env name="JENKINS_HOME" value="%JENKINS_HOME%"/>
之后重啟jenkins
Mac
Mac下Jenkins的默認(rèn)安裝路徑為
/Users/xxx/.jenkins
對(duì)應(yīng)的配置文件config.xml也放置在該目錄下
默認(rèn)的workspace
? <workspaceDir>${JENKINS_HOME}/workspace/${ITEM_FULL_NAME}</workspaceDir>
Unity插件安裝
ManageJenkins->Manage plugins->可選插件->搜索unity 安裝對(duì)應(yīng)插件
配置Unity安裝地址
Manage Jenkins->Global ToolConfiguration
添加對(duì)應(yīng)的引擎地址
設(shè)置unity 地址C:\Program Files\Unity\Hub\Editor\2020.1.0f1c1
這里特別注意mac配置unity的話,路徑最后要以Unity.app為結(jié)尾。
在項(xiàng)目配置里構(gòu)建,添加unity命令
1.先創(chuàng)建editor腳本
先在unity的editor文件夾創(chuàng)建BuildTools
TypeScript |
確保可以正常運(yùn)行
Unity相關(guān)命令行
https://docs.unity3d.com/Manual/CommandLineArguments.html
2.jenkins工程添加editor配置
添加Invoke Unity3D Editor
選擇對(duì)應(yīng)版本
添加命令
C++ |
設(shè)置構(gòu)建文件刪除規(guī)則
參數(shù)化構(gòu)建
安裝插件 Extended Choice Parameter
添加參數(shù)
注意設(shè)置名稱,之后會(huì)作為參數(shù)。這里選的是選項(xiàng)型參數(shù),一行代表一個(gè)選項(xiàng),第一個(gè)代表默認(rèn)選項(xiàng)
選擇Build with parameters
在之后的腳本里可以通過(guò)${platform}? 獲取參數(shù)(這里的platform就是上面的參數(shù)名稱)
例子一,shell腳本直接
Bash |
例子二,unity3Deditor命令調(diào)用。這里--platform是自定義的參數(shù)可以自定義其他任意參數(shù)
Bash |
之后在unity內(nèi)的editor可以通過(guò)System.Environment.GetCommandLineArgs()獲取該參數(shù)
C# |
根據(jù)條件構(gòu)建
安裝Conditional BuildStep
在構(gòu)建步驟的時(shí)候,可以添加Conditional Step
這里添加了一個(gè)String match的條件,滿足條件(platform字段為pc時(shí))才會(huì)執(zhí)行對(duì)應(yīng)的構(gòu)建步驟.
后續(xù)的構(gòu)建步驟可以像之前的普通步驟一樣添加
Xcode構(gòu)建步驟
安裝Xcode integration 插件
在插件界面安裝Xcode integration 插件
配置登錄憑證
Manage Credentials界面,配置全局憑證
- 選擇MacOs Keychain password and path
- 描述名為login.keychain
- 路徑為/Users/{username}/Library/Keychains/login.keychain-db
- (打包機(jī)地址為/Users/xxx/Library/Keychains/login.keychain-db)
- 密碼為開(kāi)機(jī)密碼
添加X(jué)code編譯步驟
這里先按照前面的根據(jù)條件構(gòu)建,當(dāng)平臺(tái)名為ios時(shí)再進(jìn)行此操作
- 填寫Development Team ID(TeamID需要到后臺(tái)填寫)
- 勾選Use Legacy Build System
- Configuration填Release
- Xcode Schema File 填 Unity-iPhone
- 勾選Generate Archive
- Export method填ad-hoc
- 點(diǎn)開(kāi)CodeSigning
- 選擇Automatic Signing
Automatic Signing如果失敗的話,可以使用ManualSigning
需要先去develop后臺(tái)生成一個(gè)新的profile,下載之后雙擊啟用。
然后在manualSigning的uuid填入新的profile證書的uuid
uuid的查看方式是在安裝完profile之后 ,在 資源庫(kù)/MobileDevice/Provisioning Profiles/xxx.mobileprovision
這里mobileprovision文件名就是對(duì)應(yīng)的uuid可以根據(jù)安裝時(shí)間進(jìn)行查看。
- 勾選Unlock Keychain
- keyChain選擇之前設(shè)置的login.keyChain
- path填/Users/xingye/Library/Keychains/login.keychain-db
- 密碼填開(kāi)機(jī)密碼
- 點(diǎn)開(kāi)Advanced XcodeBuild options
- Xcode Project Directory填Build/XcodeProj
- Build output directory填${WORKSPACE}/Build/Ipa/
TestFlight配置
TestFlight上傳需要用到altool
Bash |
注意這里的Apikey是在appstore connect的用戶和訪問(wèn)界面的秘鑰界面生成的。生成秘鑰后可以下載對(duì)應(yīng)的p8秘鑰文件,需要將該文件放置在 users/xxx/private_keys 目錄下
apiIssuer 的id就是在用戶和訪問(wèn)界面issuer id
組內(nèi)人員需要進(jìn)行測(cè)試時(shí)請(qǐng)按照下方指南進(jìn)行操作
TestFlight使用指南
另外補(bǔ)充一些后臺(tái)需要進(jìn)行的操作
一個(gè)是需要在用戶和訪問(wèn)界面,添加需要使用testflight的測(cè)試人員的apple id
添加后會(huì)向該測(cè)試人員發(fā)送一個(gè)郵件邀請(qǐng),對(duì)方同意之后需要到應(yīng)用的TestFlight界面。
如果還沒(méi)有內(nèi)部測(cè)試組,可以先添加測(cè)試組。如果已經(jīng)存在測(cè)試組,就點(diǎn)擊已有的測(cè)試組,將新加入的開(kāi)發(fā)人員加入到測(cè)試組中
飛書機(jī)器人
添加飛書機(jī)器人
在群聊的設(shè)置中根據(jù)如下步驟添加機(jī)器人
創(chuàng)建消息發(fā)送腳本
在工程指定目錄創(chuàng)建一個(gè)python腳本feishumsg.py(這里的目錄地址為 ./toolscripts/feishumsg.py), 復(fù)制webhook地址 填到url內(nèi)
Python |
添加構(gòu)建步驟
在Jenkins后臺(tái)添加構(gòu)建步驟
填入如下命令
PowerShell |
運(yùn)行成功之后可以在對(duì)應(yīng)群聊收到消息
多用戶管理
安裝Role based Authorization Strategy插件
報(bào)錯(cuò)處理和問(wèn)題處理
1.Could not determine the dependencies of task ':launcher:compileReleaseJavaWithJavac'.> Installed Build Tools revision 31.0.0 is corrupted. Remove and install again using the SDK Manager.
原因是缺少 dx.bat? 和 dx.jar ,實(shí)際上31.0.0有d8.bat和d8.jar
進(jìn)入對(duì)應(yīng)unity的sdk目錄 C:\Program Files\Unity\Hub\Editor\2020.1.0f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\build-tools\31.0.0
命令行運(yùn)行 mklink dx.bat d8.bat
C:\Program Files\Unity\Hub\Editor\2020.1.0f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\build-tools\31.0.0\lib
命令行運(yùn)行 mklink dx.jar d8.jar
或者直接復(fù)制對(duì)應(yīng)文件
相關(guān)處理鏈接
2.Filename too long
命令行運(yùn)行如下指令
C# |
3. Couldn't set project path to? xxx xxx
這是jenkins的Unity3d Editor工具,在不傳-projectPath 參數(shù)的時(shí)候會(huì)把當(dāng)前的目錄作為參數(shù)傳入。如果傳入后拼接的地址,不是unity工程所在的目錄,就會(huì)報(bào)錯(cuò)。所以,需要在editor腳本上添加
-projectPath xx 參數(shù),最后拼接的地址為unity工程所在地址
4.An error occurred while resolving packages:One or more packages could not be added to the local file system:com.unity.ide.visualstudio: EBUSY: resource busy or locked, open 'E:\JenkinsHome\workspace\autobuild\autobuild\Library\PackageCache\.tmp9488BBGAK4gS5D9k\copy\Editor\COMIntegration\Release\COMIntegration.exe'
這個(gè)是由于Unity工程打開(kāi)的時(shí)候,出現(xiàn)的問(wèn)題。把Unity工程都關(guān)閉就行
5.ModuleNotFoundError: No module named 'requests'
運(yùn)行腳本時(shí)出現(xiàn)上面的報(bào)錯(cuò),原因是沒(méi)有對(duì)應(yīng)的requests模塊,在命令行輸入
?pip install requests,安裝requests模塊
mac上運(yùn)行 python3 -m pip install requests
相關(guān)處理鏈接
6.局域網(wǎng)其他設(shè)備無(wú)法連接Jenkins(jenkins安裝在mac上)
進(jìn)入/usr/local/opt/jenkins/homebrew.mxcl.jenkins.plist文件中的httpListenAddress修改為0.0.0.0 重啟,就能連接了
如果還不行查看是否存在 ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist文件,進(jìn)行同樣修改
7.Jenkins detected that you appear to be running more than one instance of Jenkins that share the same home directory '/Users/XXX/.jenkins’. This greatly confuses Jenkins and you will likely experience strange behaviors, so please correct the situation.
刪除 /Users/XXX/.jenkins 下的.owner文件
8.ERROR: Timeout after 10 minutes ERROR: Error fetching remote repo 'origin'
這是因?yàn)槟J(rèn)的git拉取超時(shí)是10分鐘,在clone大的項(xiàng)目的時(shí)候可能出現(xiàn)超時(shí)的情況。在源碼管理里面添加高級(jí)克隆行為參數(shù),設(shè)置超時(shí)時(shí)間即可
9.路徑問(wèn)題:在執(zhí)行bash的時(shí)候,執(zhí)行bash targetDir/xxx.sh時(shí)由于xxx.sh使用了相對(duì)路徑導(dǎo)致出錯(cuò)
通過(guò)括號(hào)+cd對(duì)應(yīng)路徑的方式可以解決該問(wèn)題 ,修改后的指令如下
Bash |
10.Jenkins執(zhí)行bash時(shí)報(bào)錯(cuò),cmake: command not found
直接在bash 命令行下執(zhí)行cmake --version,沒(méi)有報(bào)錯(cuò),說(shuō)明cmake其實(shí)已經(jīng)安裝了。是環(huán)境變量的問(wèn)題。bash命令行下執(zhí)行which cmake。查看到cmake的路徑為 /opt/homebrew/bin/cmake。之后在Jenkins后臺(tái) 系統(tǒng)管理->系統(tǒng)配置->全局屬性部分的環(huán)境變量添加對(duì)應(yīng)變量
11. 無(wú)法連接倉(cāng)庫(kù):Command "git ls-remote -h -- xxx.git HEAD" returned status code 128:
Bash |
用以下命令刷新sshkey,底下的targetAddress替換成實(shí)際的倉(cāng)庫(kù)地址(或者ip)
Bash |
刷新完之后,找到/Users/qsgdmj/.ssh/的 id_rsa(私鑰)和id_rsa_pub(公鑰),在jenkins后臺(tái)添加對(duì)應(yīng)的私鑰,在倉(cāng)庫(kù)賬戶上添加公鑰。之后可能會(huì)出現(xiàn)下方12.No ED25519 的問(wèn)題。繼續(xù)按下方解決方式處理
12.No ED25519 host key is known for git.xxx.com and you have requested strict checking
在命令行執(zhí)行g(shù)it.exe ls-remote -h -- git@git.xxx.com:xxx/xxx.git,彈出提示之后輸入yes
13.Jenkins更換ip地址后,本地訪問(wèn)localhost:8080 和通過(guò)ip訪問(wèn)均無(wú)法訪問(wèn)jenkins后臺(tái)
命令行執(zhí)行一下指令
Bash |
可以看到homebrew.mxcl.jenkins.plist配置所在的位置,打開(kāi)后修改ProgramArguments里的--httpListenAddress=本機(jī)ip。
ProgramArguments的第一個(gè)項(xiàng)為jenkins所在地址,用finder 打開(kāi)該地址/opt/homebrew/opt/jenkins/bin/jenkins
上一級(jí)目錄同樣有一個(gè)文件homebrew.mxcl.jenkins.plist。把該文件的httpListenAddress也改成本機(jī)ip(如果這一步不執(zhí)行可能出現(xiàn)每次restart jenkins時(shí),ip又被重新修改了)
還有就是修改.jenkins/目錄下的jenkins.model.JenkinsLocationConfiguration.xml,將jenkinsUrl改成新的本機(jī)地址,之后調(diào)用brew services restart jenkins
14.Jenkins 執(zhí)行時(shí),有時(shí)候出現(xiàn)構(gòu)建失敗,但是實(shí)際卻顯示成功的情況
比如下面的構(gòu)建日志,中途出現(xiàn)報(bào)錯(cuò)"Build Finished, Result: Failure." 但是最后的構(gòu)建結(jié)果卻是"Finished: SUCCESS"
C# |
添加Text Finder插件
之后添加構(gòu)建后步驟,Search files or the console log for regular expression(s)
填入之前出現(xiàn)的報(bào)錯(cuò)
15.修改Jenkins工作路徑到移動(dòng)硬盤的問(wèn)題與解決
前置工作
由于打包機(jī)為Mac,所以需要先將移動(dòng)硬盤的格式修改為APFS
移動(dòng)硬盤的格式可以右鍵->顯示簡(jiǎn)介 查看。如果已經(jīng)是APFS格式可以跳過(guò)這個(gè)步驟
具體操作是命令行輸入diskutil list
可以看到所有的硬盤信息
YAML |
可以看到信息/dev/disk6 (external, physical)
external代表移動(dòng)硬盤,disk6為該移動(dòng)硬盤的編號(hào)
之后命名行輸入
diskutil eraseDisk JHFS+ T7 disk6
T7為新的硬盤名稱,disk6為對(duì)應(yīng)編號(hào)
之后在程序塢打開(kāi)磁盤工具,選擇該移動(dòng)硬盤,選擇抹掉
之后選擇對(duì)應(yīng)的文件格式
至此硬盤設(shè)置工作完成。
工作路徑的修改
工作路徑修改到移動(dòng)硬盤會(huì)遇到一些權(quán)限問(wèn)題。具體操作為
(1)將jenkins的配置config.xml的workSpace修改為
? <workspaceDir>Volumes/T7/Workspace/JenkinsWorkspace/${ITEM_FULL_NAME}</workspaceDir>
(移動(dòng)硬盤名稱為T7,對(duì)應(yīng)路徑為Volumes/T7)
之后執(zhí)行 brew services restart jenkins 重啟jenkins
這時(shí)直接運(yùn)行會(huì)報(bào)錯(cuò)"Operation not permitted",原因是由于mac本身權(quán)限管理,導(dǎo)致Jenkins無(wú)法直接對(duì)移動(dòng)硬盤進(jìn)行操作。
(2)參照該網(wǎng)址內(nèi)的權(quán)限修改操作,設(shè)置完全磁盤權(quán)限。https://stackoverflow.com/questions/61248588/jenkins-unable-to-start-jenkins-on-an-external-hard-drive
- open terminal
- brew services stop jenkins
- System Preferences -> Security and Privacy -> Full Disk Access
- Click the lock to enable changes
- Drag and drop java_home from the finder window into the allowed list.
- brew services start jenkins
這里需要注意用which java時(shí),顯示的/usr/bin/java 實(shí)際上是一個(gè)映射,并不是正在java_home的位置
需要執(zhí)行/usr/libexec/java_home -V 可以看到真正的java_home路徑
之后重啟jenkins
(3)修改完磁盤訪問(wèn)權(quán)限,如果jenkins還是無(wú)法對(duì)移動(dòng)硬盤進(jìn)行操作,可以關(guān)閉Mac的sip設(shè)置
具體操作為
- 重啟mac,并長(zhǎng)按command+r 直到重啟進(jìn)度條出現(xiàn)。這時(shí)會(huì)進(jìn)入Mac的恢復(fù)模式
- 選擇左上角的實(shí)用工具->終端
- 命令行執(zhí)行 csrutil disable 之后重啟mac
(4)擁有磁盤權(quán)限之后,jenkins執(zhí)行任務(wù)時(shí)還可能出現(xiàn)如下問(wèn)題:未受保護(hù)的ssh key。
Plain Text |
這時(shí)候需要到Jenkins后臺(tái),將對(duì)應(yīng)的ssh key的范圍由全局修改為系統(tǒng)
至此,問(wèn)題全部解決,可以正常執(zhí)行Jenkins任務(wù)
16.unity console 報(bào)錯(cuò)Library/Bee/artifacts/mvdfrm/Unity.RenderPipeline.Universal.ShaderLibrary.ref.dll_FD8EDE77A08A7963.mvfrm
刪除Library下的Bee目錄,然后重新啟動(dòng)Unity
17.because this command failed to write the following output files: library/bee/artifacts/mvdfrm/unityengine.testrunner.ref.dll
在MacOs系統(tǒng)上,當(dāng)Unity工程放在移動(dòng)硬盤上進(jìn)行安卓打包的時(shí)候會(huì)出現(xiàn)這個(gè)問(wèn)題。原因是移動(dòng)硬盤的格式問(wèn)題??梢詤⒄諉?wèn)題15的前置工作,將移動(dòng)硬盤格式修改為APFS
18. TestFlight上傳時(shí)出現(xiàn)A required agreement is missing or has expired的報(bào)錯(cuò)
詳細(xì)報(bào)錯(cuò)內(nèi)容如下
Ada |
登錄appstore后臺(tái),發(fā)現(xiàn)是因?yàn)橛行碌脑S可證協(xié)議
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-525709.html
點(diǎn)擊協(xié)議上的鏈接同意協(xié)議即可文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-525709.html
到了這里,關(guān)于通過(guò)Jenkins實(shí)現(xiàn)Unity多平臺(tái)自動(dòng)打包以及相關(guān)問(wèn)題解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!