一千萬個為什麽

搜索

“真正可重現的構建”究竟是什麽?



他們究竟是什麽?為什麽它們在持續交付領域很重要?

背景:我在(我猜reddit)的評論中看到,真正可再現的構建仍然是一項研究不足的技術,而且很難創建。

所以,我想知道為什麽他們很難創造?

轉載註明原文: “真正可重現的構建”究竟是什麽?

一共有 2 個回答:

他們究竟是什麽?

以下是 reproducible-builds.org 的引用:

可復制的版本是一套軟件開發實踐,可以從人類可讀的源代碼到計算機使用的二進制代碼創建可驗證的路徑。

他們為什麽重要?

海事組織最簡單的解釋其重要性的方法是將它們視為備份程序的變體。

舉個例子:

  • 假定某個企業使用(取決於)某些軟件供應商許可的軟件包。而企業只獲取可執行文件,而不是用於創建這些可執行文件的來源等。

  • 一切順利,但在某種程度上,軟件供應商出了問題,例如,他們會倒閉(比如破產)。

  • 這可能會給企業帶來風險(從長遠來看)。即如果沒有適當的程序/協議讓業務獲得(合法)訪問所有必需的信息來源,文檔,構建程序等與軟件供應商使用的任何軟件供應商(當天)之間的可執行文件(由業務)被創建(並被運送到企業)。

  • “這就是”軟件托管“開始救人:如果有這樣的協議,人們會認為通過第三方,企業仍然有可能可以訪問“使用的任何東西”以便能夠復制可執行文件,以便從那裏開始,企業可能有機會繼續使用該軟件,並在適當的地方自行開始維護它(只為自己的企業運作)。然而,前一個項目符號中的“所使用的”是完成此項工作的最難的部分。它要求第三方預先進行適當的驗證。相信我,在重新創建可執行文件需要一段時間,除了(例如)鏈接日期之外,它可以證明它與軟件供應商提供給軟件代理的完美匹配。

為什麽他們很難創造?

如果上述示例還不夠清楚,請想象您是我的軟件托管代理,告訴我您需要什麽作為輸入以重新創建客戶許可的軟件副本。得到它?你不會忘記檢查我的編譯器的版本,可能是我的操作系統,編譯/鏈接選項,可重用組件(包括)的版本,庫等?

為了提供創建真正可重復構建的嘗試實例,請考慮以下事項 -

一個構建管道,從git倉庫開始,沒有用戶可以重寫歷史記錄或刪除未合並分支。

檢查源代碼後的第一個“構建”步驟是啟動一個包含所有構建時間依賴關系的容器。

運行編譯時容器的輸出是一個包含編譯後二進制文件的容器。

對於構建的可重復性更重要的是,將以下標記添加到最終容器中:

  • 原始存儲庫中源代碼的精確散列值以及上傳到工件存儲庫的代碼的git repo和tar ball快照的url。
  • 用於運行構建的構建容器的確切版本。
  • 二進制文件加載到的原始基本映像的確切版本。
  • 用於創建二進制文件的所有構建時變量的值。
  • Docker的版本,其中包含的所有三個容器以及它們在構建時運行的版本。

通過添加所有這些元數據,我們可以確保在將來的任何時候,我們都可以提取出構建依賴關系的確切集合(通過構建容器),編譯具有確切已知步驟集合的二進制文件(載入構建容器)並將其打包到另一個具有所有運行時相關性的已知基本映像中(使用基本映像標記),並且這些都可以基於容器上標記的源代碼的確切正確版本。

從理論上講,這應該使我們能夠完全重現構建版本。

這樣做的重要性在於它可以讓我們看看生產中正在運行的是什麽,即使所有的版本都有很大進展,回過頭來提取代碼版本,基本映像和最初使用的容器,以便我們可以,請在重新構建之前對該版本應用熱修復,然後重新部署,以便我們可以重新部署,因為知道它與唯一的delta是熱修復完全相同的工件。