Default value : async () => {
logger.info(`Requesting old artifacts using ${url}`);
let responseSearch: any;
let responseSearchObj: { results: { repo: string; path: string; name: string }[] };
try {
responseSearch = await fetch(url, fetchOptions);
responseSearchObj = await responseSearch.json();
} catch (e) {
logger.warn('No result found %o', e);
process.exit(0);
}
/** uris will contain the list of all artifacts that need to be deleted */
const mapOfKeptItems = new Map<string, number[]>();
const mapOfKeptResult = new Map<string, { repo: string; path: string; name: string }[]>();
const resultToDelete: { repo: string; path: string; name: string }[] = [];
const sortedResult = responseSearchObj.results.sort((a, b) => b.name.localeCompare(a.name));
for (const result of sortedResult) {
const splitPath = result.name.split('.');
const mapId = splitPath.slice(0, -2).join('.');
const currentBuildNumber = +splitPath.at(-2)!;
const buildNumbers = mapOfKeptItems.get(mapId);
if (buildNumbers) {
buildNumbers.sort();
let isBuildNumberAlreadyInMap = false;
let isBuildNumberHigherThanExisting = true;
buildNumbers.forEach((value) => {
isBuildNumberAlreadyInMap = isBuildNumberAlreadyInMap || (value === currentBuildNumber);
isBuildNumberHigherThanExisting = isBuildNumberHigherThanExisting && (value < currentBuildNumber);
});
if (!isBuildNumberAlreadyInMap) {
if (buildNumbers.length >= prBuilds && !isBuildNumberHigherThanExisting) {
resultToDelete.push(result);
} else {
if (buildNumbers.length >= prBuilds && isBuildNumberHigherThanExisting) {
const buildNumberToRemove = buildNumbers.shift();
if (buildNumberToRemove) {
const resultsToRemove = mapOfKeptResult.get(`${mapId}${buildNumberToRemove}`);
if (resultsToRemove) {
resultToDelete.push(...resultsToRemove);
}
}
}
buildNumbers.push(currentBuildNumber);
buildNumbers.sort();
mapOfKeptItems.set(mapId, buildNumbers);
const keptBuildNumbers = mapOfKeptResult.get(`${mapId}${currentBuildNumber}`);
if (keptBuildNumbers) {
keptBuildNumbers.push(result);
mapOfKeptResult.set(`${mapId}${currentBuildNumber}`, keptBuildNumbers);
} else {
mapOfKeptResult.set(`${mapId}${currentBuildNumber}`, [result]);
}
}
}
} else {
mapOfKeptItems.set(mapId, [currentBuildNumber]);
}
}
logger.debug('Map of build that will be kept: %o', mapOfKeptItems);
const filesToDelete = resultToDelete.map(
(data) => (programOptions.artifactoryUrl as string) + (programOptions.artifactoryUrl.endsWith('/') ? '' : '/') + repository + '/' + data.path + '/' + data.name
);
for (const uri of filesToDelete) {
logger.info(`Deleting ${uri}...`);
if (!programOptions.dryRun) {
const response = await fetch(uri, { method: 'DELETE', headers: authHeader });
logger.info(response);
}
}
}
|