Статьи

Использование Groovy для операций Bash (shell)

Недавно мне нужно было создать отличный сценарий, который удаляет некоторые каталоги на машине с Linux. Вот почему:

  1. У нас есть сервер для выполнения запланированных работ. Такие задания, как ETL из одной БД в другую, Файл в БД и т. Д. Сервер активирует клиентов, которые находятся на машинах, на которые мы хотим воздействовать. Большая часть (почти все) рабочих мест написаны в отличных сценариях.
  2. Частью нашего процесса CI является развертывание WAR на выделенном сервере. Затем у нас есть скрипт, который, помимо прочего, использует программную ссылку для направления «веб-приложений» во вновь созданный каталог. Это развертывание происходит один раз в час, что быстро заполняет выделенный сервер.

Поэтому мне нужно было создать скрипт, который проверяет все каталоги в правильном месте и удаляет старые. Я решил сохранить последние 4 каталога. В настоящее время это магическое число в сценарии. Если я хочу / нужно, я могу сделать это в качестве входного параметра. Но я решил начать с простого.

Я решил сделать это очень просто:

  1. Перечислите все каталоги с префиксом webapp_ в известном месте
  2. Сортируйте их по времени по убыванию и запускайте удаление по всем начальным индексам 4.
01
02
03
04
05
06
07
08
09
10
11
12
13
def numberOfDirectoriesToKeep = 4
def webappsDir = new File('/usr/local/tomcat/tomcat_aps')
def webDirectories = webappsDir.listFiles().grep(~/.*webapps_.*/)
def numberOfWeappsDirectories = webDirectories.size();
 
if (numberOfWeappsDirectories >= numberOfDirectoriesToKeep) {
  webDirectories.sort{it.lastModified() }.reverse()[numberOfDirectoriesToKeep..numberOfWeappsDirectories-1].each {
    logger.info("Deleteing ${it}");
    // here we'll delete the file. First try was doing a Java/groovy command of deleting directories
  }
} else {
  logger.info("Too few web directories")
}

Это не сработало. Файлы не были удалены. Случилось так, что агент работает от имени другого пользователя, чем тот, который запускает tomcat. У агента не было разрешений на удаление каталогов.

Моим решением было запустить команду оболочки с помощью sudo .

Я нашел ссылки на:

и:

Короче говоря, вот полный сценарий:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import org.slf4j.Logger
import com.my.ProcessingJobResult
 
def Logger logger = jobLogger
//ProcessingJobResult is proprietary
def ProcessingJobResult result = jobResult
 
try {
    logger.info("Deleting old webapps from CI - START")
    def numberOfDirectoriesToKeep = 4 // Can be externalized to input parameter
    def webappsDir = new File('/usr/local/tomcat/tomcat_aps')
    def webDirectories = webappsDir.listFiles().grep(~/.*webapps_.*/)
    def numberOfWeappsDirectories = webDirectories.size();
 
    if (numberOfWeappsDirectories >= numberOfDirectoriesToKeep) {
        webDirectories.sort{it.lastModified() }.reverse()[numberOfDirectoriesToKeep..numberOfWeappsDirectories-1].each {
            logger.info("Deleteing ${it}");
            def deleteCommand = "sudo -u tomcat rm -rf " + it.toString();
            deleteCommand.execute();
        }
    } else {
        logger.info("Too few web directories")
    }
    result.status = Boolean.TRUE
    result.resultDescription = "Deleting old webapps from CI ended"
    logger.info("Deleting old webapps from CI - DONE")
} catch (Exception e) {
    logger.error(e.message, e)
    result.status = Boolean.FALSE
    result.resultError = e.message
}
 
return result

Кстати, есть небольшая ошибка индексов, которую я решил не исправлять (сейчас), так как у нас всегда больше каталогов.