目錄
本文要實現的功能:
- 在本地編寫代碼,編譯通過後提交到Github/SVN.
- 服務器的Jenkins檢測到有代碼提交到Github,自動或者手動編譯,生成發佈版本的代碼。
- 然後Jenkins調用FTP工具(或者一個批處理命令)將發佈版本的代碼傳到IIS網站的目錄下。
- 實現提交代碼後,一鍵編譯,直接訪問。
工具介紹:
- jenkins:Java平臺一種持續集成工具,可以實現自動化的發佈,當然.net平臺也有,但還沒了解。實質就是它可以用配置的方式自動調用很多程序,實現自動化。
- MSBuild:.net 平臺的編譯工具,我們用vs編譯項目時,其實vs內部也是調用的MSBuild.
- Git/:代碼管理工具
- nuget:用於還原項目所引用的nuget包
- node.js 編譯vue
- webpack vue項目打包
開始安裝:
既然jenkins是自動執行某些工具來實現我們的功能,那我們就先把所有步驟手動執行一次,如果沒有問題,那麼配置到jenkins上肯定也沒有問題。以下工具都是在服務器上安裝,我用的是虛擬機,win server 2008r2
- 安裝IIS, 小夥,如果你連IIS都不會安裝,就先別學jenkins了。^^
- 安裝.net framework4.6 在線安裝:http://download.microsoft.com/download/1/4/A/14A6C422-0D3C-4811-A31F-5EF91A83C368/NDP46-KB3045560-Web.exe ,如果如果安裝過,或有其他版本,建議卸載。
- 安裝TargetingPack .NET Framework 4.6 Targeting Pack是一個程序包,使開發人員能夠使用Visual Studio 2013,Visual Studio 2012或第三方IDE構建面向.NET Framework 4.6的應用程序。 官網下載:https://www.microsoft.com/en-us/download/details.aspx?id=48136
- nuget.exe 官網下載:https://www.nuget.org/downloads
- 安裝git 官網下載:https://git-scm.com/downloads
- jenkins 官網下載:https://jenkins.io/zh/
將測試項目源代碼(也可以從github中拉取到本地)test放到C:\inetpub\wwwroot目錄,執行完下面的命令後會把項目需要的包都還原。
在cmd中輸入 :
C:\Progra~2\NuGet\nuget.exe restore C:\inetpub\wwwroot\test\myobj.sln
顯示下面這樣,證明nuget是沒問題的:
接下來是安裝msbuild,直接在我電腦的vs安裝目錄下找到MSBuild文件夾,考到服務器中。(C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional)
測試MSBuild是否可用:
C:\progra~2\MSBuild\15.0\Bin\MSBuild.exe /t:Build /p:Configuration=Release /p:WebProjectOutputDir=C:\inetpub\wwwroot\test\myweb\bin\v1 /p:OutputPath=C:\inetpub\wwwroot\test\myweb\bin\v1\bin C:\inetpub\wwwroot\test\myobj.sln
顯示下面是可以用:
編譯後v1文件夾中就出現發佈後的文件:(可以把它配置到IIS上,看看編譯後的程序能不能跑起來)
以上的步驟就是,編寫代碼》提交代碼》將代碼拉取到服務器》編譯》發佈,所有步驟我們都手動完成了,接下來就是用jenkins把這些步驟自動完成。
下面是後來寫的blog,公司沒用git ,代碼管理用的svn。
jenkins配置:
下面的構建我全都用的windows batch 命令,所以不用安裝插件,如果你安裝了msbuild的插件,在“Global Tool Configuration”配置路徑即可,我用命令程序路徑什麼的我是直接寫到了腳本中。
新建項目:
點擊確定後進入到項目的配置頁面:
後臺構建:構建>增加構建步驟>Execute Windows batch command(構建步驟是有順序的,可以拖動排序)
//構建步驟1:用nuget還原包引用
D:\Progra~1\NuGet\nuget.exe restore D:\progra~1\Jenkins\workspace\Imanager\test\OES.sln
//構建步驟2:使用MSBuild編譯程序, WebProjectOutputDir是輸出文件夾,progra~1是路徑簡寫,因爲命令中單詞不可以有空格
d:/progra~1/micros~1\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe /t:Build /p:Configuration=Release /p:WebProjectOutputDir=C:\v1 /p:OutputPath=C:\v1\bin D:\progra~1\Jenkins\workspace\Imanager\test\OES.sln
前臺構建:在jenkins裏要建三個構建步驟,"Execute Windows batch command",分開執行
//構建步驟3:進入到vue項目目錄,還原包
cd D:\progra~1\Jenkins\workspace\Imanager\test\OES.Admin\ImanagerHtml
npm install
//構建步驟4:執行編譯
cd D:\progra~1\Jenkins\workspace\Imanager\test\OES.Admin\ImanagerHtml
npm run build
//構建步驟5:進入vue根目錄,把編譯生成的dist文件夾內容全部複製到c:\v1\html 中,參數"/e"表示:複製目錄和子目錄,包括空的,"/y"表示:禁止提示以確認改寫一個現存目標文件
cd D:\progra~1\Jenkins\workspace\Imanager\test\OES.Admin\ImanagerHtml
xcopy dist c:\v1\html /e /y
構建步驟2 和 構建步驟5 相當於編譯後發佈到了同臺服務器,如果web服務器和 jenkins不在一臺機器上,可用powershell遠程拷貝
$remoteDirPath="\\DESKTOP-9KAK340\remote"
Write-Host '連接遠程主機...'
net use $remoteDirPath "zzl" /user:"lind"
Write-Host '遞歸拷貝文件(強制覆蓋模式)...'
$files = Get-ChildItem -Path "C:\Jenkins_Publish " # 獲取本地目錄下的文件
foreach($file in $files) {
Copy-Item -Path $file.FullName -Destination $remoteDirPath -Include "*" -Exclude "" -Recurse -Force
}
Write-Host '目錄拷貝完成!'
團隊使用:
在服務器部署完本地可用http://localhost:8080,如果公司網絡沒有限制的話 http://外網地址:8080 也可以訪問
在Jenkins主界面,“Manage Jenkins”》“Configure Global Security”
管理員增加其他成員:在Jenkins主界面,“Manage Jenkins”》Manage Users,同樣,增加成員後要在安全矩陣中分配權限
優化問題:構建前端項目時,我是寫到一個"Execute Windows batch command"的,但是不知道爲什麼執行完npm install,後面的代碼就沒有執行,所有就像上面寫的,單獨執行是沒問題的。
cd D:\progra~1\Jenkins\workspace\Imanager\test\OES.Admin\ImanagerHtml
npm install
npm run build
xcopy dist c:\v1\html /e /y
其他問題:
- 在服務器端build前端vue項目時,服務器環境的Node.js環境要和本地開發環境一樣,即相同的node版本,webpback版本也要一致。
- vm中我用的winserver2008r2 只有橋接模式才能聯網,不知道爲什麼。
- 手動在命令行裏執行命令時要以管理員模式運行,之前代碼放到了C盤,在編譯時生成新文件會提示沒有權限無法寫入。
- 現在用的vs是2017,.net framework版本4.6.1,把vs安裝目錄的 D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild 複製到服務器中編譯時總是不通過,原因:可能是vs版本問題,在編譯時要用到D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE 裏面的東西,所以要把MSBuild和同級的Common7也複製到服務器中。(更粗暴的方式:直接在服務器安裝和開發環境一樣的Visual Studio)
關於自己:
擅長.NET B/S結構,做過【Web系統】 【BI數據分析系統】 【CMS內容管理系統】 【微信平臺相關開發(公衆號,小程序)】
熟悉Linux Centos系統
QQ 1229145381(推薦) 微信:hanpanpan1326 備註:CSDN
-------------------------
2019/8/15更新
在使用的有個需求是:每次構建時想屏蔽web.config,文件,就是即使web.config提交了,構建時也不會發布,解決方案:
msbuild時先發布到臨時文件夾,再用xcopy將臨時文件賦值到iis對應的目錄,這裏要用一個參數exclude 來屏蔽特定文件。
將需要屏蔽的文件放到exclude.txt中即可
xcopy d:\webs\IFuture\temp d:\webs\IFuture /s/e/y/exclude:c:\Enterprise\exclude.txt