設定ミスが原因で、私はJenkinsジョブで1700を超えるビルドに失敗しました。
どうやってそれらを効率的に掃除できますか?
いくつかのオプションがあります:
ジョブ構成に保持するビルドの数を一時的に設定します((古いビルドを破棄)。次のビルドが終了したときにそれらのビルドが削除されます)。次のビルドが1800の場合、最新の85を保持するように設定します。次のビルドを開始する前に、古いビルド(つまり1から10)をすべてこのビルドを永久に保持としてマークします。アップストリームビルドの削除を妨げるダウンストリームジョブがある場合、このオプションは一部のビルドの削除に失敗します(すべてのビルドが失敗した場合でも、状況に問題はありません)。
Jenkinsの管理でスクリプトコンソールを使用します。それがトップレベルのジョブ(フォルダ内ではない)の場合、次の方法でトリックを実行できます。
Jenkins.instance.getItemByFullName('JobName').builds.findAll { it.number > 10 && it.number < 1717 }.each { it.delete() }
もちろん、このアプローチでは通常、適切なバックアップが必要です。スクリプトコンソールを使用すると、多くの問題を解決できます。
ビルドのフォルダーをディスクから削除し(デフォルトでは、$JENKINS_HOME/jobs/JobName/builds/
で、フォルダー名として開始タイムスタンプを使用)、Jenkinsを再起動するか、またはディスクから構成を再読み込みします。このオプションは、プラグインを許可しません。変更を後続のビルドに移動してジョブを実行することにより、SVN履歴を順番に保持します。
Aaron が正しく述べているように、この目的のために Jenkins CLI を使うこともできます。 :
Java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717
単純にAPI呼び出しを行います。
curl -X POST http://jenkinUser:[email protected]/job/theJob/[11-1717]/doDelete
APITokenを取得するには、Jenkins> Configuration> Show API Tokenにログインします。
Jenkinsスクリプトコンソールで実行するスクリプト用のテンプレート。実際に削除する前にそれをテストするためにフラグ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}");
}
}
Jenkinsサーバーを引き継いだときにも同じタスクに直面しました。ここでは、最大3000の古いビルドを持つ150を超えるジョブがあるため、最後の10のビルドだけを保持する小さなbashスクリプトを書きました。
#! /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を再起動することを強くお勧めします。 Thx @Aaron Digulla
私はこの目的を果たす小さなPythonスクリプトを作成しました。スクリプトは次のとおりです。
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 - ジョブのビルドディレクトリのパス
range(start_build_no、end_build_no) - range(11、1718)は、ビルド番号からビルド番号までのすべてのビルドを探します。 11を構築します。それに応じて設定してください。
shutil.rmtree(build_dir_fullpath) - 範囲内にある各ビルドディレクトリを削除します。
Pythonバージョン:2.7