新聞中心
本文簡(jiǎn)要介紹了Monorepo在開(kāi)發(fā)多服務(wù)應(yīng)用程序方面的優(yōu)勢(shì)。以及如何使用GitLab CI/CD和Docker輕松構(gòu)建,測(cè)試和部署此類(lèi)應(yīng)用程序。

公司主營(yíng)業(yè)務(wù):網(wǎng)站建設(shè)、做網(wǎng)站、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)建站推出城區(qū)免費(fèi)做網(wǎng)站回饋大家。
基于現(xiàn)代Web的應(yīng)用程序通常都包含多種服務(wù)。例如,后端API和前端客戶端。在規(guī)模擴(kuò)大成為問(wèn)題的大型項(xiàng)目中,服務(wù)也可以拆分為多個(gè)微服務(wù)。如何在這樣的項(xiàng)目中組織源代碼?一種解決方案是monorepo,即項(xiàng)目中所有源代碼在同一個(gè)存儲(chǔ)庫(kù)中管理。還有一種是每個(gè)微服務(wù)分別創(chuàng)建一個(gè)存儲(chǔ)庫(kù)管理。monorepo方法允許輕松訪問(wèn)整個(gè)代碼庫(kù),這帶來(lái)了許多優(yōu)勢(shì),例如易于代碼重用、簡(jiǎn)化了依賴性管理。但每服務(wù)語(yǔ)義版本控制和部署過(guò)程將會(huì)更加復(fù)雜。
我將通過(guò)一個(gè)示例項(xiàng)目來(lái)解釋monorepo的概念及其部署。該項(xiàng)目是一個(gè)僅由兩項(xiàng)服務(wù)組成的Web應(yīng)用程序:后端和前端。例如,后端可以是運(yùn)行在服務(wù)器上并提供REST或GraphQL API的Node.js應(yīng)用程序。前端可以是用JavaScript框架(例如React或Vue.js)編寫(xiě)的單頁(yè)應(yīng)用程序,該應(yīng)用程序由一個(gè)簡(jiǎn)單的Web服務(wù)器提供給客戶端。
所有源代碼都在一個(gè)monorepo中進(jìn)行管理。我們的簡(jiǎn)單項(xiàng)目的文件結(jié)構(gòu)如下:
- monorepo/
- backend/
- src/
- Dockerfile
- frontend/
- src/
- Dockerfile
- .git/
- .gitignore
- .gitlab-ci.yaml
- docker-compose.yaml
在本地開(kāi)發(fā)過(guò)程中以及服務(wù)器上的生產(chǎn)版本中,我們使用Docker容器。因此,每個(gè)服務(wù)都有一個(gè)Dockerfile描述其Docker鏡像。該文件docker-compose.yaml用于在本地開(kāi)發(fā)環(huán)境中配置和啟動(dòng)容器??梢栽诜?wù)器上使用類(lèi)似的文件來(lái)運(yùn)行應(yīng)用程序,或者您也可以使用Docker編排工具,例如Kubernetes。
CI/CD管道
我們的目標(biāo)是每次發(fā)布新版本(即“代碼提交到GitLab”)時(shí)自動(dòng)將應(yīng)用程序構(gòu)建,測(cè)試和部署到服務(wù)器。這包括構(gòu)建和測(cè)試服務(wù),將每個(gè)服務(wù)捆綁在Docker映像中,并將這些映像存儲(chǔ)在(私有)GitLab Docker Registry中。最后,服務(wù)器會(huì)自動(dòng)收到有關(guān)新版本的通知,并會(huì)觸發(fā)從注冊(cè)表中提取新映像。所有這些都可以通過(guò)GitLab CI / CD來(lái)實(shí)現(xiàn)。這是一個(gè)非常強(qiáng)大的工具。基本上,GitLab CI / CD管道包括幾個(gè)階段如build,test和deploy。該管道配置有一個(gè)名為.gitlab-ci.yaml的文件,該文件存儲(chǔ)在我們存儲(chǔ)庫(kù)的根目錄中。如果是monorepo,我們必須確保觸發(fā)了GitLab CI / CD管道的正確階段。而且,我們通常只希望構(gòu)建,測(cè)試和部署應(yīng)用程序中已更改的那些服務(wù),而不是將所有服務(wù)都合并在一起,因?yàn)檫@可能會(huì)非常耗時(shí)。
在.gitlab-ci.yaml文件中我們?yōu)槊總€(gè)服務(wù)和每個(gè)階段定義job。為了確保僅在更改服務(wù)源代碼后才執(zhí)行該服務(wù)的作業(yè),我們可以將only/changes子句與文件夾路徑的正則表達(dá)式結(jié)合使用。例如,后端服務(wù)的構(gòu)建作業(yè)可以定義如下:
- backend_build:
- stage: build
- only:
- changes:
- - "backend/**/*"
- ...
script在job部分中只需四行代碼即可構(gòu)建后端服務(wù)的Docker鏡像并將其推送到GitLab Docker Registry 。
- backend_build:
- ...
- script:
- - docker login -u $DOCKER_USER -p $ACCESS_TOKEN $CI_REGISTRY
- - cd backend
- - docker build -f Dockerfile --tag latest .
- - docker push latest
- ...
在第一行中,我們使用用戶名和訪問(wèn)令牌登錄到GitLab Docker Registry,該用戶名和訪問(wèn)令牌先前已在變量名稱$DOCKER_USER和中定義$ACCESS_TOKEN(在GitLab項(xiàng)目的設(shè)置中)。然后,我們轉(zhuǎn)到backend/文件夾,運(yùn)行Docker build命令,最后將鏡像推送到注冊(cè)表。
我們的服務(wù)測(cè)試可以在另一個(gè)job中執(zhí)行,例如backend_test。所需的命令和腳本在很大程度上取決于我們項(xiàng)目的測(cè)試基礎(chǔ)結(jié)構(gòu),但基本上,我們調(diào)用的腳本與在本地開(kāi)發(fā)環(huán)境中使用的腳本相同。使用GitLab CI / CD也可以進(jìn)行更復(fù)雜的測(cè)試,例如集成或端到端測(cè)試。構(gòu)建并存儲(chǔ)在注冊(cè)表中后,可以輕松地將服務(wù)的Docker鏡像放入CI/CD管道中,并在測(cè)試中用作服務(wù)容器。
一旦構(gòu)建和測(cè)試,我們的Docker鏡像就可以部署了。我們?yōu)閼?yīng)用程序的每個(gè)服務(wù)定義部署作業(yè),在其中登錄服務(wù)器并觸發(fā)從GitLab Docker鏡像倉(cāng)庫(kù)中提取新映像。
總之,可以在monorepo中組織由幾個(gè)服務(wù)和庫(kù)組成的應(yīng)用程序的源代碼。盡管使用monorepo的部署更加復(fù)雜,但是僅需使用一個(gè)附加工具即可實(shí)現(xiàn)。GitLab是此類(lèi)工具的一個(gè)示例,它結(jié)合了存儲(chǔ)庫(kù)管理,強(qiáng)大的CI / CD管道和私有Docker鏡像倉(cāng)庫(kù)。
網(wǎng)頁(yè)名稱:使用GitLabCI實(shí)現(xiàn)多模塊項(xiàng)目CI/CD
網(wǎng)站網(wǎng)址:http://m.fisionsoft.com.cn/article/dhpcoje.html


咨詢
建站咨詢
