一、背景
作為DevOps交付流水線的開發者,為支持CI/CD中各項任務的自動化,都需要依賴多種包管理工具來下載各種相關的工具,比如針對產生最終交付件的構建過程,就需要在構建流程的第一步,自動地把相關工具,如Curl、wget、Maven、Gradle、npm等等,下載到CI服務器。這些工具的下載,通常都需要依靠對應的公網服務器和包管理工具來支持。而這樣通過公網來下載工具,有時會遇到穩定性的問題,也就是所謂的環境問題,導致工具下載失敗,進而導致構建任務的失敗。因此,我們需要引入新的技術來克服這些問題,保證工具包下載的穩定和可靠。
二、工具包管理的痛點——缺乏穩定性
通常,我們會使用各種各樣的包管理工具來幫助我們下載和管理這些工具包,如Windows上的Chocolatey,Mac/Linux上的Homebrew,還有npm、Yum、Debian、Docker等等。可是,有時我們通過這些包管理工具來下載工具包時,會碰到意外的5xx服務器錯誤。而更多的時候,通過這些包管理工具來下載會非常的慢。這些問題在我們使用自動化構建工具(如Travis CI、Jenkins、Gitlab CI,等等)來實現持續集成CI的時候,會被成千上百倍地放大。一種解決辦法就是在碰到這些環境問題時,通過手動運行構建的方式進行補救,當然,這只是指標不治本。同時,在網絡訪問有限制的時候,如很多金融企業都會採用的網絡隔離,根本不可能去下載這些公網服務器上的工具包。
三、解決方案——使用JFrog Artifactory的遠程倉庫
JFrog Artifactory作為全語言製品倉庫,其遠程倉庫可以作為公網服務器的本地代理和緩存。當我們通過其遠程倉庫來下載所需的工具包時,Artifactory首先檢查在本地的緩存中是否已經存在。如果有,直接返回該工具包;如果沒有,Artifactory將會代理到公網服務器去下載相應的工具包,並緩存到本地,以供後續的下載使用。
利用Artifactory的遠程倉庫作為下載前述工具包的代理和緩存,能夠使得DevOps流程中的各個環節,如前面描述的持續集成流程,更加的迅速和穩定。在有網絡隔離要求的環境中,如金融企業的研發/生產環境,Artifactory可以幫助技術人員建立自己的企業級單一可信源。
下面,我們將通過示例為大家一一展示,Artifactory的遠程倉庫是如何為不同種類的工具包提供服務的。
四、示例一——Chocolatey
當使用Choco為Windows系統下載Gradle的時候,我們經常會碰到類似下面這樣的503錯誤,從而導致構建失敗:
解決的方法:我們在Artifactory裡定義一個Nuget類型的遠程倉庫,利用它作為通過Choco包管理工具下載的來源。
第一步:配置Artifactory遠程倉庫
在Artifactory裡創建一個Nuget類型的遠程倉庫,其主要參數如下:
· 倉庫名:choco
· Url:https://chocolatey.org
第二步:安裝Choco包
· 用匿名安裝的命令
choco install <package-name> -s <artifactory-url>/api/nuget/choco/<artifactory-url>/<package-name>
· 使用帶用戶認證的方式
choco install <package-name> -s <artifactory-url>/api/nuget/choco/<artifactory-url>/<package-name>
-u <artifactory-user> -p <artifactory-password>/<artifactory-user>
五、示例二——Homebrew
和Chocolatey類似,也可以用Artifactory來支持Brew的下載:
第一步:配置Artifactory遠程倉庫
在Artifactory裡創建通用(Generic)類型的遠程倉庫:
· 倉庫名:homebrew
· Url:https://homebrew.bintray.com
第二步:設置“HOMEBREW_ARTIFACT_DOMAIN”環境變量
· 匿名訪問:
set HOMEBREW_ARTIFACT_DOMAIN=<artifactory-url>/homebrew/<artifactory-url>
· 帶用戶認證的訪問:
set HOMEBREW_ARTIFACT_DOMAIN=<artifactory-user>:<artifactory-password>@<artifactory-url>/homebrew/<artifactory-url>/<artifactory-password>/<artifactory-user>
第三步:安裝
之後再通過 brew install命令安裝,就會訪問Artifactory的本地緩存了。
六、示例三——Yum
本節將介紹如何利用Artifactory的遠程倉庫來使用Yum下載RPM包。
第一步:配置Artifactory遠程倉庫
在Artifactory裡創建一個RPM類型的遠程倉庫:
· 倉庫名:yum
· Url:http://mirror.centos.org/centos/<version>/os/<architecture>/<version>
o 例如:http://mirror.centos.org/centos/7.6.1810/os/x86_64
第二步:創建yum的配置
創建下述文件:/etc/yum.repos.d/artifactory
· 匿名訪問時,文件內容為:
[artifactory]HERE name=artifactory
baseurl=https://<artifactory-url>/yum/<artifactory-url>
enabled=1 gpgcheck=0
· 帶用戶認證時,文件內容為:
[artifactory] name=artifactory
baseurl=https://<artifactory-user>@<artifactory-url>/yum/<artifactory-url>/<artifactory-user>
enabled=1 gpgcheck=0
之後正常使用yum命令就可以從Artifactory的本地緩存下載RPM包了。
七、示例四——Docker
本節將介紹如何利用Docker命令從Artifactory的遠程倉庫來下載Docker鏡像。
第一步:配置Artifactory遠程倉庫
在Artifactory裡創建Docker類型的遠程倉庫:
· 倉庫名:docker
· Url:https://registry-1.docker.io/
第二步:登錄
用下述命令登錄Artifactory的Docker倉庫:
Docker login <your>
其中<your>的寫法可以參考Artifactory中docker倉庫對應的”Set Me Up”顯示的設置。/<your>
第三步,拉取鏡像
執行下述命令,從Artifactory的緩存拉取Docker鏡像:
docker pull <your>/<docker>:<docker>/<docker>/<your>
當然,針對Docker應用,你可以使用JFrog提供的免費版鏡像中心——JCR(JFrog Container Registry,https://jfrog.com/container-registry/),來管理自己的Docker鏡像。
八、總結
在DevOps流程當中,我們需要下載很多工具包,來支持整個流程的自動化運轉。然而。直接從外網下載這些工具包,經常會碰到環境問題,進而影響整個DevOps流程的效率和可靠性。
Artifactory通過其遠程倉庫的設置和全語言製品支持的能力,能夠幫助我們建立各種工具包的本地源,從而使得DevOps的流程更加迅速和穩定。本文還列出了幾種典型類型工具包的配置方法。
更多精彩內容可以專注我們的在線課堂