Tento článek popisuje krok za krokem tvorbu RPM balíku a propojení na servery Fedory. Měl by vám usnadnit opakované procházení tímto procesem a pomoci ho určitým způsobem automatizovat.
Úvod
Když jsem se sám chtěl zapojit do vytváření balíčků pro Fedoru, trvalo mi celkem dlouho, než jsem zjistil, jak se to vlastně dá udělat.
Existuje k tomu sice stránka na wiki Fedory (Join the package collection maintainers) a je určitě dobré si pročíst, ale její problém je v tom, že pro toho, kdo to čte úplně poprvé, má příliš odkazů na další stránky a velmi rychle se člověk ztratí. Navíc ve chvíli, kdy nerozumíte přesně něčemu, co je tam napsáno, nemáte se koho zeptat. Mně nakonec pomohla účast na Fedora DevCon, kde mi s tím někdo osobně pomohl a dnes je asi nejlepší cesta se přihlásit na seminář, který občas pořádá česká pobočka Red Hatu.
Ještě uvedu několik dalších zdrojů ke studiu, které mohou pomoci.
Správa verzí balíčků probíhá v Gitu. Je tedy vhodné umět s ním pracovat, ale často se používá nadstavba, která řeší to, co Fedora využívá. Více viz Using Fedora GIT a pro vlastní Git viz Git Quickref.
Také je nutné rozumět principům tvorby RPM balíčku, zajímavý návod je na Rpmbuild Tutorial.
Příprava prostředí
Nejprve připravíme prostředí na vlastním počítači.
Pomocí rpm-build můžeme vytvářet jednotlivé RPM balíčky přímo pro náš systém, což je úplně nejjednodušší, a proto pro začátek nejvhodnější. Od verze Fedora 10 se změnil balíček rpm-build a již neexistuje výchozí adresář /usr/src/redhat
. Řeší se to pomocí balíčku fedora-rpmdevtools
následujícím postupem:
sudo yum install rpmdevtools rpmdev-setuptree
což založí potřebnou adresářovou strukturu v ~/rpmbuild
a vytvoří soubor ~/.rpmmacros
s výchozím nastavením.
Pokud chceme tvořit balíky i pro jiné distribuce (např. CentOS, RHEL) nebo jiné verze té naší, je potřeba použít nástroj mock, viz jiný článek Tvorba RPM balíčků pomocí nástroje mock - krok za krokem.
Vytvoříme adresář, kde budeme udržovat zdrojové soubory použité k tvorbě jednotlivým RPM balíčkům:
mkdir ~/fedoraproject/ cd ~/fedoraproject/
Nastavíme proměnné ENV použité dále při vytváření balíčku:
PKGNAME="cherokee" VERSION="1.2.101" RELEASE="3" DIST="f17" TARGZ="${PKGNAME}-${VERSION}.tar.gz" PKGURL="http://www.cherokee-project.com/download/1.2/${VERSION}/${TARGZ}" BUILDPATH="${HOME}/rpmbuild" SRPM="${PKGNAME}-${VERSION}-${RELEASE}.${DIST}.src.rpm" export PKGNAME VERSION RELEASE DIST TARGZ PKGURL BUILDPATH SRPM
a proměnné pro fedpkg a git:
VISUAL=vim ; EDITOR=$VISUAL; NR=$$ ; export VISUAL EDITOR NR ; cd ~/fedoraproject ; ssh-agent > /tmp/ssh-agent-$NR ; . /tmp/ssh-agent-$NR ; ssh-add ~/.ssh/id_rsa_fedoraproject
Poznámka: SSH klíč se generuje na serverech Fedory (viz admin.fedoraproject.org/accounts) a je nutné ho stáhnout na lokální stroj. Komunikace se servery totiž probíhá pomocí SSH.
Příprava pro tvorbu src.rpm pro testovací build
Na úvod můžeme začít stažením existujícího RPM z Git repositáře (.spec, patche a další soubory, které neobsahuje upstream balík):
cd ~/fedoraproject/ fedpkg clone ${PKGNAME} cd ${PKGNAME}
Zdrojové kódy vlastního balíku se v Gitu neudržují, musíme je stáhnout zvlášť:
fedpkg sources --outdir ${HOME}/rpmbuild/SOURCES/
Případně provedeme potřebné úpravy *.spec a dalších souborů:
vim ~/fedoraproject/${PKGNAME}/${PKGNAME}.spec
Vytvoříme src.rpm pro Fedoru, které můžeme následně využít pro testovací build pomocí mock nebo Koji:
DIST="fc17" SRPM="${PKGNAME}-${VERSION}-${RELEASE}.${DIST}.src.rpm" rpmbuild --define="dist .${DIST}" -bs ~/fedoraproject/${PKGNAME}/${PKGNAME}.spec && \ srcrpmpath=${BUILDPATH}/SRPMS/${SRPM}
Pokud vše proběhne správně, můžeme dále pracovat s nástroji Fedory (Git, Koji, Bodhi, ...).
Práce s fedpkg a git
Nyní můžeme projít celý proces od úvodního stažení balíku až k vytvoření nové verze.
Komentovaný postup pro větevmaster
Stažení Gitu do lokálního repositáře:
cd ~/fedoraproject/ fedpkg clone ${PKGNAME}
Nastavení pracovního adresáře:
cd ${PKGNAME}
Stažení zdrojáku:
fedpkg sources
Upload zdrojáku (v případě přidávání nějakých balíků nebo souborů). Pozor: je nutné spustit upload vždy pro všechny použité soubory, protože maže soubory uploadované dříve (předpokládá, že jsou již zastaralé):
fedpkg new-sources ${TARGZ}
Úprava souboru .spec:
vim ${PKGNAME}.spec
Testování lokálního překladu a tvorba balíku pomocí mock:
fedpkg mockbuild
Zkontrolovat, zda jsou změny správně:
fedpkg diff
Vytvořit soubor changelog:
fedpkg clog
Provést commit (s použitím souboru changelog):
fedpkg commit -F clog
A následný push:
fedpkg push
Spustit build pomocí Koji:
fedpkg build
Požádat o zařazení do updatů:
fedpkg update
Komentovaný postup pro další větve
Nastavení větve:
BRANCH="f18"
Změna větve:
fedpkg switch-branch $BRANCH
Promítnutí změn z větve master:
git merge master
Pokud se neobjeví problém, provést následný push:
fedpkg push
Build:
fedpkg build
A update:
fedpkg update
Automatizovaný postup pro další větve
Promítnutí změn do ostatních větví ve skriptu:
for dist in f17 f18 ; do fedpkg switch-branch $dist git merge master && fedpkg push fedpkg build done
Ukázka složitější varianty
Promítnutí změn do ostatních větví ve skriptu (pro Cherokee je potřeba pro el4/5 nahrát navíc zdroj pro OpenSSL):
fedpkg switch-branch el5 vim cherokee.spec fedpkg new-sources ${TARGZ} openssl-1.0.0d.tar.gz fedpkg diff fedpkg clog fedpkg commit -F clog fedpkg push fedpkg build fedpkg switch-branch el4 git merge el5 && fedpkg push fedpkg build
Vytvoření žádosti o update
Vytvoření žádosti o update (pomocí Bodhi), pro každou větev je potřeba vytvořit popis updatu, ukázka jeho obsahu níže:
for dist in f17 f18 ; do fedpkg switch-branch $dist fedpkg update done
Ukázka obsahu popisu updatu – společná část pro všechny větve. Je vhodné ho jednou vytvořit a vkládat pokaždé, když se spustí editace nabízeného textu:
# bugfix, security, enhancement, newpackage (required) type=bugfix # testing, stable request=stable # Bug numbers: 1234,9876 bugs=710474,713307,680691 # Description of your update notes=Latest 1.2.x upstream release .spec corrections for optional build for systemd Resolves bz 710474 Resolves bz 713307 Resolves bz 680691 # Enable request automation based on the stable/unstable karma thresholds autokarma=True stable_karma=3 unstable_karma=-3 # Automatically close bugs when this marked as stable close_bugs=True # Suggest that users restart after update suggest_reboot=False
Následně vrátit Git do větve master:
fedpkg switch-branch master
Po uplynutí požadovaného časového úseku pro testování (výchozí je 14 dní) nebo po dosažení požadované karmy (výchozí je 3), tj. pozitivních reakcí od testerů, je možné update poslat do stabilní větve:
for dist in f17 f18 ; do bodhi -R stable ${PKGNAME}-${VERSION}-${RELEASE}.${dist} done
Seznam užitečných příkazů pro fedpkg a git
Na závěr připojuji okomentovaný seznam užitečných příkazů.
Kontrola stavu repositáře:
git gui
Přidání nového souboru do Gitu:
git add ${PKGNAME}.service
Vytvoření souboru s komentářem pro commit ze souboru .spec:
fedpkg clog
Commit změn do lokálního repositáře:
fedpkg commit -F clog
Odeslání změn do centrálního repositáře:
fedpkg push
Spustit build pomocí Koji:
fedpkg build
Požádat o zařazení do updatů:
fedpkg update
Řešení konfliktů v Gitu:
git mergetool
Upload src.rpm do Koji:
fedpkg import ${HOME}/rpmbuild/SRPMS/cherokee-1.0.20-1.fc14.src.rpm
Upload tar.gz do Koji (varianta):
fedpkg new-sources ${HOME}/rpmbuild/SOURCES/cherokee-1.0.20.tar.gz
Commit src.rpm s komentářem:
fedpkg commit -p -m "Initial import (1.0.20)."