2015-10-06 153 views
8

我正在使用GitLab將我的svn repsitories遷移到git。GitLab CI和MsBuild(附帶測試)

現在我已經看到,有一個與GitLab CI持續集成的實現,只是想嘗試一下。

我已經安裝並配置了一個Runner,但是Gitlab抱怨我沒有.gitlab-ci.yml文件。

我已經在使用TeamCity進行持續集成,所以我不想花太多精力編寫構建腳本。

有誰可以告訴我在哪裏可以找到一個gitlab-ci.yml文件的基本示例,該文件基本上只是構建我的解決方案並運行所有測試(MSTests)?

+0

結帳https://about.gitlab.com/2015/06/08/implementing-gitlab-ci-dot-yml/ – Mutuma

回答

15

顯然沒有簡單的MSBuild例子,但這應該讓你開始:

variables: 
    Solution: MySolution.sln 

before_script: 
    - "echo off" 
    - 'call "%VS120COMNTOOLS%\vsvars32.bat"' 
    # output environment variables (usefull for debugging, propably not what you want to do if your ci server is public) 
    - echo. 
    - set 
    - echo. 

stages: 
    - build 
    - test 
    - deploy 

build: 
    stage: build 
    script: 
    - echo building... 
    - 'msbuild.exe "%Solution%"' 
    except: 
    - tags 

test: 
    stage: test 
    script: 
    - echo testing... 
    - 'msbuild.exe "%Solution%"' 
    - dir /s /b *.Tests.dll | findstr /r Tests\\*\\bin\\ > testcontainers.txt 
    - 'for /f %%f in (testcontainers.txt) do mstest.exe /testcontainer:"%%f"' 
    except: 
    - tags 

deploy: 
    stage: deploy 
    script: 
    - echo deploying... 
    - 'msbuild.exe "%Solution%" /t:publish' 
    only: 
    - production 

搞清楚哪些測試運行是有點棘手。我的慣例是,每個項目都有其測試項目的架構MyProject.Core.Tests命名的文件夾測試(名爲MyProject.Core項目)

正如對gitlab-CI的第一反饋

我喜歡簡單性和源代碼控制集成。但我希望能夠在執行前修改腳本(特別是在更改腳本時),但是我可以通過映像重新運行特定的提交併注入變量或更改腳本(我可以使用teamcity執行此操作)。甚至忽略一個失敗的測試並重新運行腳本(我在teamcity上做了很多)。我知道gitlab-ci不知道任何關於我的測試我只是有一個命令行返回一個錯誤代碼。

+1

你如何處理與失敗的測試。即使測試失敗,gitlab-ci也顯示所有內容都能通過。 – Eric

+1

@Eric我的解決方案有一點缺點。每個測試DLL都獨立運行並覆蓋退出代碼。所以gitlab-ci.yml只知道最後一次測試的退出代碼。 如果錯誤級別> 0,或者使用'mstest.exe /testcontainer:MyProject.Core.Tests.dll/testcontainer:MyProject.Gui.Tests.dll'在一次測試運行中運行所有測試,則可以重寫代碼以退出。 –

+0

@Eric那就是說:我轉換爲FAKE作爲一個更強大和易於使用的構建系統。我的gitlab-ci.yml構建步驟只包含一個單獨的命令'僞造或僞造測試' 它爲不同任務構建命令 http://fsharp.github.io/FAKE/apidocs/fake -mstest.html –

0

作爲附錄Jürgen Steinblock answer,我想建議的測試階段腳本simplier選擇:

variables: 
    SOLUTION_DIR: "MySolution" 
    BUILD_DIR: "Release" 
    TESTER: "vstest.console.exe" # or "mstest.exe /testcontainer:" 

before_script: 
    - call "%VS120COMNTOOLS%\vsvars32" # import in path tools like msbuild, mstest, etc using VS script 

test: 
    stage: test 
    script: 
    - for /f %%F in ('dir /s /b %SOLUTION_DIR%\%BUILD_DIR%\*Tests.dll') do set dllPath=%%F 
    - "%TESTER% %dllPath%" 

這將啓動對所有測試項目的二進制文件的測試發現,其根據約定與*Tests.dll在構建結束目錄。這具有不使用中間文件的優點。

+0

感謝您的更新,在我的解決方案中,我有一個「Test」目錄中的所有項目都是獨立構建的,所以沒有包含所有'* Test.dll'的目錄 - 直接從'dir ... | finstr ...'不起作用(不記得爲什麼)那就是爲什麼我使用文件作爲解決方法。無論如何,很長一段時間過去了,我現在的解決方案是:儘可能少地使用'.gitlab.ci文件,並使用'FAKE'作爲一個很好的構建工具! 「Tests \ ** \ bin \ ** \ *。Tests.dll」 - 「Tests \ ExludeThis \ *」++ ++「IncludeThis \ ** \ *。Tests.dll」'FileIncludes命令和幾個漂亮的命令 –

+0

@JürgenSteinblock感謝FAKE暗示(lol),我會看看它。是的,我有同樣的問題。我想這是因爲* gitlab-ce * runner API無法正確傳遞字符,我想。這就是爲什麼,經過幾次嘗試,我最終使用'''圍繞* dir *命令。 – cid

+0

請注意,每次新的測試都會覆蓋錯誤級別。所以你的gitlab測試階段只有在最後一個測試項目失敗(相當危險)時纔會失敗,查看我的回答的評論,最好的解決方案是立即運行所有測試'mstest.exe /testcontainer:MyProject.Core.Tests.dll/testcontainer:MyProject.Gui.Tests.dll' –

0

這是我最終使用的。它在一次運行中運行所有* Tests.Dll。

dir /s /b *.Tests.dll | findstr /r bin\\Debug > testcontainers.txt 
    for /f %%x in (testcontainers.txt) do set list=!list! %%x 
    set list=%list:~1% 
    vstest.console.exe %list%