เนื่องจากการกำหนดค่าผิดพลาดฉันมีงานสร้างมากกว่า 1,700 รายการในงาน Jenkins
ฉันจะทำความสะอาดอย่างมีประสิทธิภาพได้อย่างไร
เนื่องจากการกำหนดค่าผิดพลาดฉันมีงานสร้างมากกว่า 1,700 รายการในงาน Jenkins
ฉันจะทำความสะอาดอย่างมีประสิทธิภาพได้อย่างไร
คำตอบ:
คุณมีหลายทางเลือก:
ตั้งค่าจำนวนการสร้างชั่วคราวเพื่อเก็บไว้ในการกำหนดค่างาน ( ยกเลิกการสร้างเก่า ) เพื่อให้การสร้างเหล่านั้นจะถูกลบเมื่อการสร้างครั้งต่อไปเสร็จสิ้น หากบิลด์ถัดไปคือ 1800 ให้ตั้งค่าเป็น 85 ล่าสุด ทำเครื่องหมายงานสร้างที่เก่ากว่าทั้งหมด (เช่น 1 ถึง 10) เป็นKeep Build นี้ตลอดไปก่อนที่จะเริ่มงานสร้างถัดไป ตัวเลือกนี้จะไม่สามารถลบงานบิลด์บางส่วนหากคุณมีงานดาวน์สตรีมที่ป้องกันไม่ให้งานสร้างอัปสตรีมถูกลบออก (ไม่ใช่ปัญหาในสถานการณ์ของคุณหากพวกเขาทั้งหมดล้มเหลว)
ใช้คอนโซลสคริปต์ในการจัดการเจนกินส์ หากเป็นงานระดับบนสุด (ไม่ใช่ในโฟลเดอร์) สิ่งต่อไปนี้จะใช้เคล็ดลับ:
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
เพียงโทรออก API:
curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete
วิธีรับ APIToken: เข้าสู่ Jenkins> การกำหนดค่า> แสดงโทเค็น API
toggleLogKeep
doDelete
ตามที่แอรอนระบุไว้อย่างถูกต้องคุณสามารถใช้Jenkins CLIเพื่อจุดประสงค์นี้:
java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717
แม่แบบสำหรับสคริปต์ที่จะทำงานใน Jenkins Script-Console ใช้การตั้งค่าสถานะ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}");
}
}
ฉันเผชิญกับภารกิจเดียวกันเมื่อฉันเข้ายึดเซิร์ฟเวอร์เจนกินส์ซึ่งมีงานมากกว่า 150 งานที่มีงานสร้างเก่าถึง 3,000 งานดังนั้นฉันจึงเขียนสคริปต์ทุบตีเล็ก ๆ ที่เก็บงานสร้าง 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" ;
แนะนำให้เริ่ม Jenkins ใหม่เพื่อหลีกเลี่ยงปัญหา ขอบคุณ @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 เพื่อสร้างไม่ 2260 โปรดตั้งค่าให้เหมาะสม
shutil.rmtree (build_dir_fullpath) - ลบแต่ละไดเร็กทอรีบิลด์ที่อยู่ในช่วง
Python เวอร์ชั่น 2.7