DevOps是生產(chǎn)力/生產(chǎn)過(guò)程/產(chǎn)品迭代的結(jié)合,以便持續(xù)向終端用戶輸出有價(jià)值的服務(wù)。因此可以認(rèn)為,DevOps并不是一種框架/服務(wù),更像是一種方法論/文化,可以幫助企業(yè)快速/高質(zhì)量/安全地實(shí)現(xiàn)產(chǎn)品的迭代及技術(shù)的革新。
細(xì)看會(huì)發(fā)現(xiàn),DevOps可以劃分成很多部分,包括溝通協(xié)作/任務(wù)管理、持續(xù)集成/持續(xù)部署、代碼管理、基礎(chǔ)設(shè)施即代碼、持續(xù)監(jiān)控等。隨著時(shí)機(jī)的成熟,市場(chǎng)的教育普及與工具鏈的成熟度越來(lái)越高,很多企業(yè)也實(shí)實(shí)在在看到了DevOps的價(jià)值。有數(shù)據(jù)顯示:采用或部分采用DevOps的公司,發(fā)布頻率提高了46倍,Bug修復(fù)時(shí)間提升了440倍,可以提前20%將產(chǎn)品推向市場(chǎng),出錯(cuò)率減少5倍,收入增加了20%。
Azure DevOps是微軟提供的,用于幫助開發(fā)者實(shí)現(xiàn)DevOps文化的工具集合,包含Azure Boards(看板,實(shí)現(xiàn)任務(wù)管理)、Azure Pipelines(持續(xù)集成/持續(xù)發(fā)布)、Azure Repos(代碼管理)、Azure Test Plans(測(cè)試計(jì)劃管理)、Azure Artifacts(包管理)等在內(nèi)的全套工具鏈。
借助Azure DevOps,用戶能夠快速開始實(shí)踐DevOps理念,而無(wú)需在意工具的選擇以及支持DevOps的基礎(chǔ)設(shè)施的維護(hù),將精力專注于業(yè)務(wù)的開發(fā)。
Azure DevOps除了支持內(nèi)置工具集,還支持很多開源工具,用戶可以結(jié)合自身的實(shí)際情況來(lái)選擇適合自己的工具。
接下來(lái),我們將通過(guò)一個(gè)案例模擬DevOps的持續(xù)集成/持續(xù)發(fā)布(CI/CD)過(guò)程,體驗(yàn)如何通過(guò)Azure DevOps將手工的網(wǎng)站更新操作自動(dòng)化。
Azure DevOps CI/CD演練
例如一家公司運(yùn)行著一個(gè)Python編寫的公司門戶,雖然內(nèi)容不多,但是需要經(jīng)常修改頁(yè)面內(nèi)容。
小A是網(wǎng)站開發(fā)人員,小B是網(wǎng)站運(yùn)維人員。每次更新內(nèi)容后,小A都需要將改好的代碼上傳到GitHub,小B拉取并手動(dòng)更新到對(duì)應(yīng)的Web服務(wù)器中。這一過(guò)程不僅需要大量手工工作,而且時(shí)不時(shí)會(huì)出現(xiàn)問(wèn)題,導(dǎo)致公司網(wǎng)站無(wú)法訪問(wèn)。
接下來(lái),我們嘗試將這個(gè)場(chǎng)景應(yīng)用在Azure DevOps中通過(guò)Pipelines實(shí)現(xiàn)程序自動(dòng)化發(fā)布。隨后,小A只需將代碼上傳到GitHub,就會(huì)自動(dòng)觸發(fā)一整套部署流程,部署到預(yù)生產(chǎn)環(huán)境,且增加了代碼檢查與同事核查,確保了發(fā)布的準(zhǔn)確性;而小B可以專心維護(hù)Azure DevOps Pipelines,確保運(yùn)行的準(zhǔn)確性,而無(wú)需手工完成部署任務(wù)。
在我們構(gòu)想的這個(gè)場(chǎng)景中,經(jīng)過(guò)DevOps的改造,原本耗時(shí)1小時(shí)的構(gòu)建/發(fā)布過(guò)程可以縮短到5分鐘!這極大提高了工作效率,同時(shí)可以將人為失誤風(fēng)險(xiǎn)降到最低。
第一步:構(gòu)建Python Web網(wǎng)站自動(dòng)化發(fā)布流程
實(shí)驗(yàn)的第一階段,我們將構(gòu)建一條CI/CD的Pipeline,隨后當(dāng)我們的代碼Merge到Master Branch后,會(huì)由CI/CD Pipeline進(jìn)行必要的測(cè)試打包工作,并發(fā)布到生產(chǎn)環(huán)境中,整個(gè)過(guò)程無(wú)需人工接入。本次實(shí)驗(yàn)將模擬一個(gè)基于Python Django開發(fā)的Web站點(diǎn),發(fā)布到Azure Web App中。
創(chuàng)建一條AzurePipeline for CI工作,名為zjPythonWeb-CI
1、點(diǎn)擊“New pipeline”,設(shè)置源代碼管理的GitHub鏈接,選擇創(chuàng)建一條空的Pipeline。
選擇Build所需的Build Agent Pool:
2、添加Build Pipeline的一系列任務(wù)
添加任務(wù)設(shè)置Build Agent上運(yùn)行的Python版本:
添加任務(wù)安裝PythonWeb必要的依賴項(xiàng),所有依賴項(xiàng)均放在GitHub中的requirements.txt內(nèi):
添加任務(wù)運(yùn)行必要的單元測(cè)試,所有測(cè)試的相關(guān)用例均存放在GitHub中的unit_tests內(nèi):
添加任務(wù)將測(cè)試結(jié)果發(fā)布到Azure Pipeline中的Test Tab:
接下來(lái)的三個(gè)任務(wù)會(huì)將PythonWeb代碼打包成ZIP文件,發(fā)送到Azure DevOps Artifact中,為后續(xù)部署工作做準(zhǔn)備
最后收尾,設(shè)置好CI Pipeline的觸發(fā)規(guī)則,達(dá)到持續(xù)集成的目的:
接下來(lái)我們?cè)囼?yàn)一下Pipeline zjPythonWeb-CI是否工作正常,從結(jié)果看起來(lái)一切正常。
創(chuàng)建一條Azure Pipeline for CD工作,名為zjPythonWeb-CD
1、點(diǎn)擊Pipeline-Releases創(chuàng)建一條部署的Pipeline:
添加CI Pipeline構(gòu)建的Artifact
2、添加Release Pipeline部署過(guò)程的一系列任務(wù)
添加任務(wù)在Azure App Service中安裝必要的Python Extension插件
添加任務(wù)將Build好的ZIP包發(fā)布到預(yù)先創(chuàng)建的Web App中
步驟中需要設(shè)置Generate web.config parameters,具體代碼如下
-WSGI_HANDLER "django.core.wsgi.get_wsgi_application()" -DJANGO_SETTINGS_MODULE "python_webapp_django.settings" -PYTHON_PATH "$(AzureAppServiceManage2.LocalPathsForInstalledExtensions)\python.exe" -PYTHON_WFASTCGI_PATH "$(AzureAppServiceManage2.LocalPathsForInstalledExtensions)\wfastcgi.py" -appType python_Django
步驟中需要設(shè)置的Deploy腳本如下
@echo off
if NOT exist "$(AzureAppServiceManage2.LocalPathsForInstalledExtensions)/python.exe" (
echo Python extension not available >&2
EXIT /b 1
)
echo Installing dependencies
call "$(AzureAppServiceManage2.LocalPathsForInstalledExtensions)/python.exe" -m pip install -U setuptools
call "$(AzureAppServiceManage2.LocalPathsForInstalledExtensions)/python.exe" -m pip install -r requirements.txt
添加任務(wù)添加一系列測(cè)試任務(wù),確保部署的工作是正常運(yùn)行的
接下來(lái)我們?cè)囼?yàn)一下Pipeline zjPythonWeb-CD是否工作正常,從結(jié)果看起來(lái)一切正常
接下來(lái),小A如果需要更改頁(yè)面內(nèi)容就簡(jiǎn)單多了,他只需要更改頁(yè)面代碼,提交到GitHub即可;Azure Pipeline會(huì)監(jiān)聽GitHub的Commit,觸發(fā)CI/CD操作:
第二步:分離測(cè)試/生產(chǎn)環(huán)境
不過(guò),目前的Release Pipeline還有一個(gè)問(wèn)題:沒有做到測(cè)試生產(chǎn)隔離,無(wú)論測(cè)試結(jié)果如何,代碼都已經(jīng)部署到了環(huán)境中。接下來(lái)我們需要將環(huán)境分開,借用Web App Deploy Slot,當(dāng)測(cè)試沒有問(wèn)題,再將Staging環(huán)境與Production環(huán)境切換。
首先,我們將Release的階段改為Staging,同時(shí)去掉Pre approval,任何Build好的代碼都可以發(fā)布到Web App Staging的部署槽中:
另外再增添一個(gè)階段,名為Production,同時(shí)Enable Pre-Approval/Gate,只有當(dāng)代碼審核通過(guò),且Gate驗(yàn)證通過(guò)后,代碼才會(huì)部署到環(huán)境中:
這樣當(dāng)環(huán)境中有不符合策略的地方存在,即使人為Approve也不會(huì)部署到環(huán)境中,確保了應(yīng)用發(fā)布的安全可靠。