Skript pro vyčištění repozitáře

Vlastní repozitář si vyžádá poměrně hodně péče, pokud jej chcete udržet konsistentní, funkční, užitečný. Sice existují komunitní nástroje pro build balíčků, jako je např. SUSE build service, ale z historických důvodů jsem vytvořil vlastní repozitář de fakto na zelené louce a postupem času vyladil do současné podoby. Tento seriál je trochu nelogicky, přiznávám, psán „od konce“ — od poslední služby pro porovnání dvou verzí nahoru k hlavnímu skriptu — ptsbuild — zatímco nevíte, k čemu to bude dobré. Nyní, ve třetím díle, si uděláme návrh skriptu k vyčitění starých verzí balíčků. 

V repozitářích se hromadí staré verze balíčků, což působí několik problémů.

Prvně s tím mám problém já, jakožto builder — balíčky zabírají na mém lokálním úložišti zbytečně poměrně hodně místa. Stojí mě to následně nemalé investice do nových disků případně úpravu infrastruktury nebo si „vypůjčovat“ pomocí iSCSI.

  1. Ačkoli by se iSCSI jevilo jako uspokojivé řešení, mělo by nepříjemné následky — pokud je zaplý buildserver, musí být zaplý i můj pracovní počítač. Navíc iSCSI traffic umí vytížit síť a hlavně zdroje (procesor). Nemám ethernetovou kartu s iSCSI chipem. Dohromady se iSCSI projevilo jako nepoužitelné řešení.
  2. Sehnat další disky. DiskStorage v mém BuildSystému potřebuje SATA disky o velikosti do 250GiB, kdybyste nějaký funkční a nevyužity měli doma a chtěli podpořit… nebojte se mě kontaktovat na mém mailu. Zatím mám 12 volných slotů (ano, repozitare jsou fakt velké!!!). Už jsem dostal první vlaštovku, doufám, že nebude poslední.

Druhý problém je neprofesionalita takovéhoto repozitáře. V repozitáři by prostě staré balíčky být neměly. Tečka. Balíčky se v mé infrastruktuře vyskytují  na celkem dvou místech:

  1. ~/$DISTRIBUCE/$VERZE/$ARCHITEKTURA
  2. ~/rpm/SRPMS

První místo je vlastní adresář repozitáře, který je mirrorován na Internet. Tři proměnné jsou poměrně jasné. Distribuce ještě do nedávna byla vedle Mageia i Mandriva, od té jsem ovšem před časem upustil. Verze tak jsou pro Mageia — 1 a 2. No a architekturu máme dvojí – i586 a x86_64.

Druhý adresář již ti, kteří zkoušeli tvorbu RPM balíčků, poznávají. Do tohoto adresáře se ukládají vytvořené SRC.RPM soubory — ty obsahují vše pro znovu-vytvoření binárního balíčku, tj. zdrojové kódy, patche a SPEC soubor — řídící skript překladu.

Účelem skriptu je identifikovat balíčky, které mají stejné jméno, ale různou verzi. Nebudeme hledat balíčky, které zastaraly kvůli aktualizaci oficiálních repozitářů (core, tained a non-free). Takže se můžeme spolehnout na jednu věc: balíčky se shodným jménem budou na výpisu souborů vedle sebe. Je to skvělé, protože nepotřebujeme žádnou interaktivitu s databází, stačí nám prostý BASH.

Bohužel není jednoduché automaticky rozlišit jméno balíčku, verzi a vydání, tj. tři parametry balíčku přímo ze jména souboru. Některé balíčky mají ve jménu čísla (gstreamer0.10), jindy ve jméně není žádná pomlčka, jindy jich tam je víc. Je tedy nutné vytvořit složitou interní logiku pro rozeznání jména balíčku a verze a následně rozlišení verze od release… a nebo to najít jinde, než ve jménu souboru. K tomuto nám poslouží existující součást systému urpmi, konkrétně příkaz urpmq. S parametrem -i totiž vypíše o balíčku detailní informace. A když místo jména balíčku dáme jméno lokálního RPM souboru, vypíše tyto informace právě o souboru. Nyní stačí tyto informace zpracovat nástroji, které již máme k dispozici a máme vše hotovo.

Ještě co budeme očekávat na vstupu a výstupu? Skoro nic, pouze parametr pro -q pro tichý chod a parametr -f. Skript samotný totiž při výchozím běhu nebude mazat žádné soubory, pouze vytvoří seznam ke smazání. Parametr -f toto chování změní a místo pouhé tvorby seznamu soubory také i opravdu smaže.

Nástroj pro porovnávání verzí již existuje, takže nám nic nebrání začít programovat. Ale o tom až příště.

2 komentáře u „Skript pro vyčištění repozitáře“

  1. Ad neprofesionalita. Nesouhlasim. Starsi balicky by v repu praveze BYT MELY po nejakou dobu. Kdyz si nekdo stahme metadata, pak nahrajes novy verze a pomazes je skriptem, tak server bude davat 404. Dobra praxe je mazat kazdou verzi az za mesic, napriklad.

    Jinak ten tvuj skript se mi zda strasne komplikovany. Neslo by proste se spolehnout na cas modifikace souboru, tj kdy byl nakopirovan do repa, a jen pro vsechny soubory nazev- (pomlcka) odmazat vsechny starsi az na jeden. Slo by to udelat jen pomoci ls, for, find a rm. Zadny verze neni treba parsovat, nehlede na to ze to tvoje reseni nefunguje se vsemi verzemi u jinych repozitaru.

    Zrovna vcera jsem podobnou vec resil a nakonec jsem se rozhodl jednoduse – smazu vsechny stare jednou za dva mesice 🙂

    1. Fedora napr. sama pri instalaci aktualizuje indexy (desne otravna „feature“). Mageia to sice nedela, ale nemyslim, ze to je problem.

      A skript neni komplikovany. Jak jsem psal, zjistit „nazev-“ je slozite. Jak chces rozlisit:

      balicek-1.1
      balicek-plugin-1.3
      libbalicek0.10-0.svn1

      ? Jak rozlisis, co je jeste „nazev-“ a co uz je verze? Nerozlisis. Navic find taky nevidi „dovnitr“ Musis pouzit neco z balickovaciho systemu, ktery vidi „dovnitr“. Fakt to jinak nejde.

      Me reseni je mozne pouzit kdekoli, staci prepsat 3 radky pro parsovani prave informaci „zevnitr“ balicku. Zbytek funguje vsude. Ale ano, me skripty jsou pro Mageia. Nikde netvrdim opak 😉

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *