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 [email protected]: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