2016-11-22 46 views
5

Я использую Nexus 3, и я хочу удалить свои старые релизы. В Nexus 2 запланировано задание Remove Releases From Repository. Кажется, что эти задачи отсутствуют в Nexus 3.Очистить старый релиз от Nexus 3

Как удалить старый выпуск от Nexus 3?

Благодаря

+0

Звучит как https://issues.sonatype.org/browse/NEXUS-10821, если вы хотите следовать. – joedragons

ответ

2

У нас нет запланированного задания, построенного еще, в то же время вы можете использовать функции Delete компоненты в пользовательском интерфейсе, если вам нужно вручную удалить выпуск.

+0

Спасибо за ваш ответ. Есть ли способ вручную удалить выпущенные компоненты? У нас есть много компонентов, и щелчок по кнопке удаления на каждом из них один за другим утомительно. – vespasien

+1

Не в массовом порядке с помощью пользовательского интерфейса. Существует возможность написать groovy-скрипт, который делает это, используя скриптовый API. – DarthHater

+0

Любые новости здесь? Вы запланировали это? –

3

Смотрите этот скрипт в качестве основы для работы с:

https://gist.github.com/emexelem/bcf6b504d81ea9019ad4ab2369006e66 по emexelem

import org.sonatype.nexus.repository.storage.StorageFacet; 
import org.sonatype.nexus.repository.storage.Query; 
import org.joda.time.DateTime; 
import org.joda.time.format.DateTimeFormat; 

def fmt = DateTimeFormat.forPattern('yyyy-MM-dd HH:mm:ss'); 
// Get a repository 
def repo = repository.repositoryManager.get('nuget-releases'); 
// Get a database transaction 
def tx = repo.facet(StorageFacet).txSupplier().get(); 
// Begin the transaction 
tx.begin(); 
// Search assets that havn't been downloaded for more than three months 
tx.findAssets(Query.builder().where('last_downloaded <').param(DateTime.now().minusMonths(3).toString(fmt)).build(), [repo]).each { asset -> 
    def component = tx.findComponent(asset.componentId()); 
    // Check if there is newer components of the same name 
    def count = tx.countComponents(Query.builder().where('name').eq(component.name()).and('version >').param(component.version()).build(), [repo]); 
    if (count > 0) { 
     log.info("Delete asset ${asset.name()} as it has not been downloaded since 3 months and has a newer version") 
     tx.deleteAsset(asset); 
     tx.deleteComponent(component); 
    } 
} 
// End the transaction 
tx.commit(); 
0

Итак, я ударил проблемы с запуском из дискового пространства, как наши релизы/сборок были укладки, так что я было немного покопаться в создании сценария для удаления старых сборок, и получил на это:

import org.sonatype.nexus.repository.storage.StorageFacet; 
import org.sonatype.nexus.repository.storage.Query; 

def repositoryName = 'Integration'; 
def maxArtifactCount = 20; 

// Get a repository 
def repo = repository.repositoryManager.get(repositoryName); 
// Get a database transaction 
def tx = repo.facet(StorageFacet).txSupplier().get(); 
try { 
    // Begin the transaction 
    tx.begin(); 

    def previousComponent = null; 
    def uniqueComponents = []; 
    tx.findComponents(Query.builder().suffix(' ORDER BY group, name').build(), [repo]).each{component -> 
     if (previousComponent == null || (!component.group().equals(previousComponent.group()) || !component.name().equals(previousComponent.name()))) { 
      uniqueComponents.add(component); 
     } 
     previousComponent = component; 
    } 

    uniqueComponents.each {uniqueComponent -> 
     def componentVersions = tx.findComponents(Query.builder().where('group = ').param(uniqueComponent.group()).and('name = ').param(uniqueComponent.name()).suffix(' ORDER BY last_updated DESC').build(), [repo]); 
     log.info(uniqueComponent.group() + ", " + uniqueComponent.name() + " size " + componentVersions.size()); 
     if (componentVersions.size() > maxArtifactCount) { 
      componentVersions.eachWithIndex { component, index -> 
       if (index > maxArtifactCount) { 
        log.info("Deleting Component ${component.group()} ${component.name()} ${component.version()}") 
        tx.deleteComponent(component); 
       } 
      } 
     } 
    } 
} finally { 
    // End the transaction 
    tx.commit(); 
} 

