Sestavování RPM

Konfigurace se realizuje spuštěním playbooků base.yml a následně rpmbuild.yml.

Na stroji je vytvořena struktura adresářů.

[root@iam-rpmrepo ~]# tree /data/
/data/
├── container-blueprints
│   └── rpmbuild
└── containers
    └── rpmbuild
        ├── logs
        ├── results
        │   ├── develop
        │   └── master
        └── sources

V umístění /data/container-blueprints/<jméno nebo účel kontejneru> jsou uloženy Dockerfiles ze kterých se kontejnery v rámci bootstrapu playbookem staví. V tuto chvíli nepočítáme s tím, že do nich budeme nějak hodně sahat, takže nemají svůj vlastní repozitář.

Ve struktuře /data/containers/rpmbuild/ se nacházejí adresáře jednotlivých sestavovaných projektů - zdrojové kódy v sources, výsledná RPM v results/NÁZEVVĚTVE, log buildu v logs. Při spuštění buildu je nutné Dockeru namountovat příslušné volumy. Docker image pochází z rpmbuild/centos7, ale je aktualizován na CentOS8.

Po startu se v kontejneru automaticky spustí skript /srv/pkg. V tomto skriptu je nutno dodat celý build proces. Interně v kontejneru se RPM balíčky vytváří ve struktuře pod /home/builder/rpm/ a pak se pkg skriptem přesouvají do mountovaného volume určeného pro výsledky.

Příklad pkg skriptu.

#!/bin/bash
unset CDPATH
cd /srv
rpmbuild -ba hello-world.spec
find /home/builder/rpm/ -name "hello-world*rpm" -exec mv -v {} /home/builder/results/hello-world/ \;

Příklad volání buildu v kontejneru ručně.

[root@iam-rpmrepo ~]# docker run -v /data/containers/rpmbuild/sources/hello-world:/srv -v /data/containers/rpmbuild/results/develop/hello-world/:/home/builder/results/hello-world bcv-rpmbuild

Výsledné vygenerované balíčky.

[root@iam-rpmrepo ~]# tree /data/containers/
/data/containers/
└── rpmbuild
    ├── results
    │   └── develop
    │       └── hello-world
    │           ├── hello-world-1-1.src.rpm
    │           └── hello-world-1-1.x86_64.rpm
    └── sources
        └── hello-world
            ├── hello-world.spec
            └── pkg

Spouštění buildů

Reálně se buildy nespouští ručně, ale je pro ně předpřipravený skript /root/basad.sh (build & sign & deploy). Skript je nasazovaný v rámci playbooku. Tento skript provede všechny potřebné fáze buildu a zajistí uložení logů do příslušného adresáře.

[root@iam-rpmrepo ~]# ./basad.sh
I need two arguments: $1 - action, $2 - specifier (or 'all' for all projects)

Podporované akce skriptu jsou:

  1. clone - Naklonuje projekt z gitu (ze skupiny "iam") a fetchne jeho master i develop lokálně.

  2. process-master - Checkoutne master větev, pullne její aktuální verzi ze serveru, spustí build, podepsání a deploy do staging repozitáře. Pokud v repozitáři již existují balíčky stejného názvu, nepřepíše je.

  3. process-develop - Checkoutne develop větev, pullne její aktuální verzi ze serveru, spustí build a deploy do develop repozitáře. Vývojové verze balíčků nejsou podepsány. Pokud v repozitáři již existují balíčky stejného názvu, přepíše je.

Buildu balíčku iam-filesystem
[root@iam-rpmrepo ~]# ./basad.sh process-develop iam-filesystem
[Mon Mar 22 15:48:00 CET 2021] Processing project 'iam-filesystem'.
[Mon Mar 22 15:48:00 CET 2021] Git working tree clean. Pulling...
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
Switched to a new branch 'develop'
Already up to date.
Building branch 'develop' commit e4cfba7 ...
>fc.T...... iam-filesystem-0.2-0.el8.noarch.rpm
>fcsT...... iam-filesystem-0.2-0.el8.src.rpm

Skript považuje každý přímý podadresář v adresáři /data/containers/rpmbuild/sources/ za projektový root adresář, přesněji, za naklonovaný git repozitář. Název adresáře je totožný s názvem projektu a v tomto adresáři musí být uložen pkg skript.

Skript kontroluje, zda je čistý working tree gitu. Pokud ne, odmítne balíček sestavit. Při kontrole jsou ignorována případná rozdílná oprávnění na souborech.

Analýza build dependencies

Pro účely snazšího dohledávání závislostí RPM balíčků je na serveru nasazen skript depgraph.sh. Skriptu se jako argumenty předávají jednotlivé SPECfily. Skript specfily projde, naparsuje vše v Requires: (ale nikoli v Requires(%pre/post/atd.)!), sestaví dotfile a ten prožene GraphVizem. Výsledkem je stáhnutelný .svg soubor uložený v /tmp/.

Skript v aktuální podobě neřeší závislost na konkrétních verzích balíčků a ani zda je daný specfile z masteru, developu nebo úplně jiné větve.

Spuštění skriptu pro všechny projekty IAM appliance
[root@iam-rpmrepo ~]# ./depgraph.sh /data/containers/rpmbuild/sources/iam-*/*.spec
Final graph stored in: /tmp/tmp.b02sFGRYMf