问题
I am working on implementing a build job using Jenkins Multibranch Pipelines. The final stage is uploading the build output to Artifactory.
When configuring a standalone job via the interface, there is an option to "Discard old builds from Artifactory" which allows me to only keep the same number of builds as specified in "Max # of builds to keep" setting.
The upload stage in my Jenkinsfile is configured like this: https://wiki.jenkins-ci.org/display/JENKINS/Artifactory+-+Working+With+the+Pipeline+Jenkins+Plugin
... and I also have the following in my Jenkinsfile which does clean-up the builds in the Jenkins workspace:
properties([[$class: 'BuildDiscarderProperty', strategy: [$class: 'LogRotator', numToKeepStr: '10']]])
How can I set discardOldBuilds to true in my Jenkinsfile so I can also clean-up the builds stored in Artifactory?
回答1:
Into official JenkinsFile https://github.com/jenkinsci/jenkins/blob/master/Jenkinsfile has:
properties([[$class: 'jenkins.model.BuildDiscarderProperty', strategy:
[$class: 'LogRotator', numToKeepStr: '50', artifactNumToKeepStr: '20']
]])
A example of own use with github plugin and jenkins multibranch pipeline:
#!groovy
node {
try {
properties([
[
$class: 'jenkins.model.BuildDiscarderProperty',
strategy: [
$class: 'LogRotator',
numToKeepStr: '10'
]
],
[
$class: 'GithubProjectProperty',
displayName: '',
projectUrlStr: 'https://github.com/xxxxxxx/xxxxx-xxxx/'
]
])
env.JAVA_HOME = tool 'JDK8'
def mvnHome = tool 'Maven'
stage 'Clean Workspace'
deleteDir()
stage 'Git Checkout Source'
checkout scm
stage 'Build Maven Module'
sh "${mvnHome}/bin/mvn clean install -DskipTests=true -DskipITs=true -U"
stage 'Unit Test Maven Module'
sh "${mvnHome}/bin/mvn test -DskipTests=false -DskipITs=true"
stage 'Integration Test Maven Module'
sh "${mvnHome}/bin/mvn verify -DskipTests=true -DskipITs=false"
stage 'Nexus Deploy Artifact'
sh "${mvnHome}/bin/mvn deploy:deploy -Pnexus-deploy"
stage 'Trigger Job xxxxxx-xxxxxx /master'
build job: 'xxxxxx-xxxxxx/master', propagate: false, wait: false
stage 'Send Success Email'
mail from: 'noreply-jenkins@xxxxxxx.io',
to: 'tools@xxxxxxx.io',
subject: "[JENKINS] ${env.JOB_NAME} - Build # ${env.BUILD_NUMBER} - [SUCCESS]!",
body: "${env.JOB_NAME} - Build # ${env.BUILD_NUMBER} - SUCCESS!"
}
catch (Exception ex) {
mail from: 'noreply-jenkins@xxxxxxx.io',
to: 'tools@xxxxxxx.io',
subject: "FAILURE - [JENKINS] ${env.JOB_NAME} - Build # ${env.BUILD_NUMBER} - [FAILURE]!",
body: "${env.JOB_NAME} - Build # ${env.BUILD_NUMBER} - FAILURE (${ex.message})!"
throw ex
}
}
In my Sonatype Nexus, I created a task to clean up the artifacts.
I do not use 'Artifactory', but I believe you can create an internal task to clear it.
You can also manually remove, in the case of maven use, you can follow this example:
How do you deal with maven-3 timestamped snapshots efficiently?
I hope I helped you.
回答2:
This has been fixed in the latest Artifactory Jenkins plugin.
As per the documentation, to trigger build retention when publishing build-info to Artifactory, use the following method:
buildInfo retention maxBuilds: 10
buildInfo retention maxDays: 7
// deleteBuildArtifacts is false by default.
buildInfo retention maxBuilds: 10, maxDays: 7, doNotDiscardBuilds: ["3", "4"], deleteBuildArtifacts: true
回答3:
Triggering Artifactory Build retention from a Pipeline script is planned to be supported in the coming release of the Jenkins Artifactory Plugin. See this issue: https://www.jfrog.com/jira/browse/HAP-796
来源:https://stackoverflow.com/questions/37974216/how-to-set-artifactory-discardoldbuilds-to-true-in-a-jenkinsfile