所謂的 artifact,指的是程式原始碼透過一些開發工具來執行建置(build)或打包(package)所產生的單一檔案,主要目的是為了方便部署以及與他人共享。
依使用的工具而定,artifact 的檔案格式有可能是 JAR、WAR、 ZIP、TAR……等等,而用來存放這些 artifacts 的地方就稱為 artifact repository(有時會簡稱 repo)。不同格式的 artifact 會保存於不同的 repo。
比如說,公司裡面有三個開發團隊,分別使用了 Java、Python、和 .NET 來開發應用程式,而這些開發工具都會產生不同類型的 artifacts。因此,我們會需要多種 repo 來儲存那些 artifacts。基本上,有幾種 artifact 格式就需要幾個 repo,因為一個 artifact repo 裡面只能儲存一種 artifact 格式。
然而,artifact 類型眾多,除了剛才提到的幾種格式,開發團隊也可能需要同時處理 Docker images、Go、NuGet、Ruby……等工具所產生的 artifacts(函式庫或套件),如果每一種 artifacts 都得各自分開管理,未免太辛苦了。那麼,是否有可能集中在一個地方來統一管理所有格式的 artifact repositories 呢?這便是 artifact repository manager 要解決的問題。
Artifact repository manager(以下簡稱 repo manager)可以讓我們儲存或上傳不同類型的 artifacts,之後也可以下載它們。將來如果需要用到某些 artifacts,例如把它們部署至某台主機,便可透過 repo manager 把需要的 artifacts 取出來。此外,公司內部的開發團隊也能透過這個集中的 repo manager 來共享各專案的 artifacts。換言之,repo manager 就等於是所有 artifacts 的集散地。
目前比較受歡迎的 artifact repository manager 產品是 Sonatype Nexus 和 JFrog Artifactory。這裡要進一步介紹的是 Nexus。
了解前面介紹的基礎觀念之後,我們知道 Nexus 至少具備下列功能:
也就是說,我們可以在公司內部使用 Nexus 來保存和管理所有專案的 artifacts,以便讓多個開發與維運團隊共用它們。
除了在公司內部私用,也有一些 repo manager 是公開的,可供任何人取用 ,例如 Maven Central Repository。Java 開發人員可以將自己開發的函式庫上傳至 Maven Central Repository 供他人取用,亦可從上面抓取他們需要的函式庫。又如 NPM、NuGet 等等,也都有公開的 repository。
在公司內部使用 Nexus,即表示會自行建立一些私有的 repositories,例如專供內部使用的 Maven repo 或 NPM repo 等等。至於需要使用第三方開源套件的場合,Nexus 亦提供了 repository proxy 的機制來讓公司內部的開發團隊也能以同樣的方式存取公開的 repositories。如此一來,Nexus 便成為名副其實的中央儲存庫,無論是內部自行開發的私有 repo,還是存放於外部的公開 repo,全都是透過 Nexus 取得。
除了前面介紹的基礎功能,Nexus 還提供了以下功能:
其中有些是 Nexus 付費版本(Nexus Pro)才有的功能,例如 User Token、Staging 和 Tagging。此外,Nexus 付費版所支援的 repository 格式也比較多,但一般來說,免費版的 Nexus 支援的格式已經相當足夠(參考下圖)。
如果需要進一步了解 Nexus 不同版本之間的功能差異,可參考以下官方文件:
最後以 GitLab CI/CD 的流程圖作為本文的結尾。從圖中可以看出 Nexus 作為一個 artifact repository 是位於整個 CI/CD 流程中的哪個位置。