iT邦幫忙

0

[已解決] 大型專案下,Gitlab CI 該如何加速建置及佈署

  • 分享至 

  • xImage

請問一下,我有個多人開發的專案,目錄結構大概像這樣
deploy (佈署描述檔)
server (後端)
client - client 1 (前端)
- client 2
- client 3...n
other_service (其他相關服務)
因client很大包,裡面又區分多個小專案,導致每次建置/佈署單一項目,下載就需花很多時間,想請問可以怎麼加速或建議?謝謝

以下是想到但不知道能不能做到的方式
在建置佈署server,只下載server、deploy,建置client1只下載client1、deploy
每次只下載Code更新的部分,不重新下載整包專案

這是與下載策略相關設定
variables:
GIT_STRATEGY: fetch
GIT_DEPTH: "10"
但目前每次建置/佈署看到都會做初始化
Initialized empty Git repository in /builds/ ...
該如何調整才行,感謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
墨嗓
iT邦研究生 3 級 ‧ 2021-05-12 01:20:43
最佳解答

在建置佈署server,只下載server、deploy

無法「只」下載部分子資料夾,主要是 Git 本身架構上的限制。

每次建置/佈署看到都會做初始化 Initialized empty Git repository in /builds/ ...」

這部分是 GitLab 在 Runner、Executor 的架構設計上必然的現象,以確保每個 executor 在每次工作的時候都不會因為上一個工作而污染了目前的工作環境,所以必須要重置。


目前從你提供出來的資訊來看,有幾個想法:

  • 根據資料夾做對應的 job,如 server 有變更時才執行 server 對應的工作,使用 only:changes 或可以複雜一點的 rules:changes

  • 確認一下瓶頸點是 Git Fetch 期間「Executor 從 Git Server 更新檔案」,是拉取變更慢?還是拉到變更之後組合成檔案的這段時間慢?前者可能是網路侷限,後者則是 executor 不夠力,解析 Git 變更的速度不夠快。

  • 如果從 executor 拉 Git 資料真的是瓶頸,可以考慮把專案拆分出去。server 歸 server、client 歸 client。

  • GIT_DEPTH 可以再設少一點如 3 之類的。

  • https://docs.gitlab.com/ee/ci/large_repositories/ 這一篇也可以參考。有一些是我沒提到的。另外,裡頭提到 GIT_CLONE_PATH 變數,是指,要在 executor 上的哪個資料夾 clone git repo 下來。

看更多先前的回應...收起先前的回應...
vicentli iT邦研究生 4 級 ‧ 2021-05-12 21:59:22 檢舉

感謝前輩的回覆,目前已經是only:change了。專案大概5G大,每次拉約要2分,GIT_DEPTH試過有限。官方文件上有些其實看不太懂實際有什麼作用,例如GIT_CLONE_PATH搞不太懂換個地方存差異在哪。GIT_CLEAN_FLAGS好像可以試試。我再把client拆出去好了,實質幫助較大

墨嗓 iT邦研究生 3 級 ‧ 2021-05-12 22:22:59 檢舉

GIT_DEPTH 的作用在 GIT_STRATEGY 設定為 fetch 時,只 fetch 最後的 $GIT_DEPTH 筆 commit。但當 runner 上面不存在該 repo 時,就只能完整的 clone 下來。

按照你說的 5G 每次都要 2 分鐘推測,應該是 runner 上每次都完整的 clone 一份下來。 你是什麼樣形式的 runner 呢?


GIT_CLONE_PATH 節省時間的原理主要是跟上面的 GIT_STRATEGY 搭配的,當你可以控制專案一律在 executor 可以存取的固定路徑上進行 git clone,那麼,下次 executor 再次的執行同一個專案工作時,就可以在該路徑上以 fetch 的方式更新 repo 資料,自然也就可以套用到 GIT_DEPTH 的數值。

vicentli iT邦研究生 4 級 ‧ 2021-05-13 17:46:57 檢舉

您好,是kubernetes形式的runner
流程大致都是會先起一個容器,clone專案下來進行build,最後把build好的image推到harbor,結束時容器應該就會被清掉了。佈署時看實際跑的流程仍舊會把整包專案clone下來,再用專案裡寫好的佈署描述及build好的image deploy上環境

「GIT_CLONE_PATH可以存取的固定路徑」,以我的環境是要掛載一個儲存空間,設好固定路徑,Job執行完資料就不會清掉嗎?下次就不需整包下載?如是這樣應可以大大加速建置、佈署時的下載速度。
不好意思,我對Gitlab整個架構流程還沒有很清楚,最近才開始看文件,邊做邊學

墨嗓 iT邦研究生 3 級 ‧ 2021-05-14 00:31:26 檢舉

剛稍微翻了一下手冊,發現手冊中提到了這句話:「It does not work for the kubernetes executor, but a feature proposal exists. The kubernetes executor always clones into an temporary directory.

https://docs.gitlab.com/ee/ci/runners/#git-strategy

也難怪你設定的 GIT_STRATEGY: fetch 看起來沒作用。

或許可以換成 docker 或 docker-machine 的 executor。

vicentli iT邦研究生 4 級 ‧ 2021-05-14 21:16:04 檢舉

好的,謝謝前輩幫忙!

墨嗓 iT邦研究生 3 級 ‧ 2021-05-18 13:35:42 檢舉

今天再次看手冊,多了一則更新,等待這個 Issue 發布吧。看起來會放在 13.12 版

https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3847

vicentli iT邦研究生 4 級 ‧ 2021-05-18 21:36:46 檢舉

感謝墨嗓大大的用心協助,在看到你的回應前,我測試使用docker,每次build時,真的不用整個專案重拉下來,大大節省了許多時間!期待13.12出來,就不需把k8s換成docker了

我要發表回答

立即登入回答