एक गलत धारणा के कारण, मेरे पास 1700 से अधिक असफल जेनकींस की नौकरी है।
मैं उन्हें कुशलता से कैसे साफ कर सकता हूं?
एक गलत धारणा के कारण, मेरे पास 1700 से अधिक असफल जेनकींस की नौकरी है।
मैं उन्हें कुशलता से कैसे साफ कर सकता हूं?
जवाबों:
आपके पास कई विकल्प हैं:
अस्थायी रूप से कार्य कॉन्फ़िगरेशन ( डिस्कार्ड ओल्ड बिल्ड्स ) में रखने के लिए बिल्ड की संख्या निर्धारित करें ताकि अगले बिल्ड के समाप्त होने पर उन बिल्ड को हटा दिया जाए। यदि अगला बिल्ड 1800 है, तो इसे सबसे हाल के 85 या तो रखने के लिए सेट करें। चिह्नित सभी पुराने बनाता है (यानी 1 से 10) के रूप में हमेशा के लिए इस बिल्ड रखें अगले निर्माण शुरू करने से पहले। यह विकल्प कुछ बिल्ड को हटाने में विफल होगा यदि आपके पास एक डाउनस्ट्रीम काम है जो अपस्ट्रीम बिल्ड को हटाए जाने से रोकता है (आपकी स्थिति में कोई समस्या नहीं है अगर वे सभी विफल रहे हैं)।
जेनकिन्स को प्रबंधित करने में स्क्रिप्ट कंसोल का उपयोग करें । यदि यह एक शीर्ष स्तर का काम है (एक फ़ोल्डर में नहीं), तो निम्न कार्य करेगा:
Jenkins.instance.getItemByFullName('JobName').builds.findAll { it.number > 10 && it.number < 1717 }.each { it.delete() }
बेशक, इस दृष्टिकोण को आम तौर पर अच्छे बैकअप की आवश्यकता होती है। स्क्रिप्ट कंसोल का उपयोग करके आप बहुत कुछ तोड़ सकते हैं।
डिस्क से फ़ोल्डर के फ़ोल्डर को हटाएं (डिफ़ॉल्ट रूप से $JENKINS_HOME/jobs/JobName/builds/
, फ़ोल्डर के नाम के रूप में स्टैम्प टाइम स्टैम्प का उपयोग करके) और डिस्क से जेनकिंस, या पुनः लोड कॉन्फ़िगरेशन को पुनः आरंभ करें । यह विकल्प उन प्लगइन्स की अनुमति नहीं देगा जो उदाहरण के लिए अपने काम को करने के लिए बाद के निर्माण में कोई भी परिवर्तन करके SVN इतिहास को बनाए रखते हैं।
jenkins-cli.jar -s ... delete-builds envjs 11-1717
jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; return
बिल्ड द्वारा छँटाई करना इसी तरह तुच्छ है।
JobName/branch
बस एक एपीआई कॉल करें:
curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete
APIToken प्राप्त करने के लिए: Jenkins> कॉन्फ़िगरेशन> API टोकन दिखाएं लॉगिन करें।
toggleLogKeep
से पहले doDelete
।
जैसा कि हारून ने कहा है कि आप इस उद्देश्य के लिए जेनकिन्स सीएलआई का उपयोग कर सकते हैं :
java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717
जेनकिंस स्क्रिप्ट-कंसोल में चलने के लिए स्क्रिप्ट के लिए टेम्प्लेट। reallyDelete
हटाने से पहले इसका परीक्षण करने के लिए ध्वज का उपयोग करें :
// Jenkins job
def jobName = 'foo'
// Range of builds to delete
def rs = Fingerprint.RangeSet.fromString("11-1717", false);
// Set to true to actually delete. Use false to test the script.
def reallyDelete = false;
// ----------------------------------
def job = Jenkins.instance.getItemByFullName(jobName);
println("Job: ${job.fullName}");
def builds = Jenkins.instance.getItemByFullName(jobName).getBuilds(rs);
println("Found ${builds.size()} builds");
builds.each{ b->
if (reallyDelete) {
println("Deleting ${b}");
b.delete();
} else {
println("Found match ${b}");
}
}
मुझे एक ही कार्य के साथ सामना करना पड़ा जब मैंने जेनकिंस सर्वर को संभाला, जहां 3000 पुराने बिल्डरों के साथ सिर्फ 150 से अधिक नौकरियां हैं, इसलिए मैंने एक छोटी सी बैश स्क्रिप्ट लिखी जो केवल अंतिम 10 बिल्ड रखती है:
#! /bin/bash
initialPath=$(pwd);
find /var/lib/jenkins/ -type d -name builds | while read jobs
do
#############################################################
## Enter build-directory of current job and get some numbers
#############################################################
cd "$jobs" ;
ls -d [[:digit:]]* &>/dev/null ;
rc=$? ;
if [[ $rc -eq 0 ]] ;
then
buildName=$(ls -d [[:digit:]]*) ;
latestBuild=$(echo $buildName | awk '{print $NF}') ; # highest number
oldestBuild=$(echo $buildName | awk '{print $1}') ; # lowest number
amountOfBuilds=$(echo $buildName | wc -w ) ;
lastBuildToKeep=$(echo "${latestBuild} 9" | awk '{print $1 - $2}') ;
############################################################
## Skip Folder if it contains less than 10 builds
############################################################
if [ ${amountOfBuilds} -le 10 ] ;
then
echo "Skipping $(pwd) --> less than 10 builds";
else
############################################################
## Delete all build-directories except the last 10
############################################################
for (( i=$oldestBuild; i<$lastBuildToKeep; i++))
do
echo "Deleting $(pwd)/${i} ..."
rm -r "$i" ;
done ;
fi ;
else
echo "Skipping $(pwd) --> Zero builds";
fi ;
done ;
############################################################
## go back to $initialPath
############################################################
cd "$initialPath" ;
समस्याओं से बचने के लिए जेनकींस को बाद में शुरू करने की अत्यधिक अनुशंसा की जाती है। Thx @Aaron Digulla
मैंने एक छोटी अजगर लिपि बनाई है जो इस उद्देश्य की पूर्ति करेगी। निम्नलिखित स्क्रिप्ट है:
delete_jenkins_builds.py
from os import listdir, path
import shutil
job_build_fullpath = '/var/lib/jenkins/jobs/My-Jenkins-Project/builds'
print listdir(job_build_fullpath)
for build_dir in listdir(job_build_fullpath):
if build_dir.isdigit() and int(build_dir) in range(11, 1718):
build_dir_fullpath = path.join(job_build_fullpath, build_dir)
print "Deleting: " + build_dir_fullpath
shutil.rmtree(build_dir_fullpath)
job_build_fullpath - नौकरी के निर्माण निर्देशिका का पथ
रेंज (start_build_no, end_build_no) - रेंज (11, 1718) बिल्ड बिल्ड से लेकर सभी बिल्ड के लिए दिखता है। 11 का निर्माण नं। 1717. कृपया इसे तदनुसार सेट करें।
shutil.rmtree (build_dir_fullpath) - प्रत्येक निर्माण निर्देशिका को हटाता है जो सीमा में हैं।
पायथन संस्करण: 2.7