Jenkins的制品管理


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頁面上下載制品了,如圖

file

Jenkinsfile內容如下:

file

archiveArtifacts的參數

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

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

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

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

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

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

管理Java棧制品

  1. 使用maven發布制品到nexus中

    Maven Deploy插件能將JAR包及POM文件發布到Nexus中

    file

    使用Deploy插件發布需要以下幾個步驟。

    (1)配置發布地址。在Maven項目的POM文件中加入:

    file

    Deploy插件會根據Maven項目中定義的version值決定是使用nexus-snapshot倉庫還是nexus-release倉庫。當version值是以-SNAPSHOT后綴結尾時,則發布到nexus-snapshot倉庫。

    (2)配置訪問Nexus的用戶名和密碼。在Nexus中,我們配置了只有授權的用戶名和密碼才能發布制品。這時需要在Maven的settings.xml中加入配置:

    file

  2. 使用Nexus插件發布制品

    安裝Nexus Platform插件

    (1)進入Manage Jenkins→Configure System→Sonatype Nexus頁,設置Nexus 3.x的服務器地址,如圖

    file

    • 在“Credentials”選項處,增加了一個具有發布制品到Nexus中的權限的用戶名和密碼憑證。

    • Server ID字段的值,在Jenkinsfile中會引用。

    設置完成后,單擊“Test connection”按鈕測試設置是否正確。

    (2)在Jenkinsfile中加入nexusPublisher步驟。

    file

    ​ 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)”

    file

    指定Docker私有倉庫提供HTTP服務的端口為8595。私有倉庫的地址為:http://<ip>:8595。

    file

  2. 創建Docker私有倉庫憑證

    將鏡像推送到Docker私有倉庫是需要用戶名和密碼的。我們不能將密碼明文寫在Jenkinsfile中,所以需要創建一個“Username with password”憑證。

  3. 構建並發布Docker鏡像

    當私有倉庫創建好后,我們就可以構建Docker鏡像並發布到倉庫中了。假設Dockerfile與Jenkinsfile在同一個目錄下,我們看一下Jenkinsfile的內容。

    file

    ​ withDockerRegistry步驟做的事情實際上就是先執行命令:docker login-u admin-p********http://192.168.0.101:8595。其間,所生成的config.json文件會存儲在工作空間中。然后再執行閉包內的命令。

    將鏡像推送到Nexus中后,在Nexus中可以看到如圖

    file

    注:由於是私有的非安全(HTTP)的倉庫,所以需要配置Docker的daemon.json。

    file

Nexus raw制品管理

​ raw倉庫可以被理解為一個文件系統,我們可以在該倉庫中創建目錄。

  1. 創建raw倉庫

    進入Administration→Repository→Repositories頁

    file

    單擊“raw(hosted)”,進入raw倉庫創建頁。

    輸入倉庫名稱“raw-example”,單擊“Create repository”按鈕,確認后創建成功。該倉庫的地址是:<你的Nexus地址>/repository/raw-example/。

    file

  2. 上傳制品,獲取制品

使用HTTP客戶端就可以將制品上傳到raw倉庫中。我們使用Linux curl命令。

(1)在Jenkins上添加“Username with password”憑證,如圖所示。

file
(2)在Jenkinsfile中加入上傳制品的步驟。

file

curl命令的格式為:

file

如果目錄不存在,nexus將會自動創建

  1. 在Jenkins pipeline中獲取原始制品時,我們同樣使用curl命令。

    file

從其他pipeline中拷貝制品

  1. 安裝Copy Artifact插件

  2. 代碼:從core項目中拿到最后一次構建成功的制品。

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

file

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM