如何在jenkins中删除maven本地存储库中的旧工件



我有一个.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系统上的最后访问时间),这是一个不可靠的解决方案,原因有两个:

  1. 大多数UNIX系统(包括Linux和macOS)最多不定期更新atime,这是有原因的:atime的完整实现意味着整个文件系统将因每次读取文件时必须更新(即写入磁盘)atime而减慢速度,此外,拥有如此极端数量的更新将非常迅速地磨损现代高性能SSD驱动器
  2. 在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脚本将:

  1. 导航到artifact-group
  2. artifact-group,导航到artifact-name
  3. artifact-name中,删除1.81.2子文件夹,因为1.10优于1.21.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

最新更新