由於最近一家公司接觸到這些東西,這裏總結一下,有些東西沒有深刻,瞭解了一下。沒有作具體的展開,只作了一個流程整理。有空作一個詳細的展開吧。html
1 搭建代碼管理工具好比git或者svn之類,在構建機上登錄一個帳號可以獲取須要構建的資源,方便後邊在腳本里邊自動updatejava
2 針對不一樣的項目實現相應的更新編譯打包腳本,方便後邊web服務器調用,我的用vs用的比較多,這裏用vs舉例。python
第一步:編譯git
第一種:用devenv作參數啓動進行編譯,網上又具體的例子,這個只能編譯解決方案,也就是sln後綴的解決方案文件,只要是vs支持的項目均可以編譯,好比C#、C++、VB.NET等。具體的項目設置能夠預先在解決方案和項目配置中設置好,web
下邊爲具體的參數。這個devenv的路徑能夠寫死或者直接寫到環境變量中ajax
devenv {/build|/clean|/rebuild|/deploy} SolnConfigName SolutionName[/project ProjName] [/projectconfig ProjConfigName]
第二種:能夠用MSBuild來編譯,這個是微軟實現的開源編譯工具,不過我我的看不大懂代碼··這能夠用來編譯解決方案,也能夠用來編譯單獨的項目:
在bat腳本中如數下邊的代碼能夠導入MSBuild:
set "str=HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\14.0_Config" for /f "tokens=2*" %%a in ('reg query "%str%" /v ShellFolder 2^>nul') do set "a=%%b" set a=%a%VC\vcvarsall.bat
示例:下邊爲調用示例數據庫
MSBuild ..\ExercisePrj.sln /t:Rebuild /P:WarningLevel=2;Configuration=Release;Platform=x86;DebugType=none;outdir=..\Release\;ApplicationIcon=..\Release\Resources\test.ico /flp1:errorsonly;logfile=build.errjson
上邊兩種方式均可以生成日誌文件,指定生成的目錄。小程序
第二步:打包,把剛纔編譯生成的結果文件打包成文件就能夠了,windows
根據不一樣的打包工具寫腳本就能夠了,打包就又不少選擇了
1 能夠用vs來作打包項目,不過這玩意很差使··之前有用過,用的很少,得益於vs的傻瓜式操做,基本看下提示就知道了,網上也教程的。這個生成的是一個msi安裝包和一個exe引導程序。exe沒什麼用。不是太支持定製化需求
2 能夠用advance,這個功能比較多,支持簽名,註冊,寫註冊表等等的操做,有可視化的界面來編輯他本身的項目文件,而後能夠直接調用advance主程序作參數啓動。能夠生成msi或者exe程序
3 NSIS,網上有通用的腳本,改改就能夠了,支持不少操做,包括寫註冊表、com註冊等等的複雜操做,好像只能生成exe。下邊是一個ebook的示例,註釋很詳細了,具體能夠改,這個支持卸載覆蓋安裝註冊和寫註冊表之類的操做。很好很強大
;增長一個包含連接內容的7z壓縮包到可執行文件頭部,使7-Zip打開看不到其餘內容。 !packhdr temp.dat 'cmd /c Copy /B temp.dat /B +輕狂志.7z temp.dat' ; 安裝程序初始定義常量 !define PRODUCT_NAME "eBook Workshop" !define PRODUCT_VERSION "v1.5簡體中文加強版" !define PRODUCT_PUBLISHER "輕狂志" !define PRODUCT_WEB_SITE "http://www.flighty.cn" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" SetCompressor lzma ; ------ MUI 現代界面定義 (1.67 版本以上兼容) ------ !include "MUI.nsh" ; MUI 預約義常量 !define MUI_ABORTWARNING !define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_RIGHT !define MUI_HEADERIMAGE_BITMAP "top.bmp" !define MUI_PAGE_HEADER_TEXT "最終用戶許可協議" !define MUI_PAGE_HEADER_SUBTEXT "您必須接受此協議才能繼續安裝!" !define MUI_LICENSEPAGE_TEXT_TOP "要閱讀協議的其他部分請按 PgDn鍵 往下翻頁。" !define MUI_LICENSEPAGE_TEXT_BOTTOM "若是你已經仔細閱讀了許可協議,點擊 下一步(N) > 繼續安裝。" !define MUI_LICENSEPAGE_BUTTON "下一步(&N) >" !define MUI_ICON "eBook Workshop.ico" !define MUI_UNICON "eBook Workshop.ico" !define MUI_WELCOMEFINISHPAGE_BITMAP "eBook Workshop.bmp" !define MUI_WELCOMEPAGE_TITLE "\r\n eBook Workshop v1.5安裝嚮導" !define MUI_WELCOMEPAGE_TEXT "\r\n eBook Workshop(E書工場)是將 HTML 頁面文件、圖片、Flash等捆綁成 EXE 電子文檔的製做軟件。\r\n\r\n 相比原程序,本安裝包主要進行了如下加強:\r\n 一、更換兩套更爲美觀的E書工具欄圖標,使用時更改安裝目錄下的Buttons文件夾便可;二、新增239個圖標,分別位於Icon 二、Icon 三、Icon 4 這個3個文件夾內;三、集成了多個精美的E書主題界面,安裝便可使用。四、安裝過程當中能夠自動註冊軟件爲正式版本,無任何功能限制。\r\n\r\n $_CLICK" !define MUI_FINISHPAGE_RUN_TEXT "運行 eBook Workshop" !define MUI_FINISHPAGE_SHOWREADME_TEXT "查看 安裝說明" ; 歡迎頁面 !insertmacro MUI_PAGE_WELCOME ; 許可協議頁面 !insertmacro MUI_PAGE_LICENSE "許可協議.rtf" ; 組件選擇頁面 !insertmacro MUI_PAGE_COMPONENTS ; 安裝目錄選擇頁面 !insertmacro MUI_PAGE_DIRECTORY ; 安裝過程頁面 !insertmacro MUI_PAGE_INSTFILES ; 安裝完成頁面 !define MUI_FINISHPAGE_RUN "$INSTDIR\MAKER.exe" !define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\說明.txt" !insertmacro MUI_PAGE_FINISH ; 安裝卸載過程頁面 !insertmacro MUI_UNPAGE_INSTFILES ; 安裝界面包含的語言設置 !insertmacro MUI_LANGUAGE "SimpChinese" ; 安裝預釋放文件 !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ; ------ MUI 現代界面定義結束 ------ Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" OutFile "Setup.exe" InstallDir "$PROGRAMFILES\eBook Workshop" ;讀取註冊中的鍵值,若是沒有,就按默認路徑。 InstallDirRegKey HKCU "Software\eBook Workshop" "" ShowInstDetails show ShowUnInstDetails show BrandingText "輕狂志www.flighty.cn" Section "主程序" SEC01 SectionIn RO SetOutPath "$INSTDIR" SetOverwrite ifnewer File /r "eBook Workshop\主程序\*.*" CreateDirectory "$SMPROGRAMS\eBook Workshop" CreateShortCut "$SMPROGRAMS\eBook Workshop\eBook Workshop.lnk" "$INSTDIR\MAKER.exe" CreateShortCut "$DESKTOP\eBook Workshop.lnk" "$INSTDIR\MAKER.exe" SectionEnd Section "主題風格" SEC02 SetOutPath "$INSTDIR\Themes" File /r "eBook Workshop\Themes\*.*" SectionEnd Section "按鈕圖標" SEC03 SetOutPath "$INSTDIR" File /r "eBook Workshop\按鈕圖標\*.*" SectionEnd Section -AdditionalIcons WriteIniStr "$INSTDIR\輕狂志.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" CreateShortCut "$SMPROGRAMS\eBook Workshop\輕狂志.lnk" "$INSTDIR\輕狂志.url" CreateShortCut "$SMPROGRAMS\eBook Workshop\卸載程序.lnk" "$INSTDIR\uninst.exe" SectionEnd Section -Post WriteUninstaller "$INSTDIR\uninst.exe" WriteRegStr HKCU "Software\eBook Workshop" "" $INSTDIR WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" WriteRegStr HKCU "Software\Ada99\eBook Workshop" "AdaName" "QVNXb3Jk" WriteRegStr HKCU "Software\Ada99\eBook Workshop" "AdaKey" "NzE5RkJGNzEtMzUzQjQzNDQtQjcwQ0IxQTk=" WriteRegDWORD HKCU "Software\Ada99\eBook Workshop" "Language" 0x000003a8 SectionEnd #-- 根據 NSIS 腳本編輯規則,全部 Function 區段必須放置在 Section 區段以後編寫,以免安裝程序出現未可預知的問題。--# ; 區段組件描述 !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SEC01} "將 HTML 頁面文件、圖片、Flash等捆綁成 EXE 電子文檔的製做軟件。" !insertmacro MUI_DESCRIPTION_TEXT ${SEC02} "多個精美的E書主題界面,安裝便可使用。" !insertmacro MUI_DESCRIPTION_TEXT ${SEC03} "二百多個圖標,分別位於Icon 二、Icon 三、Icon 4 這個3個文件夾內。" !insertmacro MUI_FUNCTION_DESCRIPTION_END /****************************** * 如下是安裝程序的卸載部分 * ******************************/ Section Uninstall Delete "$INSTDIR\*.*" Delete "$SMPROGRAMS\eBook Workshop\*.lnk" Delete "$DESKTOP\eBook Workshop.lnk" RMDir "$SMPROGRAMS\eBook Workshop" RMDir /r "$INSTDIR\Themes\銀色蘋果" RMDir /r "$INSTDIR\Themes\新奇前衛" RMDir /r "$INSTDIR\Themes\前衛幻想深綠色" RMDir /r "$INSTDIR\Themes\前衛幻想綠色" RMDir /r "$INSTDIR\Themes\前衛幻想藍色" RMDir /r "$INSTDIR\Themes\靈界軍團" RMDir /r "$INSTDIR\Themes\藍色妖姬v2005" RMDir /r "$INSTDIR\Themes\藍色妖姬" RMDir /r "$INSTDIR\Themes\藍色心情" RMDir /r "$INSTDIR\Themes\金屬時代" RMDir /r "$INSTDIR\Themes\簡約之美" RMDir /r "$INSTDIR\Themes\黃色之旅" RMDir /r "$INSTDIR\Themes\黃昏幻想" RMDir /r "$INSTDIR\Themes\海洋之心v2005" RMDir /r "$INSTDIR\Themes\海洋之心" RMDir /r "$INSTDIR\Themes\古色古香" RMDir /r "$INSTDIR\Themes\半成卷軸" RMDir /r "$INSTDIR\Themes\Wood" RMDir /r "$INSTDIR\Themes\WinXP" RMDir /r "$INSTDIR\Themes\Water" RMDir /r "$INSTDIR\Themes\ThemeXP" RMDir /r "$INSTDIR\Themes\POPO2004_3" RMDir /r "$INSTDIR\Themes\POPO2004_2" RMDir /r "$INSTDIR\Themes\POPO2004" RMDir /r "$INSTDIR\Themes\Ocean" RMDir /r "$INSTDIR\Themes\Notepad" RMDir /r "$INSTDIR\Themes\New-Royale" RMDir /r "$INSTDIR\Themes\New-PantherS" RMDir /r "$INSTDIR\Themes\New-Mento" RMDir /r "$INSTDIR\Themes\New-Element" RMDir /r "$INSTDIR\Themes\New-Dogmax" RMDir /r "$INSTDIR\Themes\Mustang" RMDir /r "$INSTDIR\Themes\Metal" RMDir /r "$INSTDIR\Themes\MacOSX" RMDir /r "$INSTDIR\Themes\Love" RMDir /r "$INSTDIR\Themes\G-star" RMDir /r "$INSTDIR\Themes\GreenWinXP" RMDir /r "$INSTDIR\Themes\ExoBUD MP" RMDir /r "$INSTDIR\Themes\BlueWinXP" RMDir /r "$INSTDIR\Themes\BlueLove" RMDir /r "$INSTDIR\Themes\Apple" RMDir /r "$INSTDIR\LANGUAGE" RMDir /r "$INSTDIR\Buttons" RMDir /r "$INSTDIR\Buttons 2" RMDir /r "$INSTDIR\Icon" RMDir /r "$INSTDIR\Icon 4" RMDir /r "$INSTDIR\Icon 3" RMDir /r "$INSTDIR\Icon 2" RMDir "$INSTDIR\Themes" RMDir "$INSTDIR" ;卸載註冊表中的軟件註冊鍵值 DeleteRegKey /ifempty HKCU "Software\Ada99\eBook Workshop" ;卸載註冊表中安裝路徑的鍵值 DeleteRegKey /ifempty HKCU "Software\eBook Workshop" DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" SetAutoClose true SectionEnd #-- 根據 NSIS 腳本編輯規則,全部 Function 區段必須放置在 Section 區段以後編寫,以免安裝程序出現未可預知的問題。--# Function onGUIInit BrandingURL::Set /NOUNLOAD "200" "0" "0" "http://www.flighty.cn" FunctionEnd Function .onGUIEnd BrandingURL::Unload FunctionEnd Function un.onInit MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您確實要徹底移除 $(^Name) ,及其全部的組件?" IDYES +2 Abort FunctionEnd Function un.onUninstSuccess HideWindow MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地從您的計算機移除。" FunctionEnd
這裏有幾個問題:
1》 定製需求:由於公司的產品會有標準本以及定製UI的定製需求,好比替換一些資源文件之類的,這些能夠經過bat腳原本複製後替換,而後打包
2》版本控制: 以上邊的vs項目舉例子,vs生成的dll和exe文件版本號能夠經過AssemblyInfo來設置的,設置一些公司信息和版本號,也支持簽名。這個若是用手動改的話就比較麻煩了無法作到自動化,由於這個文件的格式是已知的,因此能夠寫一個小程序每次動態的修改這個文件來控制編譯,這樣編譯出來的文件就帶相應的信息了。能夠把定製的公司信息也經過svn來管理而後拷貝過來直接編譯。至於版本號能夠獲取svn或者git的版本號來做爲版本號。至於簽名文件我沒試過在vs中使用,能夠嘗試
上邊是編譯的時候修改,這樣有點麻煩,或者侷限,還有一種是生成之後修改生成的exe程序,這樣聽起來有點想黑客同樣,由於理論上編譯之後的文件應該不能修改,有一個工具能夠修改windows下的可執行文件的相關資源信息,百度下resource hacker,能夠修改exe的相關信息,好比公司或者版本號。簽名能夠用微軟官方提供的SignTool.exe程序。須要準備好證書文件。
打包之後的文件能夠拷貝的一個指定的目錄。方便後邊下載使用。
3 編譯和打包腳本弄好,須要一個簡單的web服務端來調用,同時控制腳本的執行,由於本人沒有web開發的經驗,這裏用asp.net mvc寫一個簡單的頁面,簡單的實現下。在一個指定目錄下獲取全部bat腳本,而後顯示到web頁就好了。
這裏用了一個靜態變量來緩存當前執行的任務,實際應該用一個簡單的數據庫來緩存,這樣能夠在web頁查詢執行的狀態。這裏能夠隨便用什麼實現一個簡單的web服務端就好了好比python或者java都行。
const string root = @"E:\bats\"; static List<string> TaskList = new List<string>(); private static object lockobj = new object(); public IActionResult BatList() { ViewData["Message"] = "Bat List page."; var dir = new DirectoryInfo(root); var bats = dir.EnumerateFiles("*.bat").Select(f=>f.Name).AsEnumerable() ; ViewData["Bats"] = bats; return View(); } [Produces("application/text")] [HttpPost] public IActionResult DoBat(string file) { var msg = $"{DateTime.Now.ToString()}:{file}"; var fullpath = root + file; if(TaskList.Contains(fullpath)) return new JsonResult($"{DateTime.Now.ToString()}:{file} allready run"); ProcessStartInfo startInfo = new ProcessStartInfo(fullpath); startInfo.WindowStyle = ProcessWindowStyle.Normal; startInfo.CreateNoWindow = true; startInfo.UseShellExecute = true; var pro= Process.Start(startInfo); lock(lockobj) { TaskList.Add(fullpath); } pro.Exited += Pro_Exited; Log(msg); return new JsonResult(msg); } private void Pro_Exited(object sender, EventArgs e) { var pro = sender as Process; var task = pro.StartInfo.FileName; Remove(task); } void Log(string msg) { using (StreamWriter sw = new StreamWriter(root + "log.txt",true)) { sw.WriteLine(msg); } } void Remove(string task) { lock (lockobj) { if (TaskList.Contains(task)) TaskList.Remove(task); } }
cshtml文件主要代碼以下:
@{ var list = ViewData["Bats"] as IEnumerable<string>; foreach (var f in list) { <a href="#" onclick="getInfo('@(f)')">@f</a> <br /> } }
連接的執行方法寫的比較彆扭,勉強能用吧:
function getInfo(file) { $.ajax({ url: '/home/DoBat?file='+file, type: 'POST', data: JSON.stringify({file:file}), contentType: 'application/json;charset=UTF-8', datatype:"json", success: function (result) { alert(result); } }) }
4 web服務端弄好了,能夠在局域網內訪問,進行打包服務,下邊須要一個下載安裝包的途徑,這裏推薦兩個方式:
第一個搭一個ftp服務器,windows下能夠直接用iis搭一個ftp服務器,很方便,吧生成安裝包的目錄掛上ftp就好了。
或者http的文件服務器。好比hfs,很簡單,能夠直接指定目錄,這玩意不穩定,死機了重啓就行了。
到這自動構建的環境就完成。
除此以外:
還須要的環境,下邊的沒什麼研究,
1 審批平臺,svn或者git的審批平臺,用來作代碼review的。有一個開源的工具,這個暫時沒研究
2 測試平臺,就用禪道就能夠了,湊合使了,
3 wiki,文檔之類的資源共享平臺。