[DO-963] Conan clean task (!44)

DO-963

Co-authored-by: denis.patrakeev <denis.patrakeev@avroid.tech>
Reviewed-on: https://git.avroid.tech/DevOps/jenkins-pipelines/pulls/44
This commit is contained in:
Denis Patrakeev
2024-11-08 18:57:15 +03:00
parent a8d13a4475
commit 6f95763338
3 changed files with 123 additions and 1 deletions

View File

@@ -0,0 +1,42 @@
pipelineJob('Automation/DevOps/artifactory-repository-clean') {
description('Automation clean old artifacts on Artifactory CPP (Conan)')
logRotator {
numToKeep(100)
artifactNumToKeep(100)
}
properties {
disableConcurrentBuilds()
pipelineTriggers {
triggers {
cron {
spec('H 3 * * *')
}
}
}
}
definition {
cpsScm {
scm {
git {
remote {
url("${JENKINS_GIT_REPOSITORY_URL}/DevOps/jenkins-pipelines.git")
credentials("${JENKINS_GIT_CREDENTIALS_HTTP}")
}
branch('master')
}
}
scriptPath('pipelines/Automation/DevOps/artifactory_repository_clean.groovy')
}
}
parameters {
booleanParam {
name('dryRun')
defaultValue(false)
description('Dry run for test remove artifacts')
}
}
}

View File

@@ -2,7 +2,7 @@ listView('DevOps') {
description('DevOps service tasks') description('DevOps service tasks')
recurse() recurse()
jobs { jobs {
regex(/^jobs-dsl$|^gitea*/) regex(/^jobs-dsl$|^gitea*|^artifactory-repository-clean$/)
} }
columns { columns {
status() status()

View File

@@ -0,0 +1,80 @@
@Library('shared-lib') _
import tech.avroid.api.Artifactory
// Parameters and variables
// Configure cleared repository on Conan Server
Map clearRepoMap = [
'avroid_dev' : [
repo: 'avroid_dev',
repoPathSearch: '*',
keepTimeItems: '12weeks',
regexFilteredAqlResponse: (java.util.regex.Pattern)~/^avroid_dev\/[^ \/]+\/[^ \/]+\/[^ \/]+$/
],
]
Artifactory artifactoryServer = new Artifactory(this, "${JENKINS_CONAN_URL}/artifactory", "${JENKINS_CONAN_CREDENTIALS}")
ArrayList listItemsForDeleteFiltered = []
properties([
buildDiscarder(logRotator(artifactDaysToKeepStr: '',
artifactNumToKeepStr: '100',
daysToKeepStr: '',
numToKeepStr: '100')),
disableConcurrentBuilds(),
parameters([
booleanParam(name: 'dryRun', defaultValue: false, description: 'Dry run for test remove artifacts'),
]),
pipelineTriggers([
cron('H 3 * * *')
])
])
podTemplate(workspaceVolume: hostPathWorkspaceVolume(hostPath: '/data'), yaml: getPodTemplate('alpine')) {
node(POD_LABEL) {
try {
stage('Search') {
// пробегаемся по содержимому Map и получаем результат
clearRepoMap.each { entry ->
// create AQL-request
String artifactoryAqlRequest = 'items.find(\n' +
' {\n' +
' "repo":{"$eq":"' + entry.value.repo + '"},\n' +
' "path":{"$match":"' + entry.value.repoPathSearch + '"},\n' +
' "type":"folder",\n' +
' "modified":{"$before":"' + entry.value.keepTimeItems + '"}\n' +
' }\n' +
').include("repo","path","name","modified")'
def aqlResponse = artifactoryServer.aqlRequest(artifactoryAqlRequest)
// get list all artefacts
ArrayList listItemsForDelete = artifactoryServer.convertAqlResponseItemToList(aqlResponse)
// debug
//println "${listItemsForDelete}"
// filtered list artefacts for remove
listItemsForDeleteFiltered += listItemsForDelete.findAll { it =~ entry.value.regexFilteredAqlResponse }
// debug
//println "${listItemsForDeleteFiltered}"
}
}
stage('Info') {
echo 'List artifacts for delete:\n' + listItemsForDeleteFiltered.join('\n')
}
stage('Clean') {
artifactoryServer.itemsDelete(listItemsForDeleteFiltered, params.dryRun)
}
}
catch(err) {
echo 'ERROR: ' + err.getMessage()
currentBuild.result = 'FAILURE'
} finally {
cleanWs()
}
}
}