Fullmenu null

 

16 September 2017

En algún momento de tu vida tendrás que recorrer un directorio de ficheros buscando aquellos que cumplan una condición especial y ejecutar algún comando si lo encuentras. A veces la condición es simple, como buscar un texto dentro del fichero, que el nombre del fichero cumpla un patrón, etc, pero otras será algo más complicado.

Recientemente surgió la necesidad de subir todo el contenido de un repositorio maven en local (.m2) a un repositorio remoto Nexus3 por lo que un simple copy&paste no era suficiente. En concreto las condiciones del proceso se resumían en:

  • el repositorio Nexus3 está protegido por usuario/password

  • buscar recursivamente en un directorio dado

  • buscar si existe un fichero POM para el artefacto

  • comprobar si existía un jar o un war con el mismo nombre del POM

  • si la versión a la que apuntan es un snapshot deberán instalarse en un repo diferente que si es una release

  • ejecutar el comando mvn deploy:deploy-file con los parámetros correctos

Tip
Obviamente en tu caso los requisitos serán totalmente distintos y probablemente podrás resolverlo con un BASH pero tal vez las condiciones se vayan complicando y será cuando quieras hacerte un script como este
repoUrl=""
repoSnapUrl=""

void scanDir( dir ){
    dir.eachFile{ f->
        if( f.name.endsWith(".pom") ){  //(1)
            def jar = dir.listFiles().find{
                (it.name.endsWith(".jar") || it.name.endsWith(".war")) &&  //(2)
                        it.name.split('\\.').dropRight(1).join('.') == f.name.split('\\.').dropRight(1).join('.')
            }
            if( jar ){
                String url = jar.name.toLowerCase().contains("-snapshot.") ? repoSnapUrl : repoUrl  //(3)
                """mvn deploy:deploy-file
                        -Dfile=$jar.absolutePath
                        -DpomFile=$f.absolutePath
                        -Durl=$url
                        -DrepositoryId=$repoId""".execute()  //(4)
            }
        }
    }
    dir.eachDir{ d->  //(5)
        scanDir(d)
    }
}

repoId = args[1]
repoUrl = args[2]
repoSnapUrl = args.length > 3 ? args[3] : args[2]

scanDir( new File(args[0]) )
  1. Comprobamos si existe un fichero POM

  2. Comprobamos si existe un Jar o War con el mismo nombre (indica que pertenecen a la misma version)

  3. Configuramos repositorio para snapshot o para release

  4. Construimos una cadena y la ejecutamos contra el sistema operativo

  5. Recorremos recursivamente los subdirectorios


Script
repoUrl=""
repoSnapUrl=""

void scanDir( dir ){
    dir.eachFile{ f->
        if( f.name.endsWith(".pom") ){  //(1)
            def jar = dir.listFiles().find{
                (it.name.endsWith(".jar") || it.name.endsWith(".war")) &&  //(2)
                        it.name.split('\\.').dropRight(1).join('.') == f.name.split('\\.').dropRight(1).join('.')
            }
            if( jar ){
                String url = jar.name.toLowerCase().contains("-snapshot.") ? repoSnapUrl : repoUrl  //(3)
                """mvn deploy:deploy-file
                        -Dfile=$jar.absolutePath
                        -DpomFile=$f.absolutePath
                        -Durl=$url
                        -DrepositoryId=$repoId""".execute()  //(4)
            }
        }
    }
    dir.eachDir{ d->  //(5)
        scanDir(d)
    }
}

repoId = args[1]
repoUrl = args[2]
repoSnapUrl = args.length > 3 ? args[3] : args[2]

scanDir( new File(args[0]) )