本文由ilanniweb微信公衆號提供友情贊助,首發於爛泥行天下
IT技術分享QQ羣:571981257
趁國慶有時間,剛好最近也想把目前的CI/CD中的CD方案重新調整優化下。
零、CI/CD部署流程優化
原來我們業務部署的方式,無論是生產環境還是預發環境都是直接從git倉庫拉取代碼,maven編譯構建打包,然後通過ansible進行下一步的操作。
這個過程基本上是沒有問題的,但是考慮到預發環境和生產環境使用的是同一套代碼,那麼我們完全可以把在生產環境的CI和CD,直接修改爲CD。也就說git倉庫拉取代碼,maven編譯構建打包,這兩個步驟完全省略掉,直接使用預發環境的生成的構建產物進行部署。
除此之外,在做回滾發佈時,通過直接部署上次的構建產物這個也是最快的,最節省時間的。
所以最近要對該部署方案進行優化,其中一個很關鍵的點,就是如何處理構建後產物的。
目前業務代碼使用的是springboot架構進行開發,所以各個環境的配置文件都會被打包最終的jar包中。
如果使用的是docker或者k8s部署業務的話,很好處理,我們只需要把最終產物達成鏡像推送到docker倉庫,然後生產部署時,直接從docker倉庫拉取對應的docker鏡像進行部署即可。
如果沒有使用docker或者k8s部署業務的話,我們可以使用jfrog artifactory(以下文章簡稱jfrog)或者nexus3,這些二進制包管理工具,管理構建產物。在預發環境階段把生成的jar包,存放到jfrog。然後生產環境部署時,jenkins直接從jfrog中拉取對應的jar包即可。
有關 nexus3的使用,我會在下一篇文章中進行介紹。
以上整個流程,我會分階段進行介紹,在此先介紹jfrog相關的知識點。
一、jfrog artifactory簡介
jfrog artifactory是一款二進制存儲管理工具,用來管理構建工具(如:maven、gradle)等所依賴的二進制倉庫,以方便管理第三方庫和發佈目標版本庫,從而提高軟件開發效率。它提供大量的插件以利於和不同工具之間的整合,內部使用權限管理更加安全,並支持高併發等等特性。
另外我們搭建Artifactory私服的原因還有:
私有倉庫的目的是作爲團隊內所使用的所有軟件構件的內部私有構件倉庫,將Maven構件(jar和pom)存儲到一個專門的Maven倉庫比將它們存儲到版本控制系統中更有優勢,這是因爲:
-->構件(jar)是二進制文件,不屬於git版本控制系統,後者在處理文本文件方面比較好
-->減少可能的版本衝突
-->減少首次構建時需要的手動干涉
-->中央倉庫包含所有依賴的軟件構件,引用單一的中央倉庫比引用多個獨立的本地庫要好
-->使用內部倉庫做clean構建時會快些,因爲Maven構件是從內部服務器而不是從因特網上獲取
以上介紹來源與百度百科。
jfrog artifactory有企業版和開源版,兩個版本。對於我們來說開源版本就夠使用了,所以下面的文章全部是以開源版本爲基準進行講解。
二、安裝基礎環境
jfrog的運行需要jdk1.8以上版本支持,在此需要我們首先配置jdk基礎環境。
下載jdk版本,並安裝,如下:
wget http://mirrors.linuxeye.com/jdk/jdk-8u221-linux-x64.tar.gz
tar -xf jdk-8u221-linux-x64.tar.gz -C /usr/local/
chown root:root -R /usr/local/jdk1.8.0_221
ln -s /usr/local/jdk1.8.0_221 /usr/local/jdk
ln -s /usr/local/jdk/bin/java /usr/bin/java
把jdk加入系統環境變量中,如下:
cat >> /etc/profile << "EOF"
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin
EOF
使jdk環境變量生效,如下:
source /etc/profile
java -version
三、通過zip包方式安裝jfrog
jfrog的安裝有兩種方式,第一種是通過zip包的方式進行安裝,第二種是通過yum或者rpm方式進行安裝。
在此我們先介紹zip包方式的安裝,可以通過如下網址查看zip包的相關信息:
https://bintray.com/jfrog/artifactory/jfrog-artifactory-oss-zip
3.1 下載jfrog的zip安裝包
使用wget命令進行下載,當然也可以使用其他命令,比如curl命令。
wget "https://bintray.com/jfrog/artifactory/download_file?file_path=jfrog-artifactory-oss-6.12.2.zip"
3.2 安裝並啓動jfrog服務
使用如下命令安裝jfrog:
unzip -q jfrog-artifactory-oss-6.12.2.zip -d /usr/local/
ln -s /usr/local/artifactory-oss-6.12.2/ /usr/local/jfrog
ls -al /usr/local/jfrog/
啓動jfrog,使用如下命令:
/usr/local/jfrog/bin/artifactoryctl start
ps -ef |grep jfrog
netstat -tunlp |grep 5256
通過上圖,可以很明顯的看出jfrog已經正常啓動,並且也可以看出jfrog默認監聽的是8081端口。
3.3 jfrog目錄簡介
jfrog的主要目錄在此我們做簡單的介紹,如下:
jfrog相關腳本文件存放路徑:/usr/local/jfrog/bin
jfrog日誌存放路徑:/usr/local/jfrog/logs/catalina
jfrog配置文件存放路徑:/usr/local/jfrog/etc
jfrog備份數據存放路徑:/usr/local/jfrog/backup
jfrog數據庫存儲路徑:/usr/local/jfrog/data/derby
其中/usr/local/jfrog/bin/目錄下的artifactoryctl是控制jfrog啓動、關閉的腳本
/usr/local/jfrog/bin/artifactoryctl start 表示開啓jfrog服務
/usr/local/jfrog/bin/artifactoryctl stop 表示關閉jfrog服務
/usr/local/jfrog/bin/installService.sh 表示把jfrog加入到系統服務,並開機啓動
/usr/local/jfrog/bin/uninstallService.sh 表示把jfrog服務從系統服務中刪除
如果沒有特殊配置的話,jfrog使用的是derby作爲其存儲數據的數據庫的。如果要使用其他類型的數據庫作爲jfrog數據存儲的話,我們可以修改/usr/local/jfrog/etc/db.properties文件中的配置即可。
除上述外/usr/local/jfrog/data/filestore/目錄存放的都是上傳的構建產物文件,該文件不是以明文的形式存在,而是jfrog服務自己進行了相關處理。
但是該文件的md5值是保持不變的,也就說你上傳的jar是以另外一種形式存在的。如果有需要,你可以通過重命名該文件就可以得到你的jar包。
下面的截圖是一個示例,針對/usr/local/jfrog/data/filestore/目錄實例,如下:
PS:強烈建議直接使用zip包方式安裝jfrog。
四、通過yum和rpm包方式安裝jfrog
在介紹完通過zip包方式安裝jfrog完畢後,我們再來介紹下通過yum和rpm包方式安裝jfrog。
4.1 通過yum方式安裝
通過yum方式安裝jfrog,比較簡單。需要下載jfrog的yum倉庫源,然後進行安裝即可,如下:
wget -O /etc/yum.repos.d/frog-artifactory.repo https://bintray.com/jfrog/artifactory-rpms/rpm
cat /etc/yum.repos.d/frog-artifactory.repo
開始安裝jfrog,使用如下命令:
yum -y install jfrog-artifactory-oss
4.2 通過rpm包方式安裝
我們可以通過如下網址查看rpm包的相關信息:
https://bintray.com/jfrog/artifactory-rpms/jfrog-artifactory-oss-rpm
除上述地址之外,我們還可以通過以下地址查看相關信息:
https://bintray.com/jfrog/product/JFrog-Artifactory-Pro/view
https://www.jfrogchina.com/open-source/#artifactory2
https://jfrog.com/open-source/
https://jfrog.bintray.com/artifactory-rpms/
下載對應的rpm包,使用如下命令:
wget "https://bintray.com/jfrog/artifactory-rpms/download_file?file_path=jfrog-artifactory-oss-6.12.2.rpm" -O jfrog-artifactory-oss.rpm
開始安裝jfrog,使用如下命令:
yum -y install jfrog-artifactory-oss.rpm
五、查看yum和rpm包相關信息
使用如下命令查看jfrog的yum和rpm包安裝信息,如下:
rpm -qa |grep jfrog
rpm -ql jfrog-artifactory-oss
通過上圖,我們可以很明顯的看出jfrog有幾個主要的目錄:
/etc/opt/jfrog/artifactory
/opt/jfrog/artifactory
/var/opt/jfrog
有關這個幾個目錄的作用,可以參考3.3章節的介紹,在此就不做進一步的介紹。
啓動jfrog服務,使用如下命令:
systemctl start artifactory.service
systemctl status artifactory.service
六、訪問jfrog
Jfrog安裝完畢,並啓動服務後,我們就可以通過http://ip:port訪問了。
jfrog默認的端口是8081,默認的用戶名和密碼是:admin/password。
通過上圖,我們可以很明顯的看出jfrog已經可以正常對外提供服務。
七、創建新倉庫
jfrog服務啓動完畢,我們登陸到web服務檯後,就可以創建相關的倉庫了。
目前開源版本的jfrog只支持Gradle、ivy、maven、SBT、Generic等5種倉庫類型,如果你想要支持其他類型的倉庫的話,可以使用jfrog的企業版。如下:
在上傳文件之前,我們先來創建一個倉庫,倉庫類型我們選擇的是Generic,普通類型的倉庫,倉庫名稱爲testilanni。
具體創建步驟如下截圖:
通過上圖,我們可以很明顯的看出testlanni,這個Generic類型的倉庫,已經創建完畢。
八、上傳文件到jfrog
jfrog對應的倉庫創建完畢後,我們就可以上傳文件到jfrog中。
我們可以通過兩種方式上傳文件到jfrog中,一種是通過web頁面,一種是通過api。下面一一進行介紹。
PS:需要注意下新上傳的文件,命名和jfrog倉庫中,在同一個倉庫同一個子目錄下時,如果已經存在同樣命名的文件,那麼新上傳的文件會覆蓋已經存在的文件。
8.1 通過web頁面上傳
我們現在要把本地的user_web_upload.jar文件上傳到testilanni倉庫的user目錄下,並且該文件的大小超過100M。
在通過web頁面上傳文件之前,我們還要修改jfrog的默認web頁面上傳文件大小的限制,因爲jfrog默認通過web方式上傳文件的大小限制是100M。如下圖:
我們只需要把上圖中的“File Upload Max Size”修改爲指定的大小即可。在此我們修改爲0,表示不限制大小。如下:
上傳文件大小限制完畢後,我們就可以上傳文件了,操作步驟如下:
上圖中,我能需要注意“Target Path”選項,如果我們不加子目錄的話,可以不進行設置。如果是在子目錄下的話,這個就需要添加了。
上述是圖片是web端上傳成功後的顯示信息。
下面我們來看下,新上傳的文件在jfrog頁面中顯示的信息,如下:
上述圖片中我們可以看到文件名、大小、創建時間、倉庫路徑、MD5值,以及SHA-1值,其中SHA-1值爲a0b97612c0a984aa365b6451778633f01a66bb18,MD5值爲b18217e8b51113884bcdab865f970b72。
SHA-1值爲上傳文件在jfrog中實際的物理文件名。如下圖:
8.2 通過api方式上傳
通過web方式上傳文件介紹完畢後,我們再來介紹通過api方式上傳文件。
通過api方式上傳文件比較簡單,我們可以使用curl命令發送PUT請求即可。命令如下:
curl -X PUT -u admin:password -T user_api_upload.jar "http://192.180.0.38:8081/artifactory/testilanni/user/user_api_upload.jar"
注意上述圖中,上傳文件顯示的md5值,和文件的md5值是一樣。
現在我們再登錄到web界面查看剛剛通過api上傳的文件,如下截圖:
通過上圖,我們可以很明顯的看出,所有相關的信息和通過api成功上傳後顯示的都是一樣的。
PS:需要注意下,通過API方式上傳的文件,如果該倉庫中沒有對應的子目錄,那麼jfrog會自動創建該子目錄,然後再上傳文件。
九、下載文件
文件成功上傳到jfrog中後,我們就可以通過相關的工具或者命令下載文件。下面我們就介紹通過curl和wget命令下載剛剛上傳的文件。
在下載文件之前,我們可以在web頁面查看所要下載的文件的url,如下:
9.1 使用curl命令下載
jfrog官方默認是使用curl命令進行下載文件。如下:
curl -uadmin:password -O "http://192.180.0.38:8081/artifactory/testilanni/user/user_api_upload.jar"
查看下載文件的md5值,使用如下命令:
md5sum user_api_upload.jar
把上述md5值與第8.1章節中jfrog web頁面上,該文件顯示的md5值對比可以很明顯的發現,上傳後的文件和下載後的文件是一樣的,因爲文件的md5值是一樣的。
當然我們也可以對下載的文件進行重命名,如下:
curl -uadmin:password -o user.jar "http://192.180.0.38:8081/artifactory/testilanni/user/user_api_upload.jar"
9.2 使用wget命令下載
wget命令下載文件和curl命令,差不多,下面我就直接使用該命令下載即可。
下載到當前目錄,使用如下命令:
wget --user=admin --password=password "http://192.180.0.38:8081/artifactory/testilanni/user/user_api_upload.jar"
下載到當前目錄,並對對文件進行重命名:
wget --user=admin --password=password "http://192.180.0.38:8081/artifactory/testilanni/user/user_api_upload.jar" -O ./user.jar
十、openLDAP配置
爲了對jfrog的操作權限進行控制,在此我們使用openldap接入用戶的統一管理。具體配置如下截圖:
LDAP URL中要填寫ldap的服務器地址以及base dn,如下:
ldap://ldap.ilanni.com:389/dc=ilanni,dc=com
Search Filter和Search Base要填寫(uid={0})和ou=People。
Manager DN和Manager Password要填寫ldap管理員的賬號和密碼,如下示例:
cn=root,dc=ilanni,dc=com和password
以上openldap配置完畢後,我們來測試下剛剛的配置是否生效。如下:
通過上圖可以很明顯的看出,openldap與jfrog的集成是沒有問題的,是成功的。
但是除了以上配置之外,我們還需要激活該配置,如下:
PS:在這裏需要說明一點,開源版本的jfrog不支持ldap的用戶組,這個很坑。
十一、用戶授權
ldap與jfrog的集成配置完畢後,我們必須先使用ldap中的用戶登錄到jfrog web頁面,然後再退出這個用戶。
這樣管理員才能在jfrog的web頁面看到這個用戶,這個操作和gitlab ce版本很像,都是需要先登錄到系統,然後系統中才能看到該用戶。
在此我們以ilanni這個用戶爲例,要求把ilanni用戶設置爲管理員,需要進行如下的操作。
ilanni用戶登錄到jfrog就不做演示,我們直接進入權限配置模式。相關截圖如下:
經過以上設置ilanni用戶就已經是jfrog的管理員,現在我們使用ilanni用戶登錄的頁面,如下:
十二、設置匿名訪問以及下載權限
默認情況下jfrog是不允許匿名下載以及訪問的,考慮到實際的情況,我們現在需要jfrog可以匿名訪問。
相關配置據圖如下:
使用如下命令測試匿名下載功能:
wget "http://192.180.0.38:8081/artifactory/testilanni/user/user_web_upload.jar"
通過上圖可以很明顯的看出,匿名用戶具有下載權限。
我們再來看匿名瀏覽權限,如下截圖:
通過上圖我們可以很明顯的看出,現在匿名用戶也可以瀏覽jfrog的相關資源。
十三、通過api獲取文件版本
在實際使用過程中,我們會獲取指定倉庫的所有已有的文件版本,我們可以通過api的方式來獲取。
因爲要使用到jq工具,所以我們首先要安裝jq工具,如下:
yum -y install jq
下面使用curl和jq命令,獲取testilanni倉庫下user目錄所有的jar包名稱,命令如下:
curl -s http://192.180.0.38:8081/artifactory/api/storage/testilanni/user | jq -r '.children[] |select(.folder==false) |.uri' |cut -d '/' -f 2
得到所有jar包名稱,我們就可以後續的操作,比如與jenkins進行集成等。
到此有關jfrog的安裝與使用就已經全部結束。