1. Developer wysyła zlecenie, z użyciem client/make-request.sh, na adres srpm buildera. 2. Na koncie srpm buildera skrypt request_handler.py wołany z procmaila obsługuje zlecenie. a) sprawdza podpis gpg, wyciąga wszystkie Good sinature from <...> jeśli brak -- wypad b) szuka w swoim acl.conf czy osoba z Good signature from może robić cokolwiek, w.p.p wypad c) xml-parsuje zlecenie (request.py) i. jeśli jest to , sparawdza uprawnienie notify:, i jeśli OK, to zmienia odpowiednio kolejkę spool/req_queue. Jeśli wszystki buildery zakończyły już budowanie danej grupy usuwane są src rpmy z www/srpms//. Generuje stronę ze statystykami (www/queue.html). ii. jeśli jest to to sprawdza czy użytkownik, który wysłał zlecenie ma uprawnienia src:, oraz binary: dla każdego buildera dla którego jest zlecenie. Jeśli OK, to wrzuca zlecenie do spool/queue 3. Na koncie srpm buildera z crona chodzi skrypt srpm_builder.py. a) Czyta spool/queue, jeśli są tam jakieś zlecenia, sortuje wg. priorytetu (niższy numer == ważniejsze zlecenie), a następnie sortuje wg. czasu przybycia zlecenia (starsze == ważniejsze), wyciąga je z kolejki i zapisuje kolejkę. b) Obsługuje tylko . c) Buduje w chroot wszystkie pakiety z grupy, kolejkując pliki w spool/ftp/ oraz spool/buildlogs/. Dodatkowo srpmy są wrzucane do www/srpms// skąd ciągną je bin-buildery. d) jeśli nie powiodło się budowanie żadnego pakietu to wypad e) zleceniu nadawany jest numer f) zlecenie jest wrzucane do spool/req_queue g) kolejka jest podpisywana kluczem srpm buildera, gzipowana i wrzucana do www/queue.gz h) numer zapisywany jest w www/max_req_no i) generowanie strony ze statystykami 4. Na kontach srpm buildera i bin-builderów chodzi file_sender.py. Monitoruje on kolejki spool/{buildlogs,ftp}. Są w nich pliki, jak: faa1f592-437f-446d-b1e6-ac41976c5775 faa1f592-437f-446d-b1e6-ac41976c5775.info faa1f592-437f-446d-b1e6-ac41976c5775.desc Plik .desc jest kontrolny dla file_sender.py. Zawiera email zlecającego (do alarmowania), czas skolejkowania (pliki są wysyłane dokładnie w kolejności wrzucania do kolejki), oraz cel (url), gdzie należy przesłać plik. Plik .info jest tylko dla buildlogów. Jeśli taki plik istnieje to jest przesyłany po przesłaniu właściwego pliku (tego bez rozszerzenia). Jest w nim zapisany status buildloga (OK|FAIL). helpers/buildlogs-mover.sh używa tych plików. Pliki .info i .desc kończa się linią, zawierającą słowo END. Skrypty nic z nimi nie robią jeśli nie ma tam tego słowa (transmisja niedokończona). URLe wspierane jako cel to: rsync://user@host/modul/sci/ezka/plik scp://user@host/sciezka/plik /absolutna/sciezka/do/pliku W pliki config/rsync-passwords są hasła do rsync, w formacie: user@host hasło scp działa po kluczach (z ~/.ssh) 5. Na koncie bin-buildera chodzi skrypt request_fetcher.py. a) ściąga $control_url/max_req_no i porównuje ze spool/last_req_no. jeśli takie same to wypad. b) ściąga $control_url/queue.gz, dekompresuje, sprawdza podpis (w config/acl.conf dla podpisującego użytkownika musi być "sign_queue:all") [sidenote: konto bin buildera nie potrzebuje kluczy gpg innych niż swój i srpm buildera, nie potrzebuje też acl.conf pełnego, tylko srpm_builder z sign_queue:all] c) wrzuca zlecenia do spool/queue d) zapisuje największy numer zlecenia wrzuconego w spool/last_req_no. 6. Na koncie bin-buildera chodzi skrypt rpm_builder.py. a) sprawdzenie loadu, jeśli za wysoki to papa b) lockowanie build-slot-N, gdzie N < job_slots, jeśli sie nie da to papa c) lockowanie building-rpm-for- (tylko jeden build w chroot na raz) d) Czyta spool/queue, jeśli są tam jakieś zlecenia, sortuje wg. priorytetu (niższy numer == ważniejsze zlecenie), a następnie sortuje wg. czasu przybycia zlecenia (starsze == ważniejsze), wyciąga je z kolejki i zapisuje kolejkę. e) buduje pakiety, wrzuca pliki do spool/{buildlogs,ftp}. Jeśli nie ma flagi test-build to pakiety wrzuca też do /spools/ready/ w chroot (i generuje tam idx poldka) Budowanie pakietów: 1. ściągnięcie srpm 2. instalacja srpm 3. próba budowania (z --nobuild), wyłapanie "foo is needed by ...", instalacja wszystkich takich foo. UWAGA: to nie zawsze działa, np. jeśli rpm wywali się z braku pliku do %include. trzeba napisać osobny parser. 4. budowanie 5. jeśli nie test-build to przerzucenie pakietów do /spools/ready/ 6. jeśli upgrade, to próba upgrejdu, wywalenie wszystkich przeszkadzających pakietów, chyba, że trzeba by wywalić poldka, lub rpm-build. 7. upgrade