Làm cách nào để xóa các bản dựng từ 11 đến 1717 trong Jenkins?


51

Do cấu hình sai, tôi có hơn 1700 bản dựng thất bại trong công việc Jenkins.

Làm thế nào tôi có thể làm sạch chúng một cách hiệu quả?


2
Một số cách để xóa các bản dựng thông qua dòng lệnh được thảo luận tại đây: stackoverflow.com/questions/13052390/
Kẻ

Câu trả lời:


74

Bạn có một vài lựa chọn:

  • Tạm thời đặt số lượng bản dựng để giữ cấu hình công việc ( Loại bỏ các bản dựng cũ ) để các bản dựng đó sẽ bị xóa khi bản dựng tiếp theo kết thúc. Nếu bản dựng tiếp theo là 1800, hãy đặt nó để giữ mức 85 gần đây nhất. Đánh dấu tất cả các bản dựng cũ hơn (tức là 1 đến 10) là Keep This Build Forever trước khi bắt đầu bản dựng tiếp theo. Tùy chọn này sẽ không thể xóa một số bản dựng nếu bạn có một công việc xuôi dòng ngăn chặn các bản dựng ngược dòng bị xóa (không phải là vấn đề trong tình huống của bạn nếu tất cả chúng đều thất bại).

  • Sử dụng Bảng điều khiển Script trong Manage Jenkins . Nếu đó là một công việc cấp cao nhất (không phải trong một thư mục), những điều sau đây sẽ thực hiện thủ thuật:

    Jenkins.instance.getItemByFullName('JobName').builds.findAll { it.number > 10 && it.number < 1717 }.each { it.delete() }

    Tất nhiên, phương pháp này thường yêu cầu sao lưu tốt. Có rất nhiều thứ bạn có thể phá vỡ bằng cách sử dụng bảng điều khiển kịch bản.

  • Xóa các thư mục của bản dựng khỏi đĩa (theo mặc định $JENKINS_HOME/jobs/JobName/builds/, sử dụng dấu thời gian bắt đầu làm tên thư mục) và khởi động lại Jenkins hoặc Tải lại cấu hình từ đĩa . Tùy chọn này sẽ không cho phép các plugin, ví dụ như giữ lịch sử SVN theo thứ tự bằng cách di chuyển bất kỳ thay đổi nào sang bản dựng tiếp theo để thực hiện công việc của chúng.


10
Tôi đã tìm thấy một giải pháp khác: Sử dụngjenkins-cli.jar -s ... delete-builds envjs 11-1717
Aaron Digulla

Tạo một Gist để liệt kê tất cả các công việc với số lượng xây dựng thông qua thiết bị đầu cuối. Làm cho nó dễ dàng hơn để tìm việc làm cần làm sạch. Có thể được sử dụng qua cron như một báo cáo email.
Nick

@Nick Kiểm tra plugin Groovy, cụ thể là loại bước xây dựng Groovy của hệ thống. Không cần phải ra ngoài Jenkins cho việc này, chỉ cần tạo ra một công việc làm điều này. jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; returnSắp xếp ví dụ bằng cách xây dựng là tầm thường tương tự.
Daniel Beck

Đối với đường ống nhiều nhánh, bạn có thể sử dụng cú pháp JobName/branch
Waitinforatrain

17

Chỉ cần thực hiện cuộc gọi API:

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

Để nhận APIToken: đăng nhập vào Jenkins> Cấu hình> Hiển thị mã thông báo API.


Tôi nghĩ rằng đây là cách tiếp cận tốt nhất cho vấn đề. nó có thể được thực thi từ xa a cung cấp một loạt các hành động thông qua REST
alfredocambera

Câu trả lời hay nhất vì bạn không phải tìm kiếm bình trên hệ thống đã cài đặt.
Keith Tyler

Ý tôi là "bạn không cần phải tải xuống bất cứ thứ gì"
Keith Tyler

"Câu trả lời tốt nhất vì bạn không phải" - nếu tiêu chí của bạn là không tải xuống tệp <1m thì điều này tốt hơn là cảm ơn CLI. Nếu tiêu chí không phải gõ vào các url lộn xộn với mã xác thực auth, hãy nhớ cú pháp curl (giả sử nó được cài đặt ở vị trí đầu tiên), và bạn thích các lệnh rõ ràng và trợ giúp và có lẽ bạn đã có jar CLI tốt hơn. Nếu bạn chỉ có giao diện chúng tôi ở đó với bảng điều khiển kịch bản được cài đặt, thì giao diện đó sẽ tốt hơn. Như thường lệ, nó phụ thuộc.
dùng17265

để xóa giữ bản dựng mãi mãi, chạy toggleLogKeeptrước doDelete.
Fancyoung

16

Như Aaron đã nói chính xác, bạn cũng có thể sử dụng Jenkins CLI cho mục đích này:

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

4

Mẫu cho tập lệnh chạy trong Jenkins Script-Console. Sử dụng cờ reallyDeleteđể kiểm tra nó trước khi thực sự xóa:

// 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

Tôi đã phải đối mặt với nhiệm vụ tương tự khi tôi tiếp quản máy chủ Jenkins, nơi chỉ có hơn 150 công việc với tối đa 3000 bản dựng cũ, vì vậy tôi đã viết một tập lệnh bash nhỏ chỉ giữ 10 bản dựng cuối cùng:

#! /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" ;

Khởi động lại Jenkins sau đó rất được khuyến khích để tránh các vấn đề. Thx @Aaron Digulla


Tại sao bạn không sử dụng tập lệnh cho bảng điều khiển Jenkins?
Aaron Digulla

Bởi vì tôi quen thuộc hơn với bash. Đó là lý do duy nhất.
Anyesto

Hiểu. Vui lòng chỉnh sửa câu hỏi của bạn và thêm rằng Jenkins phải được khởi động lại sau đó để tránh các vấn đề.
Aaron Digulla

0

Tôi đã tạo ra một kịch bản python nhỏ sẽ phục vụ mục đích này. Sau đây là kịch bản:

xóa_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 - Đường dẫn thư mục xây dựng của công việc

  • phạm vi (start_build_no, end_build_no) - phạm vi (11, 1718) tìm kiếm tất cả các bản dựng khác nhau, từ bản dựng không. 11 để xây dựng không. 1717. Hãy đặt nó cho phù hợp.

  • shutil.rmtree (build_dir_fullpath) - xóa từng thư mục xây dựng trong phạm vi.

Phiên bản Python: 2.7


Bạn sẽ không phải khởi động lại Jenkins sau đó chứ? Nếu Jenkins giữ thông tin về các thư mục đó trong cơ sở dữ liệu thì sao?
Aaron Digulla

Có @AaronDigulla, việc khởi động lại máy chủ Jenkins sẽ được yêu cầu để phản ánh các thay đổi trên cổng thông tin Jenkins.
Shubham Soin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.