好代碼是管出來的——使用GitHub實現簡單的CI/CD

  軟件開發通常來講是一項團隊做業,在本系列文章開始就提到過軟件的編碼是由一個團隊「並行」完成的,爲了保證編碼任務正常完成,首先引入版本控制工具來完成代碼管理,爲了保證代碼質量引入了代碼分析器以及代碼測試。html

  版本控制工具能夠保證代碼有一個主版本,但代碼分析和測試均是開發人員手動在本地完成的(經過編譯、執行測試等方式),在進行代碼分析和測試時可能並無將本地代碼更新到最新版本,這樣就會出現一個問題,當多個開發人員向版本庫提交代碼時,沒法保證最新代碼庫的代碼是正確的,爲了解決這個問題,提出了持續集成,持續集成的集成指的是持續的對多個開發人員編寫的代碼進行集成,本文從下面幾個方面介紹持續集成以及基於Github進行持續集成實踐:git

CI&CD

  持續集成(Continuous integration,CI)指的是在開發過程當中持續地將全部開發人員的代碼合併到代碼庫的主線上,而後對該主線代碼進行編譯、測試運行等操做對代碼進行檢驗,其目的是儘量早的發現代碼集成後致使的問題
  實現持續集成的要點主要有:共享的代碼庫、自動化編譯、自動化測試等,同時要保證合理的集成頻率,通常持續集成的時機在於開發人員將代碼提交到代碼庫時自動進行,可是若是提交過於頻繁,那麼應該使用時間間隔的形式進行持續集成。
  持續發佈(Continuous delivery,CD)其實是持續集成上的一個拓展,在持續集成的基礎上將發佈工做自動化,避免人爲操做從而減小發布時間和發佈時人爲形成的錯誤github

經常使用的持續集成工具

  持續集成通過多年的發展,在不一樣的應用場景、平臺/語言、商業化等因素下產生了許多持續集成工具,可參考(但不限於這些):  https://en.wikipedia.org/wiki/Comparison_of_continuous_integration_software
  比較經常使用的持續集成工具備:
  Jenkins
  Jenkins是一個開源的跨平臺持續集成工具,它提供了GUI界面以及大量的拓展插件,經過GUI界面能夠簡單、快速的完成項目持續集成配置,更重要的是Jenkins支持全部的版本控制工具。
  項目地址:https://jenkins.io/數據庫

  TeamCity
  TeamCity是JetBrains公司開發的持續集成工具,它有免費和收費兩種受權,免費版本的TeamCity擁有全部功能,其限制僅僅是隻能建立100個編譯配置和只能並行運行3個代理。
  項目地址:http://www.jetbrains.com/teamcity/服務器

  GitLab
  GitLab是一個Git的代碼管理工具,使用GitLab能夠輕鬆的在Linux環境搭建一個Git的遠程代碼託管平臺,同時GitLab中也內置的CI/CD功能。
  項目地址:https://about.gitlab.com/app

  Travis CI
  Travis CI是一個持續集成託管平臺,它爲開源項目提供免費支持,但Travis CI不支持Windows下編譯。
  項目地址:https://www.travis-ci.org/分佈式

  AppVeyor
  AppVeyor也是一個持續集成的託管平臺,它支持Windows和Linux,而且AppVeyor能夠對環境進行定製:https://www.appveyor.com/docs/build-environment/,是一個很是強大的CI工具,AppVeyor對開源項目提供免費支持。
  項目地址:https://www.appveyor.com/工具

  VSTS
  VSTS(Visual Studio Team Services)是微軟的軟件開發管理解決方案,它包含了代碼版本管理、持續集成/發佈、敏捷等特性,而且VSTS爲5人如下團隊提供了無償使用。
  項目地址:https://visualstudio.microsoft.com/zh-hans/team-services/gitlab

  總的來講持續集成工具分爲可本地安裝和平臺託管兩類,本地安裝類型的工具適合有專用構建服務器資源的閉源項目(固然開源項目也可使用),而託管平臺則比較適合開源或者沒有專用構建服務器資源的項目,使用上託管平臺更加省心,這些工具須要根據實際狀況來進行選用。單元測試

GitHub市場簡介

  GitHub做爲一個分佈式的軟件管理解決方案,它除了提供代碼託管外,還經過應用市場的方式提供了拓展應用,這些應用主要用於持續繼承、部署、測試、代碼審查、項目管理等等,詳情查看:https://github.com/marketplace/
  下圖爲Github市場中的CI工具:

  

  通常來講市場中提供的應用對於開源項目都是能夠無償使用的,下面就介紹如何將Github上的開源項目使用其市場應用完成持續集成。

使用AppVeyor實現持續集成

  AppVeyor是一個支持自定義持續集成環境的CI工具,它對.Net程序的支持很是強大,同時對開源項目免費,因此AppVeyor是.Net Core項目持續集成的首選,下面就介紹如何使用AppVeyor完成持續基礎:
  1. 在GitHub市場中找到AppVeyor,並完成安裝:

  

  2. 添加項目:

  

  選擇GitHub倉庫,並完成受權:

  

  添加須要的倉庫:

  

  點擊「NEW BUILD」進行一次編譯:

  

  從編譯的信息能夠看到,這次編譯失敗了,而且給出了相應的錯誤信息,這是因爲編譯環境致使的。

  3. 環境配置:
  將編譯鏡像選擇爲VS2017:

  

  在編譯前先執行dotnet restore命令還原項目依賴:

  

  4. 開始一個新的編譯:
  編譯結果:

  

  從編譯結果能夠看出Appveyor不只僅是完成了編譯工做,並且還搜索了測試信息,並完成了測試。另外有一個要點是本項目中的測試是依賴數據庫的,這就意味着Appveyor的編譯環境提供了SQL Server數據的支持。

  5. 將編譯後的內容發佈到GitHub release:
  爲xUnitTestDemo代碼庫添加一個Tag:

  

  而後Appveyor將會檢測到代碼庫的變化,自動編譯Tag,並將結果部署到Github的Release中:

  自動部署的Release內容:

  

  關於appveryor部署的更多信息參考:https://www.appveyor.com/docs/deployment/

  6. 將編譯狀態顯示到GitHub上:
  Appveyor的Badges(標記)配置界面中能夠獲取到狀態標記地址:

  

  將MarkDown的代碼複製到項目的README.md文件中:

  

  效果:

  

  7. 導出appveyor.yml文件以及經過appveyor.yml來完成配置:
  上面的方法是經過Appveyor的Web界面上完成配置的,除此以外還能夠經過appveyor.yml文件來完成配置,appveyor.yml文件能夠本身建立或導出已有配置:
  導出已有配置:

  

  將appveyor.yml文件放置到代碼根目錄,並經過修改該文件來變動配置:

  

  上圖在原有配置基礎上修改成release的方式編譯代碼,而且指定生成結果目錄,將結果進行壓縮。
  更多appveyor.yml配置可參考:https://www.appveyor.com/docs/appveyor-yml/

使用Codecov顯示代碼覆蓋率

  Codecov也是Github市場的一個應用,它用於生成代碼覆蓋率報告,codecov對C#的支持是基於OpenCover的(使用OpenCover檢測代碼覆蓋率參考:好代碼是管出來的——.Net Core中的單元測試與代碼覆蓋率),Codecov對Github的公開項目是免費的,下面就開始介紹如何使用codecov來實現測試代碼覆蓋率的統計:
  1. 安裝Codecov:

  

  注:安裝完成Codecov後,會有一個Upload Token用來將代碼覆蓋報告上傳到Codecov,但Appveyor的公共倉庫能夠不須要:

  

  2. 修改appveyor.yml文件:

  

  添加使用choco管理器安裝OpenCover及codecov,而後在test_script中添加代碼覆蓋率分析報告以及上傳腳本。
  注:當上述變動push到Github後,Appveyor將開始自動編譯並完成包括代碼覆蓋率報告生成、上傳等全部工做,此時打開codecov頁面將會看到報告信息:

  

  3. 在README.md文件中添加Codecov的標籤:

  

 

   

  結果:

  

小結

  本文介紹了CI和CD的基本概念,前者目的在於儘量早的發現多人開發時代碼集成的錯誤,然後者目的是避免人爲形成的錯誤,將一些重複的事情交由程序自動完成,既能夠減小成本又能夠提升正確率,如今流行的DevOps的基礎之一就是自動化也就是CI和CD。
  另外本文還介紹了在Github上使用Appvoyer和Codecov工具實現了簡單的持續集成,當把新代碼推到GitHub倉庫時,Appvoyer會自動的完成一系列構建操做。Appvoyer是一個很是強大的CI工具,對C#的支持也很是好能夠選擇VS版本(包括預覽版),多種數據庫(包括Linux下的SQL Server),因此在執行測試時依賴數據庫的測試也能經過。
  下篇文章將介紹如何使用Jenkins完成本地CI服務器的搭建。

參考:
  https://en.wikipedia.org/wiki/Continuous_integration
  https://en.wikipedia.org/wiki/Comparison_of_continuous_integration_software
  https://en.wikipedia.org/wiki/Continuous_delivery
  https://cakebuild.net/
  https://docs.codecov.io/docs
  https://www.appveyor.com/docs/

本文連接:http://www.javashuo.com/article/p-weygrpxl-cz.html 

相關文章
相關標籤/搜索