【Jenkins使用之六】jenkins集成Maven-编译、nexus-制品管理、清理工作空间
环境
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
参考: