軟件開發(fā)一般來說是一項團隊作業(yè),在本系列文章開始就提到過軟件的編碼是由一個團隊“并行”完成的,為了保證編碼任務(wù)正常完成,首先引入版本控制工具來完成代碼管理,為了保證代碼質(zhì)量引入了代碼分析器以及代碼測試。
版本控制工具可以保證代碼有一個主版本,但代碼分析和測試均是開發(fā)人員手動在本地完成的(通過編譯、執(zhí)行測試等方式),在進行代碼分析和測試時可能并沒有將本地代碼更新到最新版本,這樣就會出現(xiàn)一個問題,當(dāng)多個開發(fā)人員向版本庫提交代碼時,無法保證最新代碼庫的代碼是正確的,為了解決這個問題,提出了持續(xù)集成,持續(xù)集成的集成指的是持續(xù)的對多個開發(fā)人員編寫的代碼進行集成,本文從下面幾個方面介紹持續(xù)集成以及基于Github進行持續(xù)集成實踐:
- CI&CD
- 常用的持續(xù)集成工具
- GitHub市場簡介
- 使用AppVeyor實現(xiàn)持續(xù)集成
- 使用Codecov顯示代碼覆蓋率
- 小結(jié)
CI&CD
持續(xù)集成(Continuous integration,CI)指的是在開發(fā)過程中持續(xù)地將所有開發(fā)人員的代碼合并到代碼庫的主線上,然后對該主線代碼進行編譯、測試運行等操作對代碼進行檢驗,其目的是盡可能早的發(fā)現(xiàn)代碼集成后導(dǎo)致的問題。
實現(xiàn)持續(xù)集成的要點主要有:共享的代碼庫、自動化編譯、自動化測試等,同時要保證合理的集成頻率,一般持續(xù)集成的時機在于開發(fā)人員將代碼提交到代碼庫時自動進行,但是如果提交過于頻繁,那么應(yīng)該使用時間間隔的形式進行持續(xù)集成。
持續(xù)發(fā)布(Continuous delivery,CD)實際上是持續(xù)集成上的一個拓展,在持續(xù)集成的基礎(chǔ)上將發(fā)布工作自動化,避免人為操作從而減少發(fā)布時間和發(fā)布時人為造成的錯誤。
常用的持續(xù)集成工具
持續(xù)集成經(jīng)過多年的發(fā)展,在不同的應(yīng)用場景、平臺/語言、商業(yè)化等因素下產(chǎn)生了許多持續(xù)集成工具,可參考(但不限于這些): https://en.wikipedia.org/wiki/Comparison_of_continuous_integration_software
比較常用的持續(xù)集成工具有:
Jenkins
Jenkins是一個開源的跨平臺持續(xù)集成工具,它提供了GUI界面以及大量的拓展插件,通過GUI界面可以簡單、快速的完成項目持續(xù)集成配置,更重要的是Jenkins支持所有的版本控制工具。
項目地址:https://jenkins.io/
TeamCity
TeamCity是JetBrains公司開發(fā)的持續(xù)集成工具,它有免費和收費兩種授權(quán),免費版本的TeamCity擁有所有功能,其限制僅僅是只能創(chuàng)建100個編譯配置和只能并行運行3個代理。
項目地址:http://www.jetbrains.com/teamcity/
GitLab
GitLab是一個Git的代碼管理工具,使用GitLab可以輕松的在Linux環(huán)境搭建一個Git的遠程代碼托管平臺,同時GitLab中也內(nèi)置的CI/CD功能。
項目地址:https://about.gitlab.com/
Travis CI
Travis CI是一個持續(xù)集成托管平臺,它為開源項目提供免費支持,但Travis CI不支持Windows下編譯。
項目地址:https://www.travis-ci.org/
AppVeyor
AppVeyor也是一個持續(xù)集成的托管平臺,它支持Windows和Linux,并且AppVeyor可以對環(huán)境進行定制:https://www.appveyor.com/docs/build-environment/,是一個非常強大的CI工具,AppVeyor對開源項目提供免費支持。
項目地址:https://www.appveyor.com/
VSTS
VSTS(Visual Studio Team Services)是微軟的軟件開發(fā)管理解決方案,它包含了代碼版本管理、持續(xù)集成/發(fā)布、敏捷等特性,并且VSTS為5人以下團隊提供了免費使用。
項目地址:https://visualstudio.microsoft.com/zh-hans/team-services/
總的來說持續(xù)集成工具分為可本地安裝和平臺托管兩類,本地安裝類型的工具適合有專用構(gòu)建服務(wù)器資源的閉源項目(當(dāng)然開源項目也可以使用),而托管平臺則比較適合開源或者沒有專用構(gòu)建服務(wù)器資源的項目,使用上托管平臺更加省心,這些工具需要根據(jù)實際情況來進行選用。
GitHub市場簡介
GitHub作為一個分布式的軟件管理解決方案,它除了提供代碼托管外,還通過應(yīng)用市場的方式提供了拓展應(yīng)用,這些應(yīng)用主要用于持續(xù)繼承、部署、測試、代碼審查、項目管理等等,詳情查看:https://github.com/marketplace/
下圖為Github市場中的CI工具:
一般來說市場中提供的應(yīng)用對于開源項目都是可以免費使用的,下面就介紹如何將Github上的開源項目使用其市場應(yīng)用完成持續(xù)集成。
使用AppVeyor實現(xiàn)持續(xù)集成
AppVeyor是一個支持自定義持續(xù)集成環(huán)境的CI工具,它對.Net程序的支持非常強大,同時對開源項目免費,所以AppVeyor是.Net Core項目持續(xù)集成的首選,下面就介紹如何使用AppVeyor完成持續(xù)基礎(chǔ):
1. 在GitHub市場中找到AppVeyor,并完成安裝:
2. 添加項目:
選擇GitHub倉庫,并完成授權(quán):
添加需要的倉庫:
點擊“NEW BUILD”進行一次編譯:
從編譯的信息可以看到,此次編譯失敗了,并且給出了相應(yīng)的錯誤信息,這是由于編譯環(huán)境導(dǎo)致的。
3. 環(huán)境配置:
將編譯鏡像選擇為VS2017:
在編譯前先執(zhí)行dotnet restore命令還原項目依賴:
4. 開始一個新的編譯:
編譯結(jié)果:
從編譯結(jié)果可以看出Appveyor不僅僅是完成了編譯工作,而且還搜索了測試信息,并完成了測試。另外有一個要點是本項目中的測試是依賴數(shù)據(jù)庫的,這就意味著Appveyor的編譯環(huán)境提供了SQL Server數(shù)據(jù)的支持。
5. 將編譯后的內(nèi)容發(fā)布到GitHub release:
為xUnitTestDemo代碼庫添加一個Tag:
然后Appveyor將會檢測到代碼庫的變化,自動編譯Tag,并將結(jié)果部署到Github的Release中:
自動部署的Release內(nèi)容:
關(guān)于appveryor部署的更多信息參考:https://www.appveyor.com/docs/deployment/
6. 將編譯狀態(tài)顯示到GitHub上:
Appveyor的Badges(標(biāo)記)配置界面中可以獲取到狀態(tài)標(biāo)記地址:
將MarkDown的代碼復(fù)制到項目的README.md文件中:
效果:
7. 導(dǎo)出appveyor.yml文件以及通過appveyor.yml來完成配置:
上面的方法是通過Appveyor的Web界面上完成配置的,除此之外還可以通過appveyor.yml文件來完成配置,appveyor.yml文件可以自己創(chuàng)建或?qū)С鲆延信渲茫?br /> 導(dǎo)出已有配置:
將appveyor.yml文件放置到代碼根目錄,并通過修改該文件來變更配置:
上圖在原有配置基礎(chǔ)上修改為release的方式編譯代碼,并且指定生成結(jié)果目錄,將結(jié)果進行壓縮。
更多appveyor.yml配置可參考:https://www.appveyor.com/docs/appveyor-yml/
使用Codecov顯示代碼覆蓋率
Codecov也是Github市場的一個應(yīng)用,它用于生成代碼覆蓋率報告,codecov對C#的支持是基于OpenCover的(使用OpenCover檢測代碼覆蓋率參考:好代碼是管出來的——.Net Core中的單元測試與代碼覆蓋率),Codecov對Github的公開項目是免費的,下面就開始介紹如何使用codecov來實現(xiàn)測試代碼覆蓋率的統(tǒng)計:
1. 安裝Codecov:
注:安裝完成Codecov后,會有一個Upload Token用來將代碼覆蓋報告上傳到Codecov,但Appveyor的公共倉庫可以不需要:
2. 修改appveyor.yml文件:
添加使用choco管理器安裝OpenCover及codecov,然后在test_script中添加代碼覆蓋率分析報告以及上傳腳本。
注:當(dāng)上述變更push到Github后,Appveyor將開始自動編譯并完成包括代碼覆蓋率報告生成、上傳等所有工作,此時打開codecov頁面將會看到報告信息:
3. 在README.md文件中添加Codecov的標(biāo)簽:
結(jié)果:
小結(jié)
本文介紹了CI和CD的基本概念,前者目的在于盡可能早的發(fā)現(xiàn)多人開發(fā)時代碼集成的錯誤,而后者目的是避免人為造成的錯誤,將一些重復(fù)的事情交由程序自動完成,既可以減少成本又可以提高正確率,現(xiàn)在流行的DevOps的基礎(chǔ)之一就是自動化也就是CI和CD。
另外本文還介紹了在Github上使用Appvoyer和Codecov工具實現(xiàn)了簡單的持續(xù)集成,當(dāng)把新代碼推到GitHub倉庫時,Appvoyer會自動的完成一系列構(gòu)建操作。Appvoyer是一個非常強大的CI工具,對C#的支持也非常好可以選擇VS版本(包括預(yù)覽版),多種數(shù)據(jù)庫(包括Linux下的SQL Server),所以在執(zhí)行測試時依賴數(shù)據(jù)庫的測試也能通過。