背景html
項目上須要作UWP的自動安裝包,在之前的公司接觸的是TFS來作自動build。 公司要求用Jenkins 來作,別笑話我,以前還真不曉得這個東西。shell
會的同窗請看一下指出錯誤,不會的同窗請先自行腦補,咱們一步一步的來。windows
首先咱們準備2個安裝包,Jenkins,NuGet 都下載最新的好了。瀏覽器
1. 安裝Jenkins,下一步下一步。安裝好了會自動瀏覽器跳轉到http://localhost:8080/ 以下圖服務器
按照提示去C:\Program Files (x86)\Jenkins\secrets\initialAdminPassword文件中把一串GUID拷進去,而後點Continue,等待。app
第一次玩的同窗就選默認讓它安裝建議的插件好了。再次等待。。。完成以後是建立帳號,小夥伴記住本身的帳號哦。我在弄的過程由於忘記帳號了。。還從新安裝過。。測試
若是要重裝,記得卸載以後刪掉C:\Program Files (x86)\Jenkins 這個目錄ui
、this
填完以後就開始使用吧。。gogospa
新建一個job
選擇第一個而後填個名字,點ok
到構建中,建立一個Execute Windows batch command
將下面代碼拷進去
D:\Jenkins_Test\Tools\nuget.exe restore "D:\Jenkins_Test\Projects\App1\App1.sln" -ConfigFile "C:\Users\xxxx\AppData\Roaming\NuGet\NuGet.Config" -NoCache
這裏我講一下,咱們事先在D盤建立了Jenkins_Test的文件夾,它下面的Tools文件夾是存放前面下載的nuget.exe。
restore 是 nuget 的一個命令,就是說把你項目D:\Jenkins_Test\Projects\App1\App1.sln須要的app package都按需下載下來。跟你用VS 編譯項目的時候提示的restoring package是同樣的。
後面的-ConfigFile 是指定configFlie,若是不寫的話。默認是%AppData%\NuGet\NuGet.config is used. 咱們這裏使用的是你登錄windows 的xxxx帳號下面的這個文件.
具體這些命令是幹什麼的。。還有哪些其餘命令,請查看 nuget.exe-cli-reference. 記得改掉xxxx爲你本身的帳號。
接下來咱們須要建立一個Windows powershell。這須要去下載powershell for jenkins的插件。
保存以後 點擊Jenkins 回到主頁面。
點擊 系統管理,而後在右邊選擇點擊 管理插件,在可選插件 項目下搜索Powershell,勾選點擊直接安裝。
安裝完畢以後咱們回到主頁,再次點擊 剛纔新建的Test1 項目,進入以後點擊配置。
此次在構建中,咱們選擇 Windows PowerShell。
拷貝下面code進去。
# Path to Msbuild tool # $msbuild = "[Path to MsBuild.exe. See below for reference]" $msbuild = "C:\Program Files (x86)\MSBuild\14.0\bin\MSBuild.exe" set-alias msbuild $msbuild # solution settings # $sln_name = "[Path to Solution File. See below for reference]" $sln_name = "D:\Jenkins_Test\Projects\App1\App1.sln" $vs_config = "Release" $vs_platfom = "ARM" # call the build method Write-Host "Building solution`n" -foregroundcolor Green msbuild $sln_name /t:Build /p:Configuration=$vs_config /p:Platform=$vs_platfom /v:q /nologo
填好以後咱們就能夠保存,返回以後,點擊 馬上構建。。以下圖。。等待build結果。
這裏咱們將會遇到第一個坑,我加粗以表示重要。
build失敗,咱們點擊下前面紅色的球球。。查看日誌。
CSC : error CS0006: Metadata file 'C:\windows\system32\config\systemprofile\.nuget\packages\System.ComponentModel\4.0.0\ref\netcore50\System.ComponentModel.dll' could not be found [D:\Jenkins_Test\Projects\App1\ClassLibrary1\ClassLibrary1.csproj]
坑1
能夠看到的是nuget store 是成功了,可是在build的時候它跑去找C:\windows\system32\config\systemprofile\.nuget\packages\ 下面的的packpage了,查看本地這個文件夾,根本就沒有.nuget。
而.nuget實際上是在咱們當前user下面的 C:\Users\xxxx
大量查看網上都沒有查到有用的信息,而當我查看 Jenkins 系統管理-系統信息的時候我發現 Jenkins 默認的home就是在C:\windows\system32\config\systemprofile這個下面,並且這是咱們裝系統的時候默認本地帳號的位置。
想到這裏我想第一件要作的事就是把home給改爲C:\Users\xxxx。
最後我經過修改Jenkins 服務經過這個坑。。
進入service,找到jenkins的服務。點擊屬性-登錄 能夠看到默認是本地帳號
那麼咱們須要修改成 你當前系統登錄的帳號。點擊此帳號,進去瀏覽,搜索到你當前登錄的帳號而後點擊肯定,記得重啓服務。
再次查看jenkins 系統信息,已經看到home更改了。。去點擊 當即建立。。。等待build完成。。
能夠看到球球變成了藍色,編譯成功了。
這樣咱們就完成了自動編譯。。這個使用場景我想應該是在代碼服務器check in的時候自動作編譯來檢查 代碼是否正確與否。
固然確定須要寫一些觸發,本文沒有作更多研究,有興趣的同窗能夠本身研究交流。
下面咱們要作App 包,就是那樣給測試使用以及上傳商店的包。
咱們新建另外一個Job,好比test2.
同test1同樣到構建中,建立一個Execute Windows batch command
將下面代碼拷進去
D:\Jenkins_Test\Tools\nuget.exe restore "D:\Jenkins_Test\Projects\App1\App1.sln" -ConfigFile "C:\Users\xxxx\AppData\Roaming\NuGet\NuGet.Config" -NoCache
再建立Windows PowerShell
# Path to Msbuild tool # $msbuild = "[Path to MsBuild.exe. See below for reference]" $msbuild = "C:\Program Files (x86)\MSBuild\14.0\bin\MSBuild.exe" set-alias msbuild $msbuild # solution settings # $sln_name = "[Path to Solution File. See below for reference]" $sln_name = "D:\Jenkins_Test\Projects\App1\App1\App1.csproj" # call the build method Write-Host "Building solution`n" -foregroundcolor Green msbuild $sln_name /target:Clean /target:Rebuild /target:Publish /p:Configuration=Release /p:AppxPackageDir="D:\Jenkins_Test\AppxPackages\" /p:AppxBundle=Always /p:UapAppxPackageBuildMode=StoreUpload /p:AppxBundlePlatforms="x86|x64|arm"
值得注意的是:
1.記得先用vs 把項目跟商店裏面的項連接到一塊兒,不連接起來的話,你作出來的包也無法上傳。。
坑2 sln_name 這裏要注意 必須是啓動項.csproj並且不是.sln
保存以後,當即構建,完成以後你就能夠在D:\Jenkins_Test\AppxPackages\ 文件夾下發現你的App 包了。。
坑3
由於項目中引用的一個package 是不支持Any CPU的,因此咱們在項目裏面刪除了AnyCPU,注意咱們刪除了sln,以及各個子項目裏面的AnyCPU。
刪除了以後咱們再進行構建,毫無疑問報錯了。
C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(724,5): error : The OutputPath property is not set for project 'ClassLibrary1.csproj'. Please check to make sure that you have specified a valid combination of Configuration and Platform for this project. Configuration='Debug' Platform='AnyCPU'. You may be seeing this message because you are trying to build a project without a solution file, and have specified a non-default Configuration or Platform that doesn't exist for this project. [D:\Jenkins_Test\Projects\App1\ClassLibrary1\ClassLibrary1.csproj]
研究了半天,發現啓動項沒有問題,因而把啓動項和子project的項目文件拿來一對比。
左邊啓動項,右邊子project
由於咱們的子project也被刪除了AnyCPU ,可是默認卻仍是使用的AnyCPU項,因此這才致使咱們 nuget.exe restore 失敗的。
既然咱們這裏子project已經沒AnyCPU了,那麼咱們也把Platform設置默認x86.
修改完畢以後再次構建。。。完美! 成功。。
坑4
MSbuild commnd /target:Clean;Rebuild;Publish 在這裏必須分開寫/target:Clean /target:Rebuild /target:Publish ,否則不會識別。
命令中的路徑的文件夾名最好不要帶空格,否則也是會被認爲是非法路徑。
總結
上面就是我研究Jenkins + NuGet + MSBuild 手把手教你作自動UWP Build 和 App store包 所遇到的坑,圖有點多,但願能幫到須要的同窗。。
最近更新:
最近安裝了2017,因此一些路徑也須要修改。
1.下載最新的nuget.exe,去官網下載最新的v4.0版本,覆蓋以前v3.5的那個
2.Msbuild 的路徑改成:C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe