Jenkinsでビルド11から1717を削除するにはどうすればよいですか?


回答:


74

いくつかのオプションがあります:

  • 次のビルドが終了したときにそれらのビルドが削除されるように、ジョブ構成に保持するビルドの数を一時的に設定します(古いビルドを破棄)。次のビルドが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履歴を順番に保持するプラグインは許可されません。


10
私は別の解決策を見つけました:使用jenkins-cli.jar -s ... delete-builds envjs 11-1717
アーロンディグラ

Gistを作成して、ターミナルを介してすべてのジョブとビルドカウントを一覧表示しました。クリーンアップが必要なジョブを見つけやすくします。cronを介して電子メールレポートとしても使用できます。
ニック14

@Nick Groovyプラグイン、特にシステムGroovyビルドステップタイプを確認してください。このためにジェンキンスの外に出かける必要はありません。これを行うジョブを作成するだけです。jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; returnビルドなどによるソートも同様に簡単です。
ダニエルベック

マルチブランチパイプラインの場合は、構文JobName/branch
waitinforatrain

17

API呼び出しを行うだけです:

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

APITokenを取得するには:Jenkins> Configuration> Show API Tokenにログインします。


これが問題に対する最善のアプローチだと思います。リモートで実行でき、RESTを介して幅広いアクションを提供します
-alfredocambera

インストール済みのシステムでjarファイルを検索する必要がないため、ベストアンサーです。
キー

「何もダウンロードする必要はありません」
キー

「必要がないのでベストアンサー」-あなたの基準が1m未満のファイルをダウンロードすることではない場合、これはCLIに感謝します。条件が認証トークンで乱雑なURLを入力する必要がない場合(最初にインストールされていると仮定して)curl構文を覚えており、明確なコマンドとヘルプを好み、おそらくjarがすでにある場合はCLIの方が優れています。スクリプトコンソールがインストールされた状態でインターフェイスのみを持っている場合は、その方が優れています。いつものように依存します。
user17265

削除のためにビルドを永久に保持するには、toggleLogKeep前に実行しdoDeleteます。
ファンチョン


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

Jenkinsサーバーを引き継いだときに同じタスクに直面しました。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 @アーロン・ディグラ


Jenkinsコンソール用のスクリプトを使用しなかったのはなぜですか?
アーロンディグラ

私はbashに精通しているからです。それが唯一の理由です。
アニエスト

わかった。質問を編集し、問題を回避するためにJenkinsを後で再起動する必要があることを追加してください。
アーロンディグラ

0

この目的に役立つ小さな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。1717.それに応じて設定してください。

  • shutil.rmtree(build_dir_fullpath)-範囲内の各ビルドディレクトリを削除します。

Pythonバージョン:2.7


その後、Jenkinsを再起動する必要はありませんか?Jenkinsがこれらのフォルダーに関する情報をデータベースに保持している場合はどうなりますか?
アーロンディグラ

はい@ AaronDigulla、Jenkinsポータルの変更を反映するにはJenkinsサーバーの再起動が必要です。
シュバムソイン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.