Jenkins的製品管理

Jenkins的製品管理

製品是什麼?

也叫產出物或工件。製品是軟件開發過程中產生的多種有形副產品之一。廣義的製品包括用例、UML圖、設計文檔等。而狹義的製品就可以簡單地理解為二進制包。雖然有些代碼是不需要編譯就可以執行的,但是我們還是習慣於將這些可執行文件的集合稱為二進制包。

製品管理倉庫

最簡單的製品管理倉庫就是將製品統一放在一個系統目錄結構下。但是很少有人這樣做,更多的做法是使用現成的製品庫。

製品管理涉及兩件事情:一是如何將製品放到製品庫中;二是如何從製品庫中取出製品。

目前現成的製品庫有:Nexus、Artifactory。(nexus經常被用來搭建maven私有倉庫)

docker安裝Nexus

查找鏡像

<code>$ docker search nexus/<code>

下載鏡像

<code>$ docker pull sonatype/nexus3/<code>

啟動容器

<code>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/<code>

archiveArtifacts製品管理

archiveArtifacts步驟能對製品進行歸檔,然後你就可以從Jenkins頁面上下載製品了,如圖

Jenkins的製品管理

Jenkinsfile內容如下:

Jenkins的製品管理

archiveArtifacts的參數

• artifacts(必填):字符串類型,需要歸檔的文件路徑,使用的是Ant風格路徑表達式。

• fingerprint(可選):布爾類型,是否對歸檔的文件進行簽名。

• excludes(可選):字符串類型,需要排除的文件路徑,使用的也是Ant風格路徑表達式。

• caseSensitive(可選):布爾類型,對路徑大小寫是否敏感。

• onlyIfSuccessful(可選):布爾類型,只在構建成功時進行歸檔。

archiveArtifacts步驟並不只用于歸檔JAR包,事實上,它能歸檔所有類型的製品。

管理Java棧製品

  1. 使用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鏡像

  1. Nexus:創建Docker私有倉庫 進入Nexus的倉庫列表頁:Administration→Repository→Repositories,單擊“docker(hosted)” 指定Docker私有倉庫提供HTTP服務的端口為8595。私有倉庫的地址為:http://<ip>:8595。
  2. 創建Docker私有倉庫憑證 將鏡像推送到Docker私有倉庫是需要用戶名和密碼的。我們不能將密碼明文寫在Jenkinsfile中,所以需要創建一個“Username with password”憑證。
  1. 構建併發布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倉庫可以被理解為一個文件系統,我們可以在該倉庫中創建目錄。

  1. 創建raw倉庫 進入Administration→Repository→Repositories頁 單擊“raw(hosted)”,進入raw倉庫創建頁。 輸入倉庫名稱“raw-example”,單擊“Create repository”按鈕,確認後創建成功。該倉庫的地址是:<你的Nexus地址>/repository/raw-example/。
  2. 上傳製品,獲取製品 使用HTTP客戶端就可以將製品上傳到raw倉庫中。我們使用Linux curl命令。 (1)在Jenkins上添加“Username with password”憑證,如圖所示。 (2)在Jenkinsfile中加入上傳製品的步驟。 curl命令的格式為: 如果目錄不存在,nexus將會自動創建
  3. 在Jenkins pipeline中獲取原始製品時,我們同樣使用curl命令。

從其他pipeline中拷貝製品

  1. 安裝Copy Artifact插件
  2. 代碼:從core項目中拿到最後一次構建成功的製品。
Jenkins的製品管理

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插件

Jenkins的製品管理

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分別表示自項目開始日期起已過去的日曆月數和年數。


分享到:


相關文章: