আমি জেনকিনসে 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/, ফোল্ডারের নাম হিসাবে স্টার্ট টাইম স্ট্যাম্প ব্যবহার করে) এবং জেনকিন্স পুনরায় আরম্ভ করুন বা ডিস্ক থেকে পুনরায় লোড কনফিগারেশন । এই বিকল্পটি প্লাগইনগুলিকে মঞ্জুরি দেয় না যেগুলি উদাহরণস্বরূপ এসভিএন ইতিহাসকে পরবর্তী কাজগুলিতে কোনও কাজ করে তাদের পরিবর্তন করতে সরিয়ে রাখবে।


10
আমি আরও একটি সমাধান পেয়েছি: ব্যবহার করেjenkins-cli.jar -s ... delete-builds envjs 11-1717
অ্যারোন ডিগুল্লা

টার্মিনালের মাধ্যমে বিল্ড কাউন্টের সাথে সমস্ত কাজ তালিকাভুক্ত করতে একটি সংক্ষিপ্তসার তৈরি করে। পরিস্কার করা প্রয়োজন এমন চাকরিগুলি সন্ধান করা আরও সহজ করে তোলে। ক্রোন এর মাধ্যমেও একটি ইমেল রিপোর্ট হিসাবে ব্যবহার করা যেতে পারে।
নিক 12

@ নিক গ্রোভী প্লাগইনটি দেখুন, বিশেষত সিস্টেম গ্রোভি বিল্ড স্টেপ ধরণ। এর জন্য জেনকিনসের বাইরে যাওয়ার দরকার নেই, কেবল একটি কাজ তৈরি করুন যা এটি করে। jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; returnবিল্ডগুলি দ্বারা যেমন বাছাই করা তেমনি তুচ্ছ।
ড্যানিয়েল অঙ্গুলিনির্দেশ

মাল্টি-ব্রাঞ্চ পাইপলাইনের জন্য আপনি সিনট্যাক্সটি ব্যবহার করতে পারেন JobName/branch
ওয়েটইনফোর্যাটাইন

17

কেবল একটি এপিআই কল করুন:

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

এপিআইটোকেন পেতে: জেনকিনস> কনফিগারেশন> এপিআই টোকেনটিতে লগইন করুন।


আমি মনে করি এটিই সমস্যার সর্বোত্তম পন্থা। এটি দূরবর্তীভাবে কার্যকর করা যেতে পারে যা একটি REST
alfredocambera এর

ইনস্টল করা সিস্টেমে আপনাকে জারটি সন্ধান করতে হবে না তাই সেরা উত্তর।
কীথ টাইলার

আমার অর্থ ছিল "আপনাকে কোনও কিছুই ডাউনলোড করতে হবে না"
কীথ টাইলার

"আপনাকে যেহেতু করতে হবে না সেরা উত্তর" - আপনার মানদণ্ড যদি <1 মি ফাইল ডাউনলোড না করে তবে এটির চেয়ে ভাল সিএলআইকে ধন্যবাদ। মানদণ্ডটি যদি লেখক টোকেনগুলির সাথে অগোছালো url লিখতে না থাকে তবে কার্ল সিনট্যাক্সটি ধরে রাখুন (এটি প্রথম স্থানে ইনস্টল করা আছে ধরে নিই), এবং আপনি পরিষ্কার আদেশগুলি পছন্দ করেন এবং সহায়তা করেন এবং সম্ভবত আপনার ইতিমধ্যে জারটি সিএলআই আরও ভাল। যদি আপনার কেবলমাত্র সেখানে স্ক্রিপ্টিং কনসোল ইনস্টল করে আমাদের ইন্টারফেস থাকে, তবে সেটি আরও ভাল। যথারীতি এটি নির্ভর করে।
ব্যবহারকারী 17265

মুছে ফেলুন চিরকালের জন্য বিল্ড রাখুন, toggleLogKeepআগে চালান doDelete
ফ্যানসিউং

16

হিসাবে হারুন বিবৃত সঠিকভাবে আপনার কাছে ব্যবহার করতে পারেন জেনকিন্স CLI এই কাজের জন্য:

java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717

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 @ অ্যারন ডিজুল্লা


কেন আপনি জেনকিনস কনসোলের জন্য কোনও স্ক্রিপ্ট ব্যবহার করেন নি?
অ্যারন দিগুল্লা

কারণ আমি বাশের সাথে আরও পরিচিত। এটাই একমাত্র কারণ।
এনিয়েস্টো

বুঝতে পারছিল না। দয়া করে আপনার প্রশ্নটি সম্পাদনা করুন এবং যুক্ত করুন যে সমস্যা এড়াতে জেনকিন্সকে পরে আবার চালু করতে হবে।
অ্যারোন দিগুল্লা ২

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)
  • জব_বিল্ড_ফুলপাথ - চাকরির বিল্ড ডিরেক্টরিটির পথ

  • পরিসীমা (start_build_no, end_build_no) - পরিসীমা (11, 1718) বিল্ড নং থেকে শুরু করে সমস্ত বিল্ড সন্ধান করে। 11 নং বিল্ড করতে। 1717. দয়া করে এটি সেট করুন।

  • shutil.rmtree (build_dir_fullpath) - সীমাতে থাকা প্রতিটি বিল্ড ডিরেক্টরি মুছে দেয়।

পাইথন সংস্করণ: 2.7


আপনার পরে জেনকিন্স পুনরায় চালু করতে হবে না? জেনকিন্স যদি এই ফোল্ডারগুলির তথ্য একটি ডাটাবেসে রাখে?
অ্যারন ডিজুল্লা

হ্যাঁ @ অ্যারনডিগুল্লা, জেনকিন্স সার্ভারের পুনঃসূচনা জেনকিন্স পোর্টালে পরিবর্তনগুলি প্রতিবিম্বিত করতে হবে।
শুভম সোণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.