GNU/Linux >> Znalost Linux >  >> Linux

Další tipy pro balení vašeho linuxového softwaru pomocí RPM

Pokud používáte Red Hat Enterprise Linux (RHEL) nebo Fedoru, brzy zjistíte, že používáte dnf (nebo yum ) k instalaci softwarových balíčků. Red Hat Package Manager (RPM) je nejdůležitější nástroj pro správu softwaru v těchto distribucích Linuxu. Tento článek ukazuje, jak můžete využít výhod tohoto rámce k distribuci vlastních aplikací.

Doufejme, že jste měli možnost přečíst si článek Valentina Bajramiho na stejné téma. Zopakuji zde některé ze stejných pojmů a ilustruji několik problémů, se kterými se můžete během cesty setkat. Použiji také dva složitější příklady a identifikuji několik problémů, které můžete objevit při balení nativních aplikací.

Tento článek ukazuje, jak určit, jak zkompilovat a zabalit vlastní nativní aplikaci pro distribuci. V navazujícím článku vysvětlím, jak zabalit aplikace třetích stran, které nemají balíček RPM, nebo pokud ano, chcete si jej přizpůsobit.

Předpoklady zahrnují:

  • Máte základní znalosti o tom, jak používat RPM k dotazování na balíčky a instalaci nebo mazání balíčků. Pokud ne, seznamte se nejprve s těmito koncepty a pak se sem vraťte a pobavte se.
  • Máte nainstalované Make, Git, GCC a Java, protože je budete potřebovat k dokončení zde uvedených cvičení. Není to povinné, ale bylo by hezké, kdybyste cvičili, když se pohybuji.

Chcete-li nainstalovat Make, GCC, Java 11 a Git pomocí správce balíčků DNF, spusťte:

$ sudo dnf install \
make gcc-10 java-11-openjdk-headless git 

Zabalte si svůj vlastní software pomocí RPM

Tento článek pro tento krok používá malý open source projekt nazvaný jdumpertools.

Na linuxovém terminálu naklonujte jdumpertools a poté jej zkompilujte (nainstalovali jste Make a kompilátor GCC, že?):

$ git clone [email protected]:josevnz/jdumpertools.git
$ cd jdumpertools
$ make all

$ ls -l jdu jutmp *.so
-rwxrwxr-x 1 josevnz josevnz 32728 Oct  3 16:40 jdu
-rwxrwxr-x 1 josevnz josevnz 32752 Oct  3 16:40 jutmp
-rwxrwxr-x 1 josevnz josevnz 29024 Oct  3 16:40 libjdumpertools.so 

Poté můžete spustit libovolný z vygenerovaných programů. Zkuste například jdu (jednodušší verze du příkaz, který vytiskne výsledky ve formátu JSON):

$ LD_LIBRARY_PATH=$PWD $PWD/jdu /
[{"partition": "/", "free_space": 462140129280.000000, "total_space": 510405902336.000000}] 

Zatím je to dobré.

Soubor jdumpertools.spec v tomto adresáři je soubor specifikace RPM, který řídí, jak kompilovat a zabalit jdumpertools pomocí RPM.

Dále nainstalujte několik podpůrných nástrojů, než přejdete k vytváření souboru RPM.

Instalujte stavební bloky RPM

Získejte potřebné rpmdevtools nástroje spuštěním:

$ sudo dnf install rpm-build rpmdevtools 

Poté připravte karanténu pro vytváření RPM pomocí rpmdevtools . Pro tento krok nikdy nepoužívejte root, ale svůj osobní nebo vývojářský linuxový účet (předá -d příznak ladění):

$ rpmdev-setuptree -d
josevnz       /home/josevnz    /home/josevnz/.rpmmacros
/home/josevnz/rpmbuild/RPMS    /home/josevnz/rpmbuild/SOURCES     /home/josevnz/rpmbuild/SPECS
/home/josevnz/rpmbuild/SRPMS   /home/josevnz/rpmbuild/BUILD 

Tady je hezčí pohled:

$ tree ~/rpmbuild
/home/josevnz/rpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

5 directories, 0 files, 0 souborů 

Právě teď musíte věnovat pozornost pouze dvěma adresářům:SOURCES a SPECS . Ostatní vysvětlím později.

Existuje také nový soubor s názvem ~/.rpmmacros . Můžete tam vložit nebo přepsat některá speciální makra, abyste se vyhnuli opakujícím se úlohám při sestavování RPM balíčků. Tento soubor je důležitý, protože ukotvuje rpmbuild prostředí s vaším domovským adresářem.

Zabalte si aplikaci

Nejprve vytvořte tar soubor zdrojového kódu v ~/rpmbuild/SOURCES adresář:

VERSION=v0.1
NAME=jdumpertools
TARFILE=$(NAME)-$(VERSION).tar.gz
/usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME) 

Normálně tar obsahuje skripty a zdrojový kód, který zkompilujete v rámci procesu balení.

Dále vytvořte spec RPM soubor. Opět rpmdevtools poskytuje náskok, jako je tento:

$ rpmdev-newspec ~/rpmbuild/jose-package.spec
/home/josevnz/rpmbuild/jose-package.spec created; type minimal, rpm version >= 4.16.

$ cat  ~/rpmbuild/jose-package.spec
Name:           jose-package
Version:        
Release:        1%{?dist}
Summary:        

License:        
URL:            
Source0:        

BuildRequires:  
Requires:       

%description

%prep
%autosetup

%build
%configure
%make_build

%install
rm -rf $RPM_BUILD_ROOT
%make_install


%files
%license add-license-file-here
%doc add-docs-here

%changelog
* Sun Oct 03 2021 Jose Vicente Nunez <[email protected]>
-  

Nedělejte si starosti, pokud nyní tomuto souboru nerozumíte. Zkopírujte soubor jdumpertools.spec soubor do ~/rpmbuild/SPECS adresář:

$ cp -pv jdumpertools.spec ~/rpmbuild/SPECS 

A vytvořte zdrojový a binární soubor RPM:

$ rpmbuild -ba rpmbuild/SPECS/jdumpertools.spec
setting SOURCE_DATE_EPOCH=1609718400
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.kBlIwO
+ umask 022
+ cd /home/josevnz/rpmbuild/BUILD
+ cd /home/josevnz/rpmbuild/BUILD
+ rm -rf jdumpertools
+ /usr/bin/gzip -dc /home/josevnz/rpmbuild/SOURCES/jdumpertools-v0.1.tar.gz
+ /usr/bin/tar -xof -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd jdumpertools
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ RPM_EC=0
[...]
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64
Wrote: /home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.uEyCyL
+ umask 022
+ cd /home/josevnz/rpmbuild/BUILD
+ cd jdumpertools
+ rm -rf /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64
+ RPM_EC=0
++ jobs -p
+ exit 0 

Konečným výsledkem jsou dva soubory:zdrojové RPM a binární RPM.

Wrote: /home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm 

Co se stane během instalace RPM

Co se tedy stane, když nainstalujete každý z vašich vlastních RPM?

  1. Instalací zdrojového RPM vytvoří tar a spec soubor ve vašem rpmbuild adresář. To vám umožní znovu zkompilovat aplikaci, provést opravy RPM spec soubor atd.
    $ ls rpmbuild/{SPECS,SOURCES}
    rpmbuild/SOURCES:
    jdumpertools-v0.1.tar.gz
    
    rpmbuild/SPECS:
    jdumpertools.spec 
  2. Pokud nainstalujete binární RPM, pak ve skutečnosti instalujete aplikaci:
    $ sudo rpm -ihv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm
    Verifying...                ################ [100%]
    Preparing...                ################ [100%]
    Updating / installing...
       1:jdumpertools-v0.1-1.fc33  ################ [100%] 
  3. Potvrďte, že nainstalovaný balíček je přítomen: $ rpm -qi jdumpertools Name        : jdumpertools Version     : v0.1 Release     : 1.fc33 Architecture: x86_64 Install Date: Sun 03 Oct 2021 06:32:50 PM EDT Group       : Unspecified Size        : 95002 License     : Apache License 2.0 Signature   : (none) Source RPM  : jdumpertools-v0.1-1.fc33.src.rpm Build Date  : Sun 03 Oct 2021 06:27:11 PM EDT Build Host  : dmaf5.home URL         : https://github.com/josevnz/jdumpertools Summary     : Programs that can be used to dump Linux usage data in JSON format. Description : Jdumpertools is a collection of programs used to dump Linux usage data in JSON format to be ingested by other tools. * jdu: Similar to UNIX 'du' command. * jutmp: UTMP database dumper

