Jenkins的制品管理
制品是什么?
也叫產出物或工件。制品是軟件開發過程中產生的多種有形副產品之一。廣義的制品包括用例、UML圖、設計文檔等。而狹義的制品就可以簡單地理解為二進制包。雖然有些代碼是不需要編譯就可以執行的,但是我們還是習慣於將這些可執行文件的集合稱為二進制包。
制品管理倉庫
最簡單的制品管理倉庫就是將制品統一放在一個系統目錄結構下。但是很少有人這樣做,更多的做法是使用現成的制品庫。
制品管理涉及兩件事情:一是如何將制品放到制品庫中;二是如何從制品庫中取出制品。
目前現成的制品庫有:Nexus、Artifactory。(nexus經常被用來搭建maven私有倉庫)
docker安裝Nexus
查找鏡像
$ docker search nexus
下載鏡像
$ docker pull sonatype/nexus3
啟動容器
docker run -d --name nexus3 \
--restart=always \
-p 8081:8081 \
-p 8082:8082 \
-p 8083:8083 \
-p 8084:8084 \
-p 8085:8085 \
-v /opt/nexus-data:/nexus-data \
sonatype/nexus3
archiveArtifacts制品管理
archiveArtifacts步驟能對制品進行歸檔,然后你就可以從Jenkins頁面上下載制品了,如圖
Jenkinsfile內容如下:
archiveArtifacts的參數
• artifacts(必填):字符串類型,需要歸檔的文件路徑,使用的是Ant風格路徑表達式。
• fingerprint(可選):布爾類型,是否對歸檔的文件進行簽名。
• excludes(可選):字符串類型,需要排除的文件路徑,使用的也是Ant風格路徑表達式。
• caseSensitive(可選):布爾類型,對路徑大小寫是否敏感。
• onlyIfSuccessful(可選):布爾類型,只在構建成功時進行歸檔。
archiveArtifacts步驟並不只用於歸檔JAR包,事實上,它能歸檔所有類型的制品。
管理Java棧制品
-
使用maven發布制品到nexus中
Maven Deploy插件能將JAR包及POM文件發布到Nexus中
使用Deploy插件發布需要以下幾個步驟。
(1)配置發布地址。在Maven項目的POM文件中加入:
Deploy插件會根據Maven項目中定義的version值決定是使用nexus-snapshot倉庫還是nexus-release倉庫。當version值是以-SNAPSHOT后綴結尾時,則發布到nexus-snapshot倉庫。
(2)配置訪問Nexus的用戶名和密碼。在Nexus中,我們配置了只有授權的用戶名和密碼才能發布制品。這時需要在Maven的settings.xml中加入配置:
-
使用Nexus插件發布制品
安裝Nexus Platform插件
(1)進入Manage Jenkins→Configure System→Sonatype Nexus頁,設置Nexus 3.x的服務器地址,如圖
• 在“Credentials”選項處,增加了一個具有發布制品到Nexus中的權限的用戶名和密碼憑證。
• Server ID字段的值,在Jenkinsfile中會引用。
設置完成后,單擊“Test connection”按鈕測試設置是否正確。
(2)在Jenkinsfile中加入nexusPublisher步驟。
nexusPublisher的參數介紹:
• nexusInstanceId:在Jenkins中配置Nexus 3.x時的Server ID。
• nexusRepositoryId:發布到Nexus服務器的哪個倉庫。
• mavenCoordinate:Maven包的坐標,packaging值與Maven中的packaging值一致,可以是jar、war、pom、hpi等。
• mavenAssetList:要發布的文件,如果是pom.xml,則extension必須填“xml”。
此插件的缺點:
• 每個Maven項目都可能不同,必須為每個Maven項目寫nexusPublisher方法。
• 對於多模塊的Maven項目,nexusPublisher的參數寫起來十分啰唆。
使用Nexus管理Docker鏡像
-
Nexus:創建Docker私有倉庫
進入Nexus的倉庫列表頁:Administration→Repository→Repositories,單擊“docker(hosted)”
指定Docker私有倉庫提供HTTP服務的端口為8595。私有倉庫的地址為:http://<ip>:8595。
-
創建Docker私有倉庫憑證
將鏡像推送到Docker私有倉庫是需要用戶名和密碼的。我們不能將密碼明文寫在Jenkinsfile中,所以需要創建一個“Username with password”憑證。
-
構建並發布Docker鏡像
當私有倉庫創建好后,我們就可以構建Docker鏡像並發布到倉庫中了。假設Dockerfile與Jenkinsfile在同一個目錄下,我們看一下Jenkinsfile的內容。
withDockerRegistry步驟做的事情實際上就是先執行命令:docker login-u admin-p********http://192.168.0.101:8595。其間,所生成的config.json文件會存儲在工作空間中。然后再執行閉包內的命令。
將鏡像推送到Nexus中后,在Nexus中可以看到如圖
注:由於是私有的非安全(HTTP)的倉庫,所以需要配置Docker的daemon.json。
Nexus raw制品管理
raw倉庫可以被理解為一個文件系統,我們可以在該倉庫中創建目錄。
-
創建raw倉庫
進入Administration→Repository→Repositories頁
單擊“raw(hosted)”,進入raw倉庫創建頁。
輸入倉庫名稱“raw-example”,單擊“Create repository”按鈕,確認后創建成功。該倉庫的地址是:<你的Nexus地址>/repository/raw-example/。
-
上傳制品,獲取制品
使用HTTP客戶端就可以將制品上傳到raw倉庫中。我們使用Linux curl命令。
(1)在Jenkins上添加“Username with password”憑證,如圖所示。
(2)在Jenkinsfile中加入上傳制品的步驟。
curl命令的格式為:
如果目錄不存在,nexus將會自動創建
-
在Jenkins pipeline中獲取原始制品時,我們同樣使用curl命令。
從其他pipeline中拷貝制品
-
安裝Copy Artifact插件
-
代碼:從core項目中拿到最后一次構建成功的制品。
copyArtifacts步驟的參數詳解:
• projectname(必填):字符串類型,Jenkins job或pipeline名稱。
• selector:BuildSelector類型,從另一個pipeline中拷貝制品的選擇器,默認拷貝最后一個制品。
• parameters:字符串類型,使用逗號分隔的鍵值對字符串(name1=value1,name2=value2),用於過濾從哪些構建中拷貝制品。
• filter:字符串類型,Ant風格路徑表達式,用於過濾需要拷貝的文件。
• excludes:字符串類型,Ant風格路徑表達式,用於排除不需要拷貝的文件。
• target:字符串類型,拷貝制品的目標路徑,默認為當前pipeline的工作目錄。
• optional:布爾類型,如果為true,則拷貝失敗,但不影響本次構建結果。
• fingerprintArtifacts:布爾類型,是否對制品進行簽名,默認值為true。
• resultVariableSuffix:上例中,無法得知我們到底拿的是core項目的哪次構建的制品。CopyArtifact 插件的設計是將其構建次數放到一個環境變量中。這個環境變量名就是在COPYARTIFACT BUILD NUMBER 后拼上resultVariableSuffix,比如resultVariableSuf fix值為corejob,那么就在pipeline中通過變量COPYARTIFACT BUILD NUMBER corejob拿到源pipeline的構建次數了。
幾種常用的獲取選擇器:
• lastSuccessful:最后一次構建成功的制品。方法簽名為lastSuccessful(boolean stable)。stable為true表示只取構建成功的制品,為false表示只要構建結果比UNSTABLE好就行。
• specific:指定某一次構建的制品。方法簽名為specific(String buildNumber)。buildNum ber表示指定取第n次構建的制品。
• lastCompleted:最后一次完成構建的制品,不論構建的最終狀態如何。方法簽名為lastCompleted()。
• latestSavedBuild:最后一次被標記為keep forever的構建的制品。方法簽名為latestSavedBu ild()。
版本號管理
語義化版本格式為:主版本號.次版本號.修訂號。版本號遞增規則如下:
• 主版本號:當作了不兼容的API修改時。
• 次版本號:當作了向下兼容的功能性新增時。
• 修訂號:當作了向下兼容的問題修正時。
先行版本號及版本編譯元數據可以加到“主版本號.次版本號.修訂號”的后面,作為延伸。以下是常用的修飾詞。
• alpha:內部版本。
• beta:測試版本。
• rc:即將作為正式版本發布。
• lts:長期維護。
方便生成版本號的Version Number插件
VersionNumber步驟支持以下參數。
• versionNumberString:字符串類型,版本號格式,用於生成版本號。只能使用單引號,以防格式中的占位符被轉義。版本號格式支持多種占位符,稍后介紹。
• versionPrefix:字符串類型,版本號的前綴。
• projectStartDate:字符串類型,項目開始時間,格式為yyyy-MM-dd,用於計算項目開始后的月數和年數。
• worstResultForIncrement:字符串類型,如果本次構建狀態比上一次構建狀態更糟糕,則BUILDS_TODAY、BUILDS_THIS_WEEK、BUILDS_THIS_MONTH、BUILDS_THIS_YEAR占位符的值不會增加。worstResultForIncrement可以設置的值有SUCCESS、UNSTABLE、FAILURE、ABORTED、NOT_BUILT(默認)。此參數較少使用。versionNumberString參數使用占位符生成版本號。部分占位符本身支持參數化。接下來分別介紹它們。
• BUILD DATE FORMATTED:格式化的構建日期,支持參數化,如${BUILD DATEFORMATTED,"yyyy-MM-dd"}。
• BUILD DAY:構建日期,支持X和XX參數。比如是12月2日,${BUILD DAY}將返回2,${BUILD DAY,X}將返回2,${BUILD DAY,XX}將返回03。
• BUILD WEEK:今年構建的星期數,支持X和XX參數。
• BUILD MONTH:今年構建的月數,支持X和XX參數。
• BUILD YEAR:今年構建的年份。
比如構建的時間為2018-12-02,那么BUILD_DAY的值為2,BUILD_WEEK的值為49,BUILD_MONTH的值為12,BUILD_YEAR的值為2018。
接下來是一組和構建數相關的占位符:BUILDS TODAY、BUILDS THIS WEEK、BUILDS THISMONTH、BUILDS THIS YEAR,它們分別表示當天、本星期、本月、本年完成的構建數。
BUILDS ALL TIME表示自從項目開始后完成的總構建數。MONTHS SINCE PROJECT START和YEARS SINCE PROJECT START分別表示自項目開始日期起已過去的日歷月數和年數。