Это работает через репозиторий, глядя на все го e компонентов. Затем он работает через все версии (упорядоченные по последнему обновленному - я не мог определить порядок по номеру версии, но я думаю, что это должно быть хорошо), а затем удаляет любой из них по максимальному номеру maxArtifactCount.

Надеюсь, это может быть полезно - и если вы видите какие-либо вопросы, дайте мне знать.

1

С момента выпуска nexus 3 вы можете развернуть groovy-скрипты менеджеру nexus. Просто создайте новую задачу выполнить скрипт и использовать следующий скрипт:

import org.sonatype.nexus.repository.storage.StorageFacet; 
import org.sonatype.nexus.common.app.GlobalComponentLookupHelper 
import org.sonatype.nexus.repository.maintenance.MaintenanceService 
import org.sonatype.nexus.repository.storage.ComponentMaintenance 
import org.sonatype.nexus.repository.storage.Query; 
import org.sonatype.nexus.script.plugin.RepositoryApi 
import org.sonatype.nexus.script.plugin.internal.provisioning.RepositoryApiImpl 
import com.google.common.collect.ImmutableList 
import org.joda.time.DateTime; 
import org.slf4j.Logger 

// ---------------------------------------------------- 
// delete these rows when this script is added to nexus 
RepositoryApiImpl repository = null; 
Logger log = null; 
GlobalComponentLookupHelper container = null; 
// ---------------------------------------------------- 

def retentionDays = 30; 
def retentionCount = 10; 
def repositoryName = 'maven-releases'; 
def whitelist = ["org.javaee7.sample/javaee7-simple-sample", "org.javaee7.next/javaee7-another-sample"].toArray(); 


log.info(":::Cleanup script started!"); 
MaintenanceService service = container.lookup("org.sonatype.nexus.repository.maintenance.MaintenanceService"); 
def repo = repository.repositoryManager.get(repositoryName); 
def tx = repo.facet(StorageFacet.class).txSupplier().get(); 
def components = null; 
try { 
    tx.begin(); 
    components = tx.browseComponents(tx.findBucket(repo)); 
}catch(Exception e){ 
    log.info("Error: "+e); 
}finally{ 
    if(tx!=null) 
     tx.close(); 
} 

if(components != null) { 
    def retentionDate = DateTime.now().minusDays(retentionDays).dayOfMonth().roundFloorCopy(); 
    int deletedComponentCount = 0; 
    int compCount = 0; 
    def listOfComponents = ImmutableList.copyOf(components); 
    def previousComp = listOfComponents.head().group() + listOfComponents.head().name(); 
    listOfComponents.reverseEach{comp -> 
     log.info("Processing Component - group: ${comp.group()}, ${comp.name()}, version: ${comp.version()}"); 
     if(!whitelist.contains(comp.group()+"/"+comp.name())){ 
      log.info("previous: ${previousComp}"); 
      if(previousComp.equals(comp.group() + comp.name())) { 
       compCount++; 
       log.info("ComCount: ${compCount}, ReteCount: ${retentionCount}"); 
       if (compCount > retentionCount) { 
        log.info("CompDate: ${comp.lastUpdated()} RetDate: ${retentionDate}"); 
        if(comp.lastUpdated().isBefore(retentionDate)) { 
         log.info("compDate after retentionDate: ${comp.lastUpdated()} isAfter ${retentionDate}"); 
         log.info("deleting ${comp.group()}, ${comp.name()}, version: ${comp.version()}"); 

         // ------------------------------------------------ 
         // uncomment to delete components and their assets 
         // service.deleteComponent(repo, comp); 
         // ------------------------------------------------ 

         log.info("component deleted"); 
         deletedComponentCount++; 
        } 
       } 
      } else { 
       compCount = 1; 
       previousComp = comp.group() + comp.name(); 
      } 
     }else{ 
      log.info("Component skipped: ${comp.group()} ${comp.name()}"); 
     } 
    } 

    log.info("Deleted Component count: ${deletedComponentCount}"); 
} 

https://github.com/xninjaxelitex/nexus3-cleanup-release-artifact

Этот сценарий будет очистить ваше хранилище нексуса по заданным параметрам в верхней части.

 Смежные вопросы

  • Нет связанных вопросов^_^