ฉันจะลบงานสร้าง 11 ถึง 1717 ใน Jenkins ได้อย่างไร


51

เนื่องจากการกำหนดค่าผิดพลาดฉันมีงานสร้างมากกว่า 1,700 รายการในงาน Jenkins

ฉันจะทำความสะอาดอย่างมีประสิทธิภาพได้อย่างไร


2
มีหลายวิธีในการลบการสร้างผ่านบรรทัดคำสั่งที่นี่: stackoverflow.com/questions/13052390/…
ThomasW

คำตอบ:


74

คุณมีหลายทางเลือก:

  • ตั้งค่าจำนวนการสร้างชั่วคราวเพื่อเก็บไว้ในการกำหนดค่างาน ( ยกเลิกการสร้างเก่า ) เพื่อให้การสร้างเหล่านั้นจะถูกลบเมื่อการสร้างครั้งต่อไปเสร็จสิ้น หากบิลด์ถัดไปคือ 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 ตามลำดับโดยการย้ายการเปลี่ยนแปลงใด ๆ กับงานสร้างที่ตามมาเพื่อทำงานของพวกเขา


10
ฉันพบวิธีแก้ไขปัญหาอื่นแล้ว: การใช้jenkins-cli.jar -s ... delete-builds envjs 11-1717
Aaron Digulla

ทำสรุปส่วนสำคัญเพื่อแสดงรายการงานทั้งหมดที่มีจำนวนบิลด์ผ่านเทอร์มินัล ทำให้การหางานที่ต้องทำความสะอาดง่ายขึ้น สามารถใช้งานผ่าน cron เป็นรายงานอีเมลได้เช่นกัน
นิค

@Nick ตรวจสอบปลั๊กอิน Groovy โดยเฉพาะประเภทขั้นตอนการสร้างระบบ Groovy ไม่จำเป็นต้องออกไปข้างนอกเจนกินส์เพียงแค่สร้างงานที่ทำสิ่งนี้ jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; returnการเรียงลำดับเช่นโดยการสร้างเป็นเรื่องเล็กน้อยในทำนองเดียวกัน
Daniel Beck

สำหรับท่อหลายสาขาคุณสามารถใช้ไวยากรณ์ได้ JobName/branch
waitinforatrain

17

เพียงโทรออก API:

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

วิธีรับ APIToken: เข้าสู่ Jenkins> การกำหนดค่า> แสดงโทเค็น API


ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดในการแก้ไขปัญหา มันสามารถดำเนินการจากระยะไกล a ให้การกระทำที่หลากหลายผ่าน REST
alfredocambera

คำตอบที่ดีที่สุดเนื่องจากคุณไม่ต้องไปค้นหา jar บนระบบที่ติดตั้ง
Keith Tyler

ฉันหมายถึง "คุณไม่ต้องดาวน์โหลดอะไรเลย"
Keith Tyler

"คำตอบที่ดีที่สุดเพราะคุณไม่จำเป็นต้อง" - หากเกณฑ์ของคุณคือไม่ต้องดาวน์โหลดไฟล์ <1m กว่านี้จะดีกว่าขอบคุณ CLI หากเกณฑ์ไม่จำเป็นต้องพิมพ์ URL ที่ยุ่งเหยิงด้วยโทเค็นการตรวจสอบความถูกต้องโปรดจำไวยากรณ์ curl (สมมติว่ามันติดตั้งในตำแหน่งแรก) และคุณต้องการคำสั่งที่ชัดเจนและช่วยเหลือและบางทีคุณมี jar CLI อยู่แล้ว หากคุณมีส่วนติดต่อเราที่นั่นพร้อมกับคอนโซลสคริปต์ที่ติดตั้งไว้แสดงว่าดีกว่า ตามปกติมันขึ้นอยู่กับ
user17265

สำหรับการลบให้ตลอดสร้างเรียกใช้ก่อนtoggleLogKeep doDelete
Fancyoung

16

ตามที่แอรอนระบุไว้อย่างถูกต้องคุณสามารถใช้Jenkins CLIเพื่อจุดประสงค์นี้:

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

4

แม่แบบสำหรับสคริปต์ที่จะทำงานใน 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}");
  }
}

1

ฉันเผชิญกับภารกิจเดียวกันเมื่อฉันเข้ายึดเซิร์ฟเวอร์เจนกินส์ซึ่งมีงานมากกว่า 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


ทำไมคุณไม่ใช้สคริปต์สำหรับคอนโซลเจนกินส์?
Aaron Digulla

เพราะฉันคุ้นเคยกับการทุบตีมากขึ้น นั่นเป็นเหตุผลเดียว
Anyesto

เข้าใจ โปรดแก้ไขคำถามของคุณและเพิ่มว่า Jenkins ต้องเริ่มต้นใหม่หลังจากนั้นเพื่อหลีกเลี่ยงปัญหา
Aaron Digulla

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 เพื่อสร้างไม่ 2260 โปรดตั้งค่าให้เหมาะสม

  • shutil.rmtree (build_dir_fullpath) - ลบแต่ละไดเร็กทอรีบิลด์ที่อยู่ในช่วง

Python เวอร์ชั่น 2.7


คุณไม่ต้องรีสตาร์ทเจนกินส์หลังจากนั้นหรือไม่ เกิดอะไรขึ้นถ้าเจนกินส์เก็บข้อมูลเกี่ยวกับโฟลเดอร์เหล่านั้นในฐานข้อมูล?
Aaron Digulla

ใช่ @AaronDigulla จำเป็นต้องเริ่มต้นเซิร์ฟเวอร์ Jenkins ใหม่เพื่อให้สอดคล้องกับการเปลี่ยนแปลงในพอร์ทัล Jenkins
Shubham Soin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.