I'm trying to create a script that will help me list and analyze the assets in Nexus Sonatype repository by size. Currently I don't know any other approach than to use groovy script, where I have a problem when analyzing docker repositories.
I've copied the script from https://support.sonatype.com/hc/en-us/articles/115009519847-Investigating-Blob-Store-and-Repository-Size-and-Space-Usage where under chapter "2. Running a repository manager task." there is a script for listing assets in Nexus Repository.
I've modified the groovy script a little, so it can store data in temp folder and it's easier to analyze later.
import org.sonatype.nexus.repository.storage.StorageFacet
import org.sonatype.nexus.repository.Repository
import org.sonatype.nexus.repository.storage.Asset
import groovy.json.JsonOutput
import java.text.SimpleDateFormat
import org.sonatype.nexus.common.app.ApplicationDirectories
import org.sonatype.nexus.internal.app.ApplicationDirectoriesImpl
long min_size = 1000000
def filename = "repoBlobSizes-${new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date())}.json"
//Default location of results is the Nexus temporary directory
ApplicationDirectories applicationDirectories = (ApplicationDirectories)container.lookup(ApplicationDirectoriesImpl.class.name)
File resultsFileLocation = applicationDirectories.getTemporaryDirectory()
File resultsFile = new File(resultsFileLocation, filename)
def finalResults = [:].withDefault { 0 }
def finalResultsFile = ""
repository.repositoryManager.browse().each { Repository repo ->
StorageFacet storageFacet = repo.facet(StorageFacet)
def tx = storageFacet.txSupplier().get()
def results = [:].withDefault { 0 }
try {
tx.begin()
tx.browseAssets(tx.findBucket(repo)).each { Asset asset ->
if (asset.size() > min_size) {
results.put(asset.name(),asset.size())
finalResultsFile += repo.name + "\t"+ asset.name() + "\t" + asset.size() + "\n"
}
}
} finally {
tx.close()
}
finalResults.put(repo.name, results);
def sorted = results.sort { a, b -> b.value <=> a.value }
log.info(JsonOutput.prettyPrint(JsonOutput.toJson(sorted)))
}
resultsFile.append(finalResultsFile)
The script is working fine for repositories like maven2, npm ... but for docker assets I get only image ID (SHA256 hash) instead of Component Name and Component Version, so I could identify docker image by name and it's location.
repo.name / asset.name / asset.size
docker-development v2/-/blobs/sha256:0cfb88e899d4f610978cc9590cb274dd79308430bd9564c65b153b856f945eb9 1083624
docker-development v2/-/blobs/sha256:0d1d2c70b2632d0e65424bfae2310eeb6a3b5862febf880b404ce8359304f8e4 1134426
docker-development v2/-/blobs/sha256:0d20a967db845c7ed074e04a42e28080722e7fad9fafaabb90955f8dc9a89775 1903334
docker-development v2/-/blobs/sha256:0d22b3049d9be7cb6bfff9b45f71b0e382b8e5ea0fbfe0282427e55da20ad7e7 1628442
docker-development v2/-/blobs/sha256:0d6f18592928fc2eaf91cecca5accbee1c77d33f9a7d8f79aacbccfdb87d8a32 116712140
docker-development v2/-/blobs/sha256:0d936fab065d39768c708ce838e8ca7a6532851971267049aed34b88eb528c9e 7320423
docker-development v2/-/blobs/sha256:0da56ef07f9e83695cb35e9d37d372dfb0892402616f920fc34dd965e5e227bd 162431268
docker-development v2/-/blobs/sha256:0db92fdf2b037a8a0c9e9cca4c231eb71b241eb10c7b0e04ed41d5a9db3b7b3c 11173072
docker-development v2/-/blobs/sha256:0e466b8eaca15da6cde5101f9d3df7d53cd794fcf48a4ea2632cdb52ea5ae3b6 7320418
docker-releases v2/-/blobs/sha256:203245bed457576b2f6e3487e2696a5f0ef04ed81c5f343586c8978ebd0fedb6 140115530
docker-releases v2/-/blobs/sha256:205762a5fb20647c6c286c75f6dcfb8336a15bdadb19dae9e536f12356760138 140115528
docker-releases v2/-/blobs/sha256:2069e25070d3ea3ce018952fad1bfc5aa7f92301936cec1a0abf77dd9e951963 128171526
docker-releases v2/-/blobs/sha256:207b8632e0a0affb06e092f4ea0dddf6673c5e9b7668f60f6d2d3a64048e4c8d 16030212
docker-releases v2/-/blobs/sha256:20a0497610a0a342eccbd9e8be6a4feae760672489e9f70ce4cf23681b555987 128171530
docker-releases v2/-/blobs/sha256:20a6e44d614851f1899b34149a9e4fccc239a115db0d097be5f38a8edeca3447 127844515
docker-releases v2/-/blobs/sha256:20ae2ed9f6feab6b3a3da707e70d5396e378e5fe38a9c3f0e706419dba8a51e5 160162247
docker-releases v2/-/blobs/sha256:20c129ca6c3903a67380027dbe440ca1ecf73f84898b26ba86ce8dd5bcda8aca 73452802
docker-releases v2/-/blobs/sha256:20caf18297dbc5e353603dbcb02a0b9086aa5339638f8560d4e2780c9f2b61f5 11036523
maven-releases com/devops/release-test/41.20.07/release-test-41.20.07.jar 16202095
maven-releases com/devops/release-test/41.20.08/release-test-41.20.08.jar 16202094
maven-releases com/devops/release-test/41.20.09/release-test-41.20.09.jar 16202094
maven-releases com/devops/release-test/41.20.10/release-test-41.20.10.jar 16202093
maven-releases com/devops/release-test/41.20.11/release-test-41.20.11.jar 16202094
Is there a way to get also docker detailed description like in maven2 repository where asset.name is combined with group, name and version. That would really helped me when I try to analyze all assets disk usage in Nexus Repository.
Thank you and best regards, Damjan