一千萬個為什麽

搜索

在構建服務器上重新使用Python虛擬環境



目前,我們每次通過Jenkins + Ansible運行構建時,都會重新創建虛擬環境並重新安裝 requirements.txt 文件中列出的所有依賴項。

這非常緩慢,並且不能很好地擴展。我們如何改進和加速這個過程?我們可以重新使用虛擬環境嗎?


我們尚未實現的最新想法是在Jenkins工作區之外構建虛擬環境,命名基於項目+分支的虛擬環境,並為每個虛擬環境保留MD5總和要求。然後,在下次構建環境之前,我們計算此分支中當前需求的MD5總和,並通過此MD5總和查找現有虛擬環境。如果發現有這個總和的現有環境,只需重新使用它。我們不確定這是否是解決問題的最佳方法。

轉載註明原文: 在構建服務器上重新使用Python虛擬環境

一共有 2 個回答:

通常最好的做法是讓你的版本具有冪等性。只留下工件背後只會為依賴性管理問題提供機會 - 並以靈活的方式解決這些問題正是您使用構建服務器的原因。我建議你看看為什麽你的Python版本運行速度太慢 - 如果你發現這是由於每個項目中的軟件包過多,這可能是可以優化的。如果您發現這是由於服務器性能問題,那麽可以使用更多資源輕松修復這些問題。如果您發現自己被網絡吞吐量阻塞,請考慮使用工件存儲庫在本地緩存包。但是建立持久的virtualenvs似乎是解決轉移到另一臺服務器時可能無法預測的問題的一個方法,並且對排除故障非常令人沮喪。

我會給@esoterydactyl給出的答案增加更多的故事,以防它過多的人頭。

您可能希望構建中間包,而不是單一的構建過程,這些中間包可以進行版本化並部署到工作區,而無需執行所有中間構建步驟。 Docker是一種在這種情況下非常受歡迎的包裝解決方案。您也可以使用.deb或.rpm或非Docker tarball,或者制作CF“StemCells”或甚至壓縮文件。另外考慮Python現在已經預建了“wheel”包。

問題:

  • 所有開發人員必須為他們的沙箱使用相同的build-deps軟件包,否則會在dev沙箱和CI工作區之間出現差異。因此,該軟件包必須支持dev筆記本電腦沙箱和Jenkins工作區安裝。
  • build-deps包必須具有自己的CI構建/測試/打包/發布管道。但是,當沒有人對其(或其任何組件)進行任何更改時,它可以降低周期頻率。
  • 這是一個捆綁的例子。例如,如果您有一個CVE進行修補,那麽使用該修補程序的所有內容都必須進行修補。這不應該比其他任何事情更難部署,所以當你的CI構建速度很快時不要停止工作。 CI需要CD,或者您可以提供生產不可部署的軟件。
  • 如果您正在制作自己的預構建工件,則需要基礎結構來承載工件存儲庫和版本控制計劃。

增量式解決方案將是解決這些問題的最小數量,這會大大提高構建周期速度。這就是為什麽維護一個本地pypi存儲庫是有意義的,並且添加Jenkins作業來構建並推送輪包。我知道這聽起來像是一種痛苦,但想象一下,如果您必須管理內部軟件開發,才能通過pip安裝所有這些東西?