自動構建環境搭建

由於最近一家公司接觸到這些東西,這裏總結一下,有些東西沒有深刻,瞭解了一下。沒有作具體的展開,只作了一個流程整理。有空作一個詳細的展開吧。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,文檔之類的資源共享平臺。

相關文章
相關標籤/搜索