環境
CentOS Linux release 7.6.1810
jdk1.8.0_65
apache-tomcat-8.5.45
Jenkins-2.235.5
apache-maven-3.6.3
git-2.9.5
gradle-6.6.1
SonarQube-7.8
sonar-scanner-cli-4.2.0.1873
拓撲:
node1:安裝GitLab、SonarQube
node2:安裝Jenkins、Git、maven
一、maven配置
1、安裝Maven
安裝Maven:使用Maven進行編譯,這里要配置setting.xml里的倉庫地址,可以是內網的某個nexus,保證開發人員的代碼依賴編譯正確。
參考:
理解和創建proxy、hosted、group倉庫
配置本地項目或maven下載、發布構件到Nexus
2、配置Maven
配置setting.xml里的倉庫地址,可以是內網的某個nexus,保證開發人員的代碼依賴編譯正確。

<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <!--自定義maven本地倉庫地址--> <localRepository>/data/repo</localRepository> <pluginGroups> </pluginGroups> <proxies> </proxies> <!--nexus服務器登錄驗證信息 上傳構件時要用 和項目pom.xml里的distributionManagement配合使用 兩個文件的 id 需要保持一致--> <servers> <server> <id>releases</id> <username>admin</username> <password>admin123</password> </server> <server> <id>snapshots</id> <username>admin</username> <password>admin123</password> </server> </servers> <!--倉庫組的url地址 id和name自定義,mirrorOf的值設置為*,代表maven的所有訪問請求都會指向到Nexus倉庫組--> <mirrors> <mirror> <id>nexus-82.46</id> <name>repo-82.46</name> <url>http://192.168.82.46:8081/repository/maven-public/</url> <mirrorOf>*</mirrorOf> </mirror> <mirror> <id>nexus-125.127</id> <name>repo-125.127</name> <mirrorOf>central</mirrorOf> <url>http://192.168.125.127:8081/repository/maven-public/</url> </mirror> </mirrors> <profiles> <profile> <id>myprofile</id> <repositories> <repository> <id>central</id> <url>http://192.168.82.46:8081/repository/maven-public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>http://192.168.82.46:8081/repository/maven-public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile> </profiles> </settings>
二、jenkins配置maven編譯
(1)這里我們使用一種新的jenkins Item類型:Multibranch Pipeline
(2)這里選擇只配置Gitlab 數據源就可以了,默認使用Jenklinsfile作為流水線配置文件
(3)GItlab 上傳Jenkinsfile和maven工程
給出pom.xml,jenkinsfile中maven構建參數會用到:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!--模型版本--> <modelVersion>4.0.0</modelVersion> <!--組織名稱,此處使用組織名稱+項目名稱--> <groupId>com.wjy</groupId> <!--項目名稱--> <artifactId>mymaven</artifactId> <!-- 當前項目版本號: 同一個項目開發過程中可以發布多個版本,此處標示1.0版。 每個工程發布后可以發布多個版本, 依賴時調取不同的版本,使用不同的版本號 --> <version>1.0.0</version> <!--名稱與訪問地址,可省略--> <name>hello-world</name> <url>http://maven.apache.org</url> <!--定義編碼格式--> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!--依賴庫--> <dependencies> <!--單元測試--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
(4)每次修改Jenkinsfile文件都要刷一下:Scan Multibranch Pipeline Now 會使新修改的Jenkinsfile生效
(5)通過Blue Ocean查看
jenkins任務工作空間目錄:
[root@node106 HelloWorldTest_master]# tree . ├── mymaven │ ├── Jenkinsfile │ ├── pom.xml │ ├── README.md │ ├── src │ │ ├── main │ │ │ └── java │ │ │ └── com │ │ │ └── wjy │ │ │ └── App.java │ │ └── test │ │ └── java │ │ └── com │ │ └── wjy │ │ └── AppTest.java │ └── target │ ├── classes │ │ └── com │ │ └── wjy │ │ └── App.class │ ├── generated-sources │ │ └── annotations │ ├── generated-test-sources │ │ └── test-annotations │ ├── maven-archiver │ │ └── pom.properties │ ├── maven-status │ │ └── maven-compiler-plugin │ │ ├── compile │ │ │ └── default-compile │ │ │ ├── createdFiles.lst │ │ │ └── inputFiles.lst │ │ └── testCompile │ │ └── default-testCompile │ │ ├── createdFiles.lst │ │ └── inputFiles.lst │ ├── mymaven-1.0.0.jar │ ├── surefire-reports │ │ ├── com.wjy.AppTest.txt │ │ └── TEST-com.wjy.AppTest.xml │ └── test-classes │ └── com │ └── wjy │ └── AppTest.class └── mymaven@tmp 30 directories, 15 files
這里重點研究下Jenkinsfile 這里使用腳本式語法:
node{ def workspace=pwd() jar_name='mymaven' //拉取代碼 或者使用 checkout scm stage 'checkout' println "checkout" dir('mymaven'){ git branch: 'master', credentialsId: 'gitlab-wangjy', url: 'http://134.32.82.46:19527/wjy/maven-basic.git' } //編譯 執行mvn命令 stage 'build' println "build" sh """ cd $workspace/mymaven /usr/local/apache-maven-3.6.3/bin/mvn clean install -U -P coverage """ //備份 根據war包在備份目錄制作一個tar包用來備份 stage 'backup' println "backup" sh""" cd $workspace/'$jar_name'/target tar cfz /data/.jenkins/workspace/backup/'$jar_name'`date +%y%m%d-%s`.tar.gz '$jar_name'-1.0.0.jar """ //刪除目標主機 //上傳編譯后打包 //重啟tomcat }
注意:
$workspace 可以直接引用,$jar_name需要加單引號''; maven參數-P coverage:-P maven將觸發pom.xml文件中coverage環境的profile配置,在實際中可以設置為不同的研發版本設置,比如dev-開發版本,test-測試版本,uat-准生產版本,prod-生產版本
關於自動構建過程中自動打包配置文件,可以參考:jenkins+maven動態打包配置文件
引入一個完整版的Jenkinsfile 包含拉取代碼,編譯,打包,刪除舊部署文件,上傳新包,重啟Tomcat,借助sshpass使用比較老的部署方式,目前都是使用Ansible插件、或者Docker打鏡像。

node{
//工作空間
def workspace=pwd()
war_name='mymaven'
//部署主機登錄信息
host='127.0.0.1'
user='wjy'
passwd='wjy'
tomcat_home=''
//拉取代碼 或者使用 checkout scm
stage 'checkout'
println "checkout"
dir('mymaven'){
git branch: 'master', credentialsId: 'gitlab-wangjy', url: 'http://134.32.82.46:19527/wjy/maven-basic.git'
}
//編譯 執行mvn命令
stage 'build'
println "build"
sh """
cd $workspace/mymaven
/usr/local/apache-maven-3.6.3/bin/mvn clean install -U -P coverage
"""
//備份 根據war包在備份目錄制作一個tar包用來備份
stage 'backup'
println "backup"
sh"""
cd $workspace/'$war_name'/target
tar cfz /data/.jenkins/workspace/backup/'$war_name'`date +%y%m%d-%s`.tar.gz '$war_name'-1.0.0.war
"""
//刪除目標主機
//StrictHostKeyChecking=no #主機key檢查,當你第一次連接某台機器時,會出現交互式頁面,避免出現這種情況 設置no
stage 'delete_old'
println "delete_old"
sh """
sshpass -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$host' "rm -rf '$tomcat_home'/deploy/'$war_name'* "
"""
//上傳編譯后打包
stage 'upload'
println "upload"
sh """
cd $workspace/'$war_name'/target
sshpass -p '$passwd' scp -o StrictHostKeyChecking=no '$war_name'.jar '$user'@'$host':'$tomcat_home'/deploy/'$war_name'.war
"""
//重啟tomcat
stage 'restart_tomcat'
println "restart_tomcat"
sh "sshpass -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$host' 'bash /home/admin/if_tomcat.sh'"
echo 'done_______________'
}
三、Jenkins制品管理
1、jenkins借助maven管理制品
maven deploy plugin主要是為了用來將artifact部署到遠程倉庫中。
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins>
使用Deploy插件發布需要以下幾個步驟:
(1)配置發布地址。在Maven項目的POM文件中加入:
<distributionManagement> <repository> <id>releases</id> <name>public</name> <url>http://192.168.82.46:9999/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>releases</id> <name>Snapshots</name> <url>http://192.168.82.46:9999/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement>
Deploy插件會根據Maven項目中定義的version值決定是使用nexus-snapshot倉庫還是nexus-release倉庫。當version值是以-SNAPSHOT后綴結尾時,則發布到nexus-snapshot倉庫。
(2)配置訪問Nexus的用戶名和密碼。在Nexus中,我們配置了只有授權的用戶名和密碼才能發布制品。這時需要在Maven的settings.xml中加入配置:
<servers> <server> <id>releases</id> <username>admin</username> <password>Aa123456</password> </server> <server> <id>snapshots</id> <username>admin</username> <password>Aa123456</password> </server> </servers>
(3)執行命令mvn clean deploy 制品上傳制品到nexus
2、使用archiveArtifacts本地存檔
archiveArtifacts步驟能對制品進行歸檔,然后你就可以從Jenkins頁面上下載制品了。
(1)新建Multibranch Pipeline 項目,配置GitLab,默認使用Jenkinsfile構建。
(2)這里使用聲明式pipeline
pipeline{ agent any //安裝maven3.6.3 tools{ maven 'mvn-3.6.3' } stages{ stage('Build'){ steps{ //打包 sh "mvn clean package" } } } //事后生成歸檔 post{ always{ archiveArtifacts artifacts: 'target/**/*.jar',fingerprint: true } } }
archiveArtifacts的參數:
• artifacts(必填):字符串類型,需要歸檔的文件路徑,使用的是Ant風格路徑表達式。
• fingerprint(可選):布爾類型,是否對歸檔的文件進行簽名。
• excludes(可選):字符串類型,需要排除的文件路徑,使用的也是Ant風格路徑表達式。
• caseSensitive(可選):布爾類型,對路徑大小寫是否敏感。
• onlyIfSuccessful(可選):布爾類型,只在構建成功時進行歸檔。
archiveArtifacts步驟並不只用於歸檔JAR包,事實上,它能歸檔所有類型的制品
(3)BlueOcean構建
(4)頁面提供歸檔文件下載連接
實際就是連接到target下的生成的jar文件.
[root@node106 target]# pwd /data/.jenkins/workspace/HelloWorldTest_master/mymaven/target [root@node106 target]# ll total 4 drwxr-x--- 3 root root 17 Sep 14 16:34 classes drwxr-x--- 3 root root 25 Sep 14 16:34 generated-sources drwxr-x--- 3 root root 30 Sep 14 16:34 generated-test-sources drwxr-x--- 2 root root 28 Sep 14 16:35 maven-archiver drwxr-x--- 3 root root 35 Sep 14 16:34 maven-status -rw-r----- 1 root root 2523 Sep 14 16:35 mymaven-1.0.0.jar drwxr-x--- 2 root root 65 Sep 14 16:35 surefire-reports drwxr-x--- 3 root root 17 Sep 14 16:34 test-classes
備注:這種方式是將部署包生成在本地保存,生產中用的不多。
3、使用jenkins插件Nexus Platform
(1)jenkins 安裝Nexus Platform插件
(2)在我們自己的nexus私服里創建一個hosted類型cicd-release制品倉庫
(3)在Jenkinsfile中加入nexusPublisher步驟。
pipeline{ agent any //默認含有checkout SCM,所以這里沒有顯式的拉取代碼,如果是拉取其他版本的代碼這里可以添加默認含有checkout stages{ stage('Build'){ steps{ //打包 sh "mvn clean test package" nexusPublisher( nexusInstanceId:'nexus3-82.46', nexusRepositoryId: 'cicd-release', packages: [ [ $class: 'MavenPackage', mavenAssetList: [ [ classifier: '', extention: '', filePath: './target/mymaven-1.0.0.jar' ] ], mavenCoordinate:[ artifactId: 'mymaven', groupId: 'com.wjy', packaging: 'jar', version: '1.0.0' ] ] ], ) } } } }
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的參數寫起來十分啰唆,而且容易寫錯,實際工作中用的也不多。
(4)去倉庫里查看上傳的制品
4、使用Nexus管理Docker鏡像
(1)在Nexus里創建Docker私有倉庫
進入Nexus的倉庫列表頁:Administration→Repository→Repositories,單擊“docker(hosted)”
(2)jenkins所在機器要安裝docker
使用docker制作鏡像,然后將鏡像推送到Nexus,然后后面k8s會從Nexus拉取鏡像去部署。
注意:由於是私有的非安全(HTTP)的倉庫,所以需要配置Docker的daemon.json:否則會報錯Error response from daemon: Get https://192.168.82.46:18083/v2/: http: server gave HTTP response to HTTPS client
[root@node2 local]# vim /etc/docker/daemon.json { "insecure-registries":["192.168.82.46:18083"], "registry-mirrors": ["http://hub-mirror.c.163.com"] }
參考:Docker部署安裝
(3)編寫pipiline
pipeline{ agent any environment{ registry="http://192.168.82.46:18083" registryCredential='nexus3-82.46' } stages{ stage('Build'){ steps{ //制作鏡像 withDockerRegistry([credentialsId: "${registryCredential}",url:"${registry}"]){ sh "docker build . -t 192.168.82.46:18083/hello:v1" sh "docker tag 192.168.82.46:18083/hello:v1 192.168.82.46:18083/hello:v1" sh "docker push 192.168.82.46:18083/hello:v1" } } } } }
withDockerRegistry步驟做的事情:
先執行命令:docker login -u admin -p ******** http://192.168.82.46:18083;其間所生成的config.json文件會存儲在工作空間中。然后再執行閉包內的命令。
(3.1)在本地上傳私有鏡像的時候遇到的報錯:http: server gave HTTP response to HTTPS client
原因是:Docker自從1.3.X之后docker registry交互默認使用的是HTTPS,但是搭建私有鏡像默認使用的是HTTP服務,所以與私有鏡像交時出現以上錯誤。
解決辦法是:vim /etc/docker/daemon.json 增加 "insecure-registries":["192.168.82.46:18083"]
(3.2)報錯:Get https://192.168.82.46/v2/: dial tcp 192.168.82.46:443: connect: connection refused
原因:沒有指定鏡像要上傳的地址,站點。默認的是docker.io
解決方法:
docker tag <imagesname> <ip:port/image>
docker push ip:port/image
(4)去nexus查看鏡像制品
5、Nexus raw制品管理
raw倉庫可以被理解為一個文件系統,我們可以在該倉庫中創建目錄。
(1)創建raw倉庫
(2)編寫pipiline,上傳制品,獲取制品
使用HTTP客戶端就可以將制品上傳到raw倉庫中,我們使用Linux curl命令,如果目錄不存在,nexus將會自動創建
pipeline{ agent any environment{ nexusRawUsernamePassword=credentials('nexus3-82.46') } stages{ stage('Build'){ steps{ sh "curl --user '${nexusRawUsernamePassword}' --upload-file ./target/mymaven-1.0.0.jar http://192.168.82.46:8081/repository/cicd-raw-release/2/mymaven-1.0.0.jar" } } } }
(4)在Jenkins pipeline中獲取原始制品時,我們同樣使用curl命令。
sh "curl --user '${nexusRawUsernamePassword}' -o mymaven-1.0.0.jar http://192.168.82.46:8081/repository/cicd-raw-release/2/mymaven-1.0.0.jar"
6、從其他pipeline中拷貝制品
(1)jenkins安裝Copy Artifact插件
Copy Artifact Plugin插件是將某個job的構建物copy到當前job的工作空間,以此來將不同的job進行關聯。
注意構建物也就是構建后會進行存檔的文件,使用此插件只能copy存檔的文件,而不是直接copy工作空間.
(2)HelloWorldTest編寫pipiline歸檔文件,並賦權給archivetest允許拷貝
pipeline{ agent any //用來指定哪些任務可以拷貝 options { copyArtifactPermission('archivetest*'); } stages{ stage('Build'){ steps{ //打包 sh "mvn clean package" } } } //事后生成歸檔 post{ always{ archiveArtifacts artifacts: 'target/**/*.jar',fingerprint: true } } }
(3)archivetest拷貝HelloWorldTest編譯成功的文件
pipeline{ agent any stages{ stage('Copy Archive'){ steps{ script { echo env.JOB_NAME copyArtifacts filter: 'target/*.jar', fingerprintArtifacts: true, projectName: 'HelloWorldTest/master', selector: lastSuccessful() } } } } }
在各腳本編寫遇到很多問題,其實是可以參考 Pipeline Syntax,不會寫pipeline 就去里面根據后面問號里提示填寫 然后生成腳本復制進去就行了
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()。
(4)構建
拷貝結果:注意是將jar所在目錄一起拷貝過來
[root@node2 target]# pwd /data/.jenkins/workspace/archivetest_master/target [root@node2 target]# ll total 4 -rw-r----- 1 root root 2521 Sep 15 15:20 mymaven-1.0.0.jar
7、版本號管理
語義化版本格式為:主版本號.次版本號.修訂號。版本號遞增規則如下:
• 主版本號:當作了不兼容的API修改時。
• 次版本號:當作了向下兼容的功能性新增時。
• 修訂號:當作了向下兼容的問題修正時。
先行版本號及版本編譯元數據可以加到“主版本號.次版本號.修訂號”的后面,作為延伸。以下是常用的修飾詞。
• alpha:內部版本。
• beta:測試版本。
• rc:即將作為正式版本發布。
• lts:長期維護。
方便生成版本號的Version Number插件
pipeline{ agent any stages{ stage('create version'){ steps{ script{ def version=VersionNumber versionPrefix:"${JOB_NAME}-",versionNumberString: 'v1.1.1.${BUILDS_ALL_TIME}' echo "${version}" } } } } }
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分別表示自項目開始日期起已過去的日歷月數和年數
參考:翟志軍 Jenkins2.X實踐指南
四、清理工作目錄
workspace:工作空間,可以隨便刪除,刪除后再次構建時間可能會比較長,因為要重新獲取一些資源;
job:存放的是項目的配置、構建結果、日志等。不建議手動刪除,手動刪除的后果往往需要重新部署
(1)對於自由風格project的配置中,General部分有個Discard old builds
在這里,我選擇給項目配置丟棄舊的構建這種模式,保持構建的天數和保持最大構建數根據項目的需要設置,保留了7天內構建的最多5次記錄。配置完后,需要重新構建一次,才起作用,這時候我們的job空間會大大縮小。
對於Multibranch Pipeline項目 設置Orphaned Item Strategy:
(2)使用工作空間選項清理
(3)安裝Workspace Cleanup plugin插件
對於自由風格project,在構建后操作Post-build Actions添加delete workspace when build is done
如果使用pipeline:使用如下
編寫Jenkinsfile:
pipeline{ agent any stages{ stage('Copy Archive'){ steps{ script { echo env.JOB_NAME copyArtifacts filter: 'target/**/*.jar', fingerprintArtifacts: true, projectName: 'HelloWorldTest/master', selector: lastSuccessful() } } } } post{ always{ cleanWs cleanWhenAborted: false, cleanWhenFailure: false, cleanWhenNotBuilt: false, cleanWhenUnstable: false } } }
構建結果:
查看工作空間:
之前未清理:
[root@node2 workspace]# ll drwxr-x--- 5 root root 128 Sep 15 18:11 archivetest_master drwxr-x--- 2 root root 6 Sep 15 18:11 archivetest_master@tmp -rw-r----- 1 root root 82 Sep 15 09:50 workspaces.txt
添加清理步驟后:
[root@node2 workspace]# ll drwxr-x--- 2 root root 6 Sep 15 18:11 archivetest_master@tmp -rw-r----- 1 root root 82 Sep 15 09:50 workspaces.txt
參考: