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ả?
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ả?
Câu trả lời:
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.
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
Sắp xếp ví dụ bằng cách xây dựng là tầm thường tương tự.
JobName/branch
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.
toggleLogKeep
trước doDelete
.
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
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}");
}
}
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 đã 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