packaging
Toto je starší verze dokumentu!
Obsah
Tvorba RPM/DEB balíčků
RPM
- je potřeba vytvořit .spec soubor
- je potřeba spustit rpmbuild a mít připravené prostředí
- úplně základní informace zde
- rpmbuild potřebuje buildovací prostředí (většinou v cestě /usr/src/redhat, nebo nekdy ~/rpmbuild)
- SPECS - obsahuje spec-soubory, které řídí vlastní sestavování RPM balíku.
- SOURCES - zde jsou zdrojové soubory, ze kterých se balík vytváří (zpravidla tar.gz)
- BUILD - do tohoto adresáře se rozbalí zdrojové soubory a probíhá zde kompilace.
- RPMS/architektura - sem se uloží výsledné RPM soubory.
- SRPMS - zde budou výsledné zdrojové RPM soubory.
- prostředí lze předefinovat pomocí proměných například v konfiguračním souboru
$ cat ~/.rpmmacros
%_topdir /home/jamatos/
%_tmppath /tmp/rpmbuild
%_builddir %{_tmppath}
%_rpmtopdir %{_topdir}/build/%{name}
%_sourcedir %{_rpmtopdir}
%_specdir %{_rpmtopdir}
%_rpmdir %{_rpmtopdir}
%_srcrpmdir %{_rpmtopdir}
Příklad "rychle na prasáka"
- mám složku se zdrojáky s fungujícím ./configure + make
- chci udělat jednou jeden binární balíček
- jako uživatel mám omezené oprávnění, nemůžu zapisovat do /usr/src/redhat
- vytvořím .spec soubor
Summary: Balicek na rychlo
Name: balicek-prvni
Version: 1.0
Release: 0
Source: none
Copyright: GPL
Group: Utilities/System
%description
Tohle je muj balicek
%prep
%build
%configure
make OPTIM="$RPM_OPT_FLAGS"
%install
%makeinstall PREFIX=$RPM_BUILD_ROOT install
%files
%{_bindir}
%{_datadir}
- do sekce files je potřeba vypsat všechny soubory, které se přidaly voláním make install. Lze použít uvedená makra
- spuštění tvorby baličku
BASEDIR=`pwd`
mkdir -p build/{root,BUILD}
cp -ra projekt/* build/BUILD/
chmod +x build/BUILD/configure
rpmbuild --buildroot=$(BASEDIR)/build/root --define="_builddir $(BASEDIR)/build/BUILD" --define="_rpmdir $(BASEDIR)/build/" -bb balicek-prvni.spec
- výsledné rpm najdu ve složce build
Příklad "na slušňačku"
- příklad jednoduchého spec
Summary: Bblablablabla
Name: balicek-prvni
Version: 1.0
Release: 0
Source: projekt-src.tar.gz
Copyright: GPL
Group: Utilities/System
%description
Tohle je muj balicek
%prep
%setup
%build
make OPTIM="$RPM_OPT_FLAGS"
%install
make PREFIX=$RPM_BUILD_ROOT install
%files
%{_bindir}
%{_datadir}
- zapojení do Makefile
# pripravi adresarovy strom a nastaveni pro RPM
rpmbuildenv:
mkdir -p ~/rpmbuild/{BUILD,RPMS/x86_64,SOURCES,SPECS,SRPMS}
(echo "%_topdir ~/rpmbuild";echo "%_prefix /usr/local/") >> ~/.rpmmacros
rpm:
cp -ra zdrojaky zdrojaky-tmp
chmod +x zdrojaky-tmp/configure
# odstraneni info o svn, pokud tam je
find zdrojaky-tmp -name '.svn'|xargs rm -rf
tar czf zdrojaky-tmp.tgz zdrojaky-tmp
# pokud je lokalni RPM build prostredi tak do nej supnu balicky a spec file (dodelat)
[ -d ~/rpmbuild/SOURCES ] && cp -f zdrojaky-tmp.tgz ~/rpmbuild/SOURCES
all: rpmbuildenv rpm
jak probiha upgrade
Hence, the order of operations during an upgrade is:
- Run the %pre section of the RPM being installed.
- Install the files that the RPM provides.
- Run the %post section of the RPM.
- Run the %preun of the old package.
- Delete any old files not overwritten by the newer version. (This step deletes files that the new package does not require.)
- Run the %postun hook of the old package.
A taky pozor na instalaci vice balicku najednou, chova se to trochu jinak. Hromadny upgrade (rpm -Uvh *) nejspis funguje takto:
- a) u vsech balicku spusti pre-install
- b) u vsech balicku provede install
- c) u vsech balicku spusti post-install
- *) pak se teprve dela pre/post uinstall
Pořadí, ve kterém se bude spouštět pre-install není asi dopředu známo. Pokud jsou balíčky závislé na sobě, je dobré využít trigger skripty (%triggerin, %triggerun, %triggerpostun)
malé velké rady
- post skripty nesmí failovat!! balíček je už totiž nainstalovaný. Pokud balíček přeci jen skončí s fail, zůstavají v systému dvě verze balíčku. Musí se to opravit ručně.
- navratová hodnota posledního příkazu v post/pre skriptech se bere jako návratová hodnota celého skriptu. Nejlepší je tam psát exit 0 jako pojistku
distribuce dočasných install souborů
- Narazil jsem na problém. Mám rpm balíček pro aplikaci, která potřebuje v databázi určitá schémata. Mám skript a soubor s sql importem. Jak to správně zabalíčkovat? Skript i sql soubory potřebuji jen pro instalaci, pak už ne.
- RPM na tento problém nemá ideální řešení. Možnosti jsou:
- vložit skript a sql přímo do .spec souboru (třeba do %pre). Velikost spec souboru je limitovaná!! Navíc se ukládá do rpm databáze, takže to u větších skriptů/sql není ideální
- při buildu balíčku naimportovat sql do databáze a distribuovat pak binární soubor databáze. Tohle řešení lze ale použít jen pro čistý install. Upgrade se pak řeší komplikovaně.
- dedikovat na cílovém stroji adresář pro skripty/sql. Soubory tam normálně nahrát přes %files. Soubory se nesmí smazat, aby nevzniknul problém. Tohle je asi nejlepší varianta.
- označit dočasné soubory ve %files jako %config(missingok). Po použití je lze smazat. Není to ale úplně správné řešení, protože se config se správně používá jen pro konfigurační soubory
zdroje:
packaging.1484648050.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)
