मैं जेनकिन्स में बिल्ड 11 से 1717 को कैसे हटाऊं?


51

एक गलत धारणा के कारण, मेरे पास 1700 से अधिक असफल जेनकींस की नौकरी है।

मैं उन्हें कुशलता से कैसे साफ कर सकता हूं?


2
कमांड लाइन के माध्यम से बिल्ड को हटाने के कई तरीकों पर यहां चर्चा की गई है: stackoverflow.com/questions/13052390/…
ThomasW

जवाबों:


74

आपके पास कई विकल्प हैं:

  • अस्थायी रूप से कार्य कॉन्फ़िगरेशन ( डिस्कार्ड ओल्ड बिल्ड्स ) में रखने के लिए बिल्ड की संख्या निर्धारित करें ताकि अगले बिल्ड के समाप्त होने पर उन बिल्ड को हटा दिया जाए। यदि अगला बिल्ड 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 इतिहास को बनाए रखते हैं।


10
का उपयोग करते हुए: मैं एक और समाधान मिल गया हैjenkins-cli.jar -s ... delete-builds envjs 11-1717
हारून Digulla

टर्मिनल के माध्यम से बिल्ड गणना के साथ सभी नौकरियों को सूचीबद्ध करने के लिए एक जिस्ट बनाया। उन नौकरियों को खोजना आसान बनाता है जिनकी सफाई की आवश्यकता होती है। ईमेल रिपोर्ट के रूप में क्रोन के माध्यम से भी इस्तेमाल किया जा सकता है।
निक

@ ध्यान से ग्रूवी प्लगइन की जाँच करें, विशेष रूप से सिस्टम ग्रूवी स्टेप प्रकार का निर्माण। इसके लिए जेनकींस के बाहर जाने की आवश्यकता नहीं है, बस एक नौकरी बनाएं जो ऐसा करता है। jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; returnबिल्ड द्वारा छँटाई करना इसी तरह तुच्छ है।
डैनियल बेक

बहु-शाखा पाइपलाइनों के लिए आप सिंटैक्सJobName/branch
wainforatrain

17

बस एक एपीआई कॉल करें:

curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete

APIToken प्राप्त करने के लिए: Jenkins> कॉन्फ़िगरेशन> API टोकन दिखाएं लॉगिन करें।


मुझे लगता है कि यह समस्या का सबसे अच्छा तरीका है। इसे दूरस्थ रूप से क्रियान्वित किया जा सकता है जो कि REST
अल्फ्रेडोकेमबेरा

सबसे अच्छा जवाब जब से आप एक स्थापित प्रणाली पर जार के लिए खोज करने के लिए नहीं है।
कीथ टायलर

मेरा मतलब था "आपको कुछ भी डाउनलोड नहीं करना है"
कीथ टायलर

"सबसे अच्छा जवाब जब से आपके पास नहीं है" - यदि आपका मापदंड <1m फ़ाइल डाउनलोड करने के लिए नहीं है, तो यह बेहतर है CLI धन्यवाद। यदि मानदंड टोकन में टाइप करने के लिए नहीं हो रहा है तो टोकन के साथ कर्ल सिंटैक्स याद रखें (यह पहली जगह में स्थापित है), और आप स्पष्ट कमांड और मदद पसंद करते हैं और शायद आपके पास पहले से ही सीएलआई बेहतर है। यदि आपके पास केवल एक स्क्रिप्टिंग कंसोल के साथ हमारे पास वहां इंटरफ़ेस है, तो वह बेहतर है। हमेशा की तरह यह निर्भर करता है।
user17265

हटाने रखें के लिए हमेशा के लिए बनाता है, को चलाने toggleLogKeepसे पहले doDelete
फैंसीगॉन


4

जेनकिंस स्क्रिप्ट-कंसोल में चलने के लिए स्क्रिप्ट के लिए टेम्प्लेट। 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}");
  }
}

1

मुझे एक ही कार्य के साथ सामना करना पड़ा जब मैंने जेनकिंस सर्वर को संभाला, जहां 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


आपने जेनकिंस कंसोल के लिए स्क्रिप्ट का उपयोग क्यों नहीं किया?
आरोन दिगुल्ला

क्योंकि मैं बैश से ज्यादा परिचित हूं। यही एकमात्र कारण है।
Anyesto

समझ लिया। कृपया अपने प्रश्न को संपादित करें और जोड़ दें कि समस्याओं से बचने के लिए जेनकिंस को फिर से शुरू किया जाना चाहिए।
एरोन दिगुल्ला

0

मैंने एक छोटी अजगर लिपि बनाई है जो इस उद्देश्य की पूर्ति करेगी। निम्नलिखित स्क्रिप्ट है:

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


क्या आपको बाद में जेनकींस को पुनः आरंभ नहीं करना पड़ेगा? क्या होगा अगर जेनकिंस डेटाबेस में उन फ़ोल्डरों के बारे में जानकारी रखता है?
एरोन दिगुल्ला

हां @AaronDigulla, जेनकींस सर्वर के पुनरारंभ को जेनकिंस पोर्टल पर परिवर्तनों को प्रतिबिंबित करने की आवश्यकता होगी।
शुभम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.