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