Created
August 19, 2024 19:29
-
-
Save JonathanDagan/3dcef6a36f03fe3c64a250ee294760ce to your computer and use it in GitHub Desktop.
Gitlab Delete Tags Async Parallel
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const GITLAB_URL = "https://gitlab.com"; // Replace with your GitLab instance URL | |
const PROJECT_ID = "<project_id>"; // Replace with your project ID | |
const PRIVATE_TOKEN = "<token>"; // Replace with your personal access token (needs api read and write scope) | |
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms)); | |
const deleteTag = async (tagName) => { | |
try { | |
const response = await fetch(`${GITLAB_URL}/api/v4/projects/${PROJECT_ID}/repository/tags/${tagName}`, { | |
method: 'DELETE', | |
headers: { | |
'PRIVATE-TOKEN': PRIVATE_TOKEN | |
} | |
}); | |
if (response.ok) { | |
console.log(`Deleted tag: ${tagName}`); | |
} else { | |
console.error(`Failed to delete tag: ${tagName}`, await response.json()); | |
} | |
} catch (error) { | |
console.error(`Failed to delete tag: ${tagName}`, error.message); | |
} | |
}; | |
const getAllTags = async () => { | |
let page = 1; | |
const tags = []; | |
while (true) { | |
try { | |
const response = await fetch(`${GITLAB_URL}/api/v4/projects/${PROJECT_ID}/repository/tags?per_page=100&page=${page}`, { | |
headers: { | |
'PRIVATE-TOKEN': PRIVATE_TOKEN | |
} | |
}); | |
const data = await response.json(); | |
if (data.length === 0) { | |
break; // Exit loop if no more tags are found | |
} | |
tags.push(...data.map(tag => tag.name)); | |
page += 1; | |
} catch (error) { | |
console.error('Failed to fetch tags', error.message); | |
break; | |
} | |
} | |
return tags; | |
}; | |
const processDeletionQueue = async (tags) => { | |
console.log(`Found ${tags.length} tags to delete.`); | |
const promises = tags.map((tag, index) => { | |
return new Promise(async (resolve) => { | |
await sleep(index * 100); | |
await deleteTag(tag); | |
resolve(); | |
}); | |
}); | |
await Promise.all(promises); | |
}; | |
const deleteAllTags = async () => { | |
const tags = await getAllTags(); | |
await processDeletionQueue(tags); | |
console.log('All tags deleted.'); | |
}; | |
deleteAllTags().catch(error => console.error('Error in deleting tags:', error)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment