Packit [1] je příkaz, který Vám pomůže zautomatizovat balíčkování Vašich upstreamových projektu do Fedory. Ale co to ve skutečnosti znamená?
Jako vývojář, byste rádi přidali nebo aktualizovali Váš balíček ve Fedoře. Pokud jste toto již v minulosti dělali, víte, že to není jednoduchá úloha. A pokud ne, pak se budu opakovat: Není to jednoduchá úloha.
A to je přesně úloha, kde packit může pomoci: s jedním konfiguračním souborem ve Vašem upstreamovém repositáři bude packit automaticky balíčkovat Váš software do Fedory a aktualizovat jej jako aktualizujete Váš zdrojový kód v upstreamu.
Nicméně, packit dokáže vykonávat ještě následující úlohy:
- Synchronizovat downstream změny zpět do upstream repozitář - toto může být použitelné pokud se změní SPEC souboru ve Fedora repozitářích a rádi byste měli SPEC file up2date v upstream repozitářích.
- Jednoduché sestavení SRPM balíčku na základě upstreamového repositáře - který může být použit pro sestavení RPM balíčku v COPRu.
- Další je status příkaz - poskytuje informace o upstream a downstream repozitářích, jako Pull Requesty, Release a další.
- Build - vytvoří build Vašeho projektu ve Fedora build system - koji.
- Create-update - vytvoří update v Bodhi pro danou branch
Instalace
Packit lze nainstalovat na Fedoru příkazem dnf:
sudo dnf install -y packit
Konfigurace
Pro demonstrační účely packitu jsem vybral balíček colin a jeho upstream repozitář [2]. Colin je tool, který kontroluje obecná pravidla a best-practises for kontejnery, docker soubory a kontejner obrazy.
Prvně potřebujeme naklonovat colin git repozitář:
$ git clone https://github.com/user-cont/colin.git $ cd colin
Packit očekává, že veškeré operace budou spouštěny v kořenovém adresáři gitového repozitáře.
Packit [3] potřebuje určité informace o upstream projektu, které zde musí být uloženy v souboru .packit.yaml [4].
Podívejme se jak takový konfigurační soubor pro colina vypadá:
$ cat .packit.yaml specfile_path: colin.spec synced_files: -.packit.yaml - colin.spec upstream_project_name: colin downstream_package_name: colin
Co jednotlivé hodnoty znamenají?
- specfile_path - relativní cesta ke SPEC souboru v upstream repozitáři. Hodnota je POVINNÁ
- synced_files - seznam relativních cest souborů v upstream repozitáři, které budou kopírovány do dist-gitu během updatu
- upstream_project_name - jméno upstream repositáře (e.g. na PyPI); Toto je použito v %prep sekci ve SPEC souboru
- downstream_package_name - jméno balíčku ve Fedoře. Položka je POVINNÁ
Pro více informací ohledně packit konfigurace se podívejte zde: [5].
Co můžete s packitem dělat?
Než začneme packit používat je potřeba mít pracovní adresář s naklonovaným našim upstream projektem.
Před spuštěním packit je potřeba vykonat několik akcí. Tyto akce jsou důležité pro vytváření PR v upstream nebo downstream repozitářích a mít přístup do Fedora dist-git repozitářů.
Exportovat GitHub token, který získáme z https://github.com/settings/tokens:
$ export GITHUB_TOKEN=
Získání kerberos tiketu, který je potřeba pro Fedora Account System (FAS) :
$ kinit@FEDORAPROJECT.ORG
Exportovat Vaše Pagure API klíče získáné z https://src.fedoraproject.org/settings#nav-api-tab:
$ export PAGURE_USER_TOKEN=
Packit také potřebuje token forku balíčku pro vytvoření Pull Requestu. Token získáme z https://src.fedoraproject.org/fork/YOU/rpms/PACKAGE/settings#apikeys-tab
Tuto akci provedeme příkazem:
$ export PAGURE_FORK_TOKEN=
Další možnost je uložit všechny tokeny do souboru ~/.config/packit.yaml:
$ cat ~/.config/packit.yaml github_token:pagure_user_token: pagure_fork_token:
Synchronizace nové upstream verze balíčku do Fedory
Hlavní příkaz packitu slouží pro synchronizaci vydaných nových releasů. Packit tento příkaz nazývá propose-update
[6]. Příkaz vytvoří nový Pull Request ve Fedora dist-git repozitáři buďto podle vybrané upstream verze nebo poslední vydané verze.
$ packit propose-update INFO: Running 'anitya' versioneer Version in upstream registries is '0.3.1'. Version in spec file is '0.3.0'. WARNING Version in spec file is outdated Picking version of the latest release from the upstream registry. Checking out upstream version 0.3.1 Using 'master' dist-git branch Copying /home/vagrant/colin/colin.spec to /tmp/tmptfwr123c/colin.spec. Archive colin-0.3.0.tar.gz found in lookaside cache (skipping upload). INFO: Downloading file from URL https://files.pythonhosted.org/packages/source/c/colin/colin-0.3.0.tar.gz 100%[=============================>] 3.18M eta 00:00:00 Downloaded archive: '/tmp/tmptfwr123c/colin-0.3.0.tar.gz' About to upload to lookaside cache won't be doing kinit, no credentials provided PR created: https://src.fedoraproject.org/rpms/colin/pull-request/14
Jakmile příkaz úspěšně skončí, můžeme vidět PR ve Fedora Pagure instanci, která je založena na základě poslední upstreamové verze. Jakmile je PR ověřen maintanerem, lze jej mergnout.
Synchronizace downstream změn zpět do upstream repozitáře
Jedním z dalších užitečných příkazů je synchronizace downstream změn zpět do upstreamového repositáře.
V packitu je pro tento účel příkaz sync-from-downstream
. [7] Soubory, které se mají synchronizovat do upstreamového repositáře jsou zmíněny v packit.yaml konfiguračním souboru pod položkou synced_files.
$ packit sync-from-downstream WARNING dist_git_url is no longer being processed, it is generated from dist_git_base_url and downstream_package_name upstream active branch master using "master" dist-git branch Copying /tmp/tmplvxqtvbb/colin.spec to /home/vagrant/colin/colin.spec. Creating remote fork-ssh with URL git@github.com:phracek/colin.git. Pushing to remote fork-ssh using branch master-downstream-sync. PR created: https://github.com/user-cont/colin/pull/229
Jakmile packit dokončí tento příkaz, v upstream repozitáři můžete vidět Pull Request, jehož změny jsou brány z Fedora dist-git repozitáře.
Toto může být použitelné zejména například, když Release Engineering vytváří tzv. mass-rebuild a upravuje SPEC soubory ve Fedora dist-git repozitářích.
Jaký je stav upstream projektu
Pokud jste vývojář, pak byste možná ocenili příkaz, jak získat informace o posledních releasech, tazích, pull requestech apod. z upstream a downstream repozitáře. Packit má pro tento účel příkaz status
, který dané informace získá a zobrazí uživateli.
$ packit status Downstream PRs: ID Title URL ---- -------------------------------- --------------------------------------------------------- 14 Update to upstream release 0.3.1 https://src.fedoraproject.org//rpms/colin/pull-request/14 12 Upstream pr: 226 https://src.fedoraproject.org//rpms/colin/pull-request/12 11 Upstream pr: 226 https://src.fedoraproject.org//rpms/colin/pull-request/11 8 Upstream pr: 226 https://src.fedoraproject.org//rpms/colin/pull-request/8 Dist-git versions: f27: 0.2.0 f28: 0.2.0 f29: 0.2.0 f30: 0.2.0 master: 0.2.0 GitHub upstream releases: 0.3.1 0.3.0 0.2.1 0.2.0 0.1.0 Latest builds: f27: colin-0.2.0-1.fc27 f28: colin-0.3.1-1.fc28 f29: colin-0.3.1-1.fc29 f30: colin-0.3.1-2.fc30 Latest bodhi updates: Update Karma status ------------------ ------- -------- colin-0.3.1-1.fc29 1 stable colin-0.3.1-1.fc28 1 stable colin-0.3.0-2.fc28 0 obsolete
Vytvoření SRPM
V neposlední řadě by rád developer vytvořil SRPM balíček na základě současného upstream git repozitáře. Packit poskytuje pro tento případ příkaz srpm
.
$ packit srpm Version in spec file is '0.3.1.37.g00bb80e'. SRPM: /home/phracek/work/colin/colin-0.3.1.37.g00bb80e-1.fc29.src.rpm
Packit jako služba
V létě 2019, rádi bychom uvolnili packit jako službu [8]. V tomto případě, bude do upstream repositáře nainstalována GitHub aplikace a packit bude vykonávat akce automaticky na základě událostí od GitHubu či fedmsg.
Odkazy
[1] https://packit.dev/
[2] https://github.com/user-cont/colin
[3] https://github.com/packit-service/packit/
[4] https://github.com/packit-service/packit/blob/master/docs/configuration.md#projects-configuration-file
[5] https://github.com/packit-service/packit/blob/master/docs/configuration.md
[6] https://github.com/jpopelka/packit/blob/master/docs/propose_update.md
[7] https://github.com/jpopelka/packit/blob/master/docs/sync-from-downstream.md
[8] https://github.com/packit-service/packit-service