Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p><strong>Final Answer:</strong> This includes deleting the build artifacts from Artifactory as well using Artifactor's REST API call. This script will delete Jenkins/Artifactory builds/artifacts of a given Release/Version (as sometimes over the time - a given Jenkins job can create multiple release / version builds for ex: 2.75.0.1, 2.75.0.2, 2.75.0.3,....,2.75.0.54, 2.76.0.1, 2.76.0.2, ..., 2.76.0.16, 2.76.1.1, 2.76.1.2, ...., 2.76.1.5). In this case, for every new release of that job, we start the build# from 1 fresh. If you have to delete the all builds except one / even all (change the script a little bit for your own needs) and don't change older/other release builds, then use the following script.</p> <p><strong>Scriptler Catalog link</strong>: <a href="http://scriptlerweb.appspot.com/script/show/103001" rel="nofollow">http://scriptlerweb.appspot.com/script/show/103001</a></p> <p><strong>Enjoy!</strong></p> <pre><code>/*** BEGIN META { "name" : "Bulk Delete Builds except the given build number", "comment" : "For a given job and a given build numnber, delete all builds of a given release version (M.m.interim) only and except the user provided one. Sometimes a Jenkins job use Build Name setter plugin and same job generates 2.75.0.1 and 2.76.0.43", "parameters" : [ 'jobName', 'releaseVersion', 'buildNumber' ], "core": "1.409", "authors" : [ { name : "Arun Sangal - Maddys Version" } ] } END META **/ import groovy.json.* import jenkins.model.*; import hudson.model.Fingerprint.RangeSet; import hudson.model.Job; import hudson.model.Fingerprint; //these should be passed in as arguments to the script if(!artifactoryURL) throw new Exception("artifactoryURL not provided") if(!artifactoryUser) throw new Exception("artifactoryUser not provided") if(!artifactoryPassword) throw new Exception("artifactoryPassword not provided") def authString = "${artifactoryUser}:${artifactoryPassword}".getBytes().encodeBase64().toString() def artifactorySettings = [artifactoryURL: artifactoryURL, authString: authString] if(!jobName) throw new Exception("jobName not provided") if(!buildNumber) throw new Exception("buildNumber not provided") def lastBuildNumber = buildNumber.toInteger() - 1; def nextBuildNumber = buildNumber.toInteger() + 1; def jij = jenkins.model.Jenkins.instance.getItem(jobName); def promotedBuildRange = new Fingerprint.RangeSet() promotedBuildRange.add(buildNumber.toInteger()) def promoteBuildsList = jij.getBuilds(promotedBuildRange) assert promoteBuildsList.size() == 1 def promotedBuild = promoteBuildsList[0] // The release / version of a Jenkins job - i.e. in case you use "Build name" setter plugin in Jenkins for getting builds like 2.75.0.1, 2.75.0.2, .. , 2.75.0.15 etc. // and over the time, change the release/version value (2.75.0) to a newer value i.e. 2.75.1 or 2.76.0 and start builds of this new release/version from #1 onwards. def releaseVersion = promotedBuild.getDisplayName().split("\\.")[0..2].join(".") println "" println("- Jenkins Job_Name: ${jobName} -- Version: ${releaseVersion} -- Keep Build Number: ${buildNumber}"); println "" /** delete the indicated build and its artifacts from artifactory */ def deleteBuildFromArtifactory(String jobName, int deleteBuildNumber, Map&lt;String, String&gt; artifactorySettings){ println " ## Deleting &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;: - ${jobName}:${deleteBuildNumber} from artifactory" def artifactSearchUri = "api/build/${jobName}?buildNumbers=${deleteBuildNumber}&amp;artifacts=1" def conn = "${artifactorySettings['artifactoryURL']}/${artifactSearchUri}".toURL().openConnection() conn.setRequestProperty("Authorization", "Basic " + artifactorySettings['authString']); conn.setRequestMethod("DELETE") if( conn.responseCode != 200 ) { println "Failed to delete the build artifacts from artifactory for ${jobName}/${deleteBuildNumber}: ${conn.responseCode} - ${conn.responseMessage}" } } /** delete all builds in the indicated range that match the releaseVersion */ def deleteBuildsInRange(String buildRange, String releaseVersion, Job theJob, Map&lt;String, String&gt; artifactorySettings){ def range = RangeSet.fromString(buildRange, true); theJob.getBuilds(range).each { if ( it.getDisplayName().find(/${releaseVersion}.*/)) { println " ## Deleting &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;: " + it.getDisplayName(); deleteBuildFromArtifactory(theJob.name, it.number, artifactorySettings) it.delete(); } } } //delete all the matching builds before the promoted build number deleteBuildsInRange("1-${lastBuildNumber}", releaseVersion, jij, artifactorySettings) //delete all the matching builds after the promoted build number deleteBuildsInRange("${nextBuildNumber}-${jij.nextBuildNumber}", releaseVersion, jij, artifactorySettings) println "" println("- Builds have been successfully deleted for the above mentioned release: ${releaseVersion}") println "" </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload