diff --git a/jobs-dsl/jobs/Automation/DevOps/artifactory_repository_clean.groovy b/jobs-dsl/jobs/Automation/DevOps/artifactory_repository_clean.groovy new file mode 100644 index 0000000..df044db --- /dev/null +++ b/jobs-dsl/jobs/Automation/DevOps/artifactory_repository_clean.groovy @@ -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') + } + } +} diff --git a/jobs-dsl/views/devops.groovy b/jobs-dsl/views/devops.groovy index 637cf2c..2305a2f 100644 --- a/jobs-dsl/views/devops.groovy +++ b/jobs-dsl/views/devops.groovy @@ -2,7 +2,7 @@ listView('DevOps') { description('DevOps service tasks') recurse() jobs { - regex(/^jobs-dsl$|^gitea*/) + regex(/^jobs-dsl$|^gitea*|^artifactory-repository-clean$/) } columns { status() diff --git a/pipelines/Automation/DevOps/artifactory_repository_clean.groovy b/pipelines/Automation/DevOps/artifactory_repository_clean.groovy new file mode 100644 index 0000000..8521625 --- /dev/null +++ b/pipelines/Automation/DevOps/artifactory_repository_clean.groovy @@ -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() + } + } +}