我有一个.m2/repository目录,其中有很多旧的工件。是否有一种方法可以用脚本或任何插件清理.m2/repository文件夹?
我还想告诉大家,我想删除超过14天的工件。.m2/repository文件夹没有子文件夹。
请指正
你的答案应该是:
now = new Date()
configuration = new Configuration()
cleanedSize = 0
details = []
directoryFilter = new DirectoryFilter()
nonSnapshotDirectoryFilter = new NonSnapshotDirectoryFilter()
def class Configuration {
def homeFolder = System.getProperty("user.home")
def path = homeFolder + "/.m2/repository"
def dryRun = true
def printDetails = true
def maxAgeSnapshotsInDays = 60
def maxAgeInDays = 14
def versionsToKeep = ["3.1.0.M1"]
def snapshotsOnly = true
}
private def cleanMavenRepository(File file) {
def lastModified = new Date(file.lastModified());
def ageInDays = now - lastModified;
def directories = file.listFiles(directoryFilter);
if (directories.length > 0) {
directories.each {
cleanMavenRepository(it);
}
} else {
if (ageInDays > configuration.maxAgeSnapshotsInDays && file.canonicalPath.endsWith("-SNAPSHOT")) {
int size = removeDirAndReturnFreedKBytes(file)
details.add("About to remove directory $file.canonicalPath with total size $size and $ageInDays days old");
} else if (ageInDays > configuration.maxAgeInDays && !file.canonicalPath.endsWith("-SNAPSHOT") && !configuration.snapshotsOnly) {
String highest = obtainHighestVersionOfArtifact(file)
if (file.name != highest && !configuration.versionsToKeep.contains(file.name)) {
int size = removeDirAndReturnFreedKBytes(file)
details.add("About to remove directory $file.canonicalPath with total size $size and $ageInDays days old and not highest version $highest");
}
}
}
}
在这个回答中,作者删除了一段时间未访问的文件。这比基于修改删除文件要好,因为会有一些文件很长时间没有修改,但仍然需要你的构建(例如稳定依赖项)。
根据你的要求,我可以稍微修改一下
find ~jenkins/.m2/repository -atime +14 -iname '*.pom' |
while read pom;
do parent=`dirname "$pom"`;
rm -rf "$parent";
done
意译作者:
这将找到最后一次访问超过[14天]的所有
*.pom
文件[…]]并删除他们的目录。
对于我们的用例,我们在一个单独的Jenkins作业中使用一个类似的命令,带有last_access
构建参数。
项目参数化
- 字符串参数
- 名称:
last_access
- 默认值:
30
- 描述
删除上次访问日期超过指定天数的文件。
- 名称:
构建- 字符串参数
:
执行shell,命令:
find $JENKINS_HOME/.m2/repository -atime +$last_access -iname '*.pom' | while read pom; do parent=`dirname "$pom"`; rm -rf "$parent"; done
建立触发器:
定期构建,进度:
(每天)H 22 * * *
注意:这可以直接添加到cron中,但我更喜欢在Jenkins中使用
我确实花了一些时间来研究这个问题,对于答案,其中许多依赖于atime
(这是UNIX系统上的最后访问时间),这是一个不可靠的解决方案,原因有两个:
- 大多数UNIX系统(包括Linux和macOS)最多不定期更新
atime
,这是有原因的:atime
的完整实现意味着整个文件系统将因每次读取文件时必须更新(即写入磁盘)atime
而减慢速度,此外,拥有如此极端数量的更新将非常迅速地磨损现代高性能SSD驱动器 - 在CI/CD环境中,用于构建Maven项目的VM将从共享存储恢复其Maven存储库,这反过来将使
atime
设置为"最近";值
因此,我创建了一个Maven存储库清理器,并在https://github.com/alitokmen/maven-repository-cleaner/上提供它。bash maven-repository-cleaner.sh
脚本有一个函数cleanDirectory
,它是一个递归函数,循环遍历~/.m2/repository/
,并执行以下操作:
- 当子目录不是版本号时,它将挖掘到该子目录进行分析
- 当一个目录有显示版本号的子目录时,它只删除所有较低的版本
-
artifact-group
-
artifact-name
-
1.8
-
1.10
-
1.2
-
-
…maven-repository-cleaner.sh
脚本将:
- 导航到
artifact-group
- 在
artifact-group
,导航到artifact-name
- 在
artifact-name
中,删除1.8
和1.2
子文件夹,因为1.10
优于1.2
和1.8
要在CI/CD平台(或任何其他形式的UNIX系统)上运行该工具,只需在构建的开头或结尾使用以下三行代码:
wget https://raw.githubusercontent.com/alitokmen/maven-repository-cleaner/main/maven-repository-cleaner.sh
chmod +x maven-repository-cleaner.sh
./maven-repository-cleaner.sh