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)."