Poznámka :Zvědaví čtenáři pravděpodobně otevřeli Makefile a viděl cíl nazvaný rpm :

rpm: all
    test -x /usr/bin/rpmdev-setuptree && /usr/bin/rpmdev-setuptree|| /bin/mkdir -p -v ${HOME}/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
    /usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)
    /usr/bin/rpmbuild -ba jdumpertools.spec 

Toto je pohodlná zkratka pro přípravu rpmbuild sandbox, tar soubory poté, co jsou zkompilovány pomocí make a zabalte je pomocí rpmbuild příkaz. Neváhejte a zavolejte make rpm a uvidíte, co se stane.

[ Získejte další tipy stažením cheatu pro skriptování prostředí Bash. ]

Ukázal jsem vám příkazy a nástroje používané k generování soubory RPM, ale nyní je čas zapsat spec RPM soubor.

Vytvořte soubor specifikací pro nástroje jdumper

Práce se soubory specifikací vyžaduje vyplnění několika značek metadat a také popis toho, jak aplikaci zkompilujete nebo zabalíte. Jdumpertools je jednoduchá aplikace ANSI C, takže rozbalte zdrojové kódy, zkompilujte je a zkopírujte je do mezilehlé oblasti (~/rpmbuild/BUILDROOT ) a poté je zabalte k distribuci.

Nejprve se podívejte na soubor specifikace RPM:

Name:           jdumpertools
# TODO: Figure out a better way to update version here and on Makefile
Version:        v0.1        
Release:        1%{?dist}
Summary:        Programs that can be used to dump Linux usage data in JSON format. 

License:        Apache License 2.0
URL:            https://github.com/josevnz/jdumpertools
Source0:        %{name}-%{version}.tar.gz

BuildRequires:  bash,tar,gzip,rpmdevtools,rpmlint,make,gcc >= 10.2.1
Requires:       bash

%global debug_package %{nil}

%description

Jdumpertools is a collection of programs you can use to dump Linux usage data in JSON format to be ingested by other tools.

* jdu: Similar to UNIX 'du' command.
* jutmp: UTMP database dumper

%prep
%setup -q -n jdumpertools

%build
make all

%install
rm -rf %{buildroot}
/usr/bin/mkdir -p %{buildroot}/%{_bindir}
/usr/bin/cp -v -p jdu jutmp %{buildroot}/%{_bindir}
/usr/bin/mkdir -p %{buildroot}/%{_libdir}
/usr/bin/cp -v -p libjdumpertools.so %{buildroot}/%{_libdir}

%clean
rm -rf %{buildroot}

%files
%{_bindir}/jdu
%{_bindir}/jutmp
%{_libdir}/libjdumpertools.so
%license LICENSE
%doc README.md


%changelog
* Mon Jan  4 2021 Jose Vicente Nunez <[email protected]> - 0.1
- First version being packaged 

Přečtěte si, co je důležité zde:

  • Metadata, včetně verze, názvu a zdroje0; můžete použít proměnné nebo makra
  • Rozbalte zdroje v %prep pomocí %setup makro (průvodce RPM má spoustu podrobností o příznakech)
  • Vyžaduje sestavení :Musíte uvést závislosti, které potřebujete k sestavení balíčku. Tyto nelze dynamicky detekovat.
  • %sestavení sekce:Kompilace pomocí make
  • %install sekce:Zkopírujte, co potřebujete, aby program fungoval (program, knihovny atd.)
  • %souborů sekce:Kde můžete určit, zda je soubor dokumentem (%doc ), licenční soubor (% licence ), nebo běžný soubor

Také důležité:

  • Zakázal jsem vytváření ladicího kódu během balení pomocí %global debug_package %{nil} .
  • changelog dokumentuje, co se s touto novou verzí balíčku změnilo.

Zkontrolujte chyby v souboru spec pomocí rpmlint

Nechcete tvrdě zjišťovat, že vaše RPM nejsou dokonalé. Proto je dobré zkontrolovat zjevné chyby nebo způsoby, jak zlepšit své RPM:

$ sudo dnf install rpmlint 

Nyní zkontrolujte spec RPM soubor:

$ rpmlint /home/josevnz/rpmbuild/SPECS/jdumpertools.spec 
/home/josevnz/rpmbuild/SPECS/jdumpertools.spec: W: invalid-url Source0: jdumpertools-v0.1.tar.gz
0 packages and 1 specfiles checked; 0 errors, 1 warnings. 

Dokumentace rpmlint říká, že Source0 musí být dobře definovaná adresa URL (hodnota by měla být platná veřejná adresa URL HTTP, HTTPS nebo FTP). S tímto varováním si nedělejte starosti.

A co samotné RPM?

$ make rpm
...
$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
jdumpertools.x86_64: W: summary-ended-with-dot C Programs that can be used to dump Linux usage data in JSON format.
jdumpertools.x86_64: W: spelling-error %description -l en_US du -> dew, doe, Du
jdumpertools.x86_64: E: description-line-too-long C Jdumpertools is a collection of programs that can be used to dump linux usage data in JSON format, so it can be ingested by other tools.
jdumpertools.x86_64: W: incoherent-version-in-changelog 0.1 ['v0.1-1.fc33', 'v0.1-1']
jdumpertools.x86_64: W: invalid-license Apache License 2.0
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/bin/jdu
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/bin/jutmp
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/lib64/libjdumpertools.so
jdumpertools.x86_64: W: no-soname /usr/lib64/libjdumpertools.so
jdumpertools.x86_64: W: no-manual-page-for-binary jdu
jdumpertools.x86_64: W: no-manual-page-for-binary jutmp
1 packages and 0 specfiles checked; 1 errors, 10 warnings. 

Deset varování a jedna chyba. Některé lze snadno opravit:

  • Licence musí mít konkrétní formát
  • Pro programy jsou vyžadovány manuálové stránky, takže jsem napsal velmi jednoduchou s troff
  • Zahrňte soname do knihovny

Po opravách zůstane pouze jedno varování:

$ make rpm
...
$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm 
jdumpertools.x86_64: W: spelling-error %description -l en_US du -> dew, doe, Du
The value of this tag appears to be misspelled. Please double-check. 

Toto varování vás upozorňuje, že slovo du se zdá být špatně napsáno. Je to však pouze odkaz na platný příkaz, takže můžete varování ignorovat.

Nyní upgradujte RPM vylepšenou verzí:

$ sudo rpm -Uhv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm 

Používám rpm příkaz, aby bylo jasnější, že jsem upgradoval balíček z verze místního disku místo nové verze z úložiště. Pokud chcete, můžete totéž udělat s dnf :

$ sudo dnf install --upgrade \
~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm 

Co jste se naučili a co bude dál

Balicí software s RPM vypadá zpočátku děsivě, ale s trochou trpělivosti se k tomu dostanete během okamžiku. Když narazíte na problémy, najdete také správné způsoby, jak zlepšit svůj kód. Níže jsou uvedeny některé zdroje a závěrečná doporučení:

  • Udělejte si velkou laskavost a získejte výtisk RPM Packaging Guide od Adama Millera, Maxima Svistunova a Marie Doleželové. Je velmi kompletní a dobře organizovaná. Vážně, udělej to hned; je to tak dobré.
  • Oficiální příručka RPM Packaging Guide a příručka Fedora RPM jsou také plné podrobností; mějte je jako záložku.
  • Použijte rpmlint. Budete překvapeni, kolik drobností dokážete zachytit a opravit před odesláním svých RPM balíčků.
  • Nestačí? Fedora má seznam triků, které můžete použít při balení softwaru.
  • Stále jste zvědaví? Určitě byste se měli podívat na pokyny pro balení RPM.

Linux
  1. 4 tipy, jak získat starší příbuzné online s Linuxem

  2. Zjistěte více o svém systému Linux pomocí inxi

  3. Nejlepší software pro malování pro Linux

  1. 3 tipy pro tisk s Linuxem

  2. Tipy a triky pro použití CUPS pro tisk s Linuxem

  3. Průvodce pro začátečníky ke správě softwaru Linux s RPM

  1. 5 tipů, jak začít se zabezpečením serveru Linux

  2. Nakonfigurujte DNS pomocí příkazu Linux, vytvořte laboratoř za pět minut a další tipy pro systémové správce

  3. 10 nejlepších Linuxových vzdělávacích programů pro vaše